Those of us writing
Java/J2EE applications are commonly asked to interface with other
applications we don't control. Sometimes, these are other custom
applications written and managed by other teams. Sometimes, these
are vended applications. Often, these applications are on a different
platform (e.g. .Net) and sometimes not even designed to be integrated
easily with custom applications. I refer to these types of interfaces
as external [application] interfaces. External
interfaces like these are usually an unpleasant source of support
issues. There are ways Java architects can design external
interfaces so that they minimize these support headaches and the
resources needed to support them.
The key to a minimizing
support for external interfaces is insulating your Java applications
from them. That is, limit and contain the number of direct
dependencies between your Java applications and 3rd party
applications. The insulation strategy I usually use is depicted in
the graphic below. As an example 3rd party application,
let's use a document management system (DMS). This type of product
is frequently purchased (or provided open source) and not custom
built. Furthermore, there are several DMS vendors and the
possibility that an organization may want to upgrade the DMS product
or change DMS vendors is always a possibility.
Figure 1 |
Establish a
generic operational data store for needed external application data.
This data store will be the source of external application data for
all your custom Java applications. This means that your Java
applications do not need to understand internals of the external
application. Your Java applications will not be affected if the
external application is upgraded or enhanced. Consider a DMS as an
example. DMS product upgrades happen no matter which vendor you
choose. Using this strategy, your Java applications will not be
affected by product upgrades; only the extracts populating the data
store might be.
The operational
data store must be vendor neutral. That is, your operational
data store should not contain vendor-specific tables or fields. You
should be able to populate the operational data store from a
different product without changing it. You should be able to upgrade
the external product without changing this data store. In the case
of a DMS, you might have Document and Document_Type tables. However,
no fields or tables should be specific to the DMS you are using.
Only populate
data needed by your custom applications. The only purpose of
the operational data store is to insulate your custom applications
from external product changes and upgrades. To copy data not needed
by your applications is just making work for no benefit. You can
always enhance the data store if new requirements arrive.
Establish a
generic Java API to process actions and information updates.
The classes and methods in this API must be vendor neutral so that
your Java applications are not affected by product upgrades and
changes. Of course, the code supporting the API will need to adapt
to changes in the underlying external application. Using a DMS as an
example, you might have a generic Document interface with methods
like “addDocument()” and the like. This API should be
product-neutral.
Record all
actions and information updates for the interface API. For
example, if the DMS product exposes functionality via web services,
I'll record the SOAP request and response texts for each API call.
Should a defect be reported, support developers will have information
they need to contact the vendor right away.
I hope you find this
strategy useful. As always, your input is welcome.
No comments:
Post a Comment