Overview
Many SOA Suite 11g deployments include the use of
the technology adapters for various activities including integration
with FTP, database, and files to name a few. Although the
integrations with these adapters are easy and feature rich, there can
be some challenges from the operations perspective. One of these
challenges is how to correlate a logical business transaction across
SOA component instances. This correlation is typically accomplished
via the execution context ID (ECID), but we lose the ECID correlation
when the business transaction spans technologies like FTP, database,
and files.
A new feature has been introduced in the Oracle
adapter JCA framework to allow the propagation of the ECID. This
feature is available in the forthcoming SOA Suite 11.1.1.7 (PS6). The basic concept of
propagating the ECID is to identify somewhere in the payload of the
message where the ECID can be stored. Then two Binding Properties,
relating to the location of the ECID in the message, are added to
either the Exposed Service (left-hand side of composite) or External
Reference (right-hand side of composite). This will give the JCA
framework enough information to either extract the ECID from or add
the ECID to the message. In the scenario of extracting the ECID from
the message, the ECID will be used for the new component instance.
Where to Put the ECID
When trying to determine where to store the ECID
in the message, you basically have two options:
Add
a new optional element to your message schema.
Leverage an existing element that is not used
in your schema.
The best scenario is that you are able to add the
optional element to your message since trying to find an unused
element will prove difficult in most situations. The schema will be
holding the ECID value which looks something like the following:
11d1def534ea1be0:7ae4cac3:13b4455735c:-8000-00000000000002dc
Configuring Composite Services/References
Now that you have identified where you want the
ECID to be stored in the message, the JCA framework needs to have
this information as well. The two pieces of information that the
framework needs relates to the message schema:
The namespace for the element in the message.
The XPath to the element in the message.
To better understand this, let's look at an
example for the following database table:
When an Exposed Service is created via the
Database Adapter Wizard in the composite, the following schema is
created:
For this example, the two Binding Properties we
add to the ReadRow service in the composite are:
<!-- Properties for the binding to propagate the ECID from the database table -->
<property name="jca.ecid.nslist" type="xs:string" many="false"> xmlns:ns1="http://xmlns.oracle.com/pcbpel/adapter/db/top/ReadRow"</property>
<property name="jca.ecid.xpath" type="xs:string" many="false"> /ns1:EcidPropagationCollection/ns1:EcidPropagation/ns1:ecid</property>
Notice that the property called jca.ecid.nslist
contains the targetNamespace
defined in the schema and the property called jca.ecid.xpath
contains the XPath statement to the element. The XPath statement also
contains the appropriate namespace prefix (ns1)
which is defined in the jca.ecid.nslist
property.
When the Database Adapter service reads a row from
the database, it will retrieve the ECID value from the payload and
remove the element from the payload. When the component instance is
created, it will be associated with the retrieved ECID and the
payload contains everything except the ECID element/value. The only
time the ECID is visible is when it is stored safely in the resource
technology like the database, a file, or a queue.
Simple Database/File/JMS Example
This section contains a simplified example of how
the ECID can propagate through a database table, a file, and JMS
queue. The composite for the example looks like the following:
The flow of this example is as follows:
Invoke
database insert using the insertwithecidbpelprocess_client_ep
Service.
The
InsertWithECIDBPELProcess
adds a row to the database via the Database Adapter. The JCA
Framework adds the ECID to the message prior to inserting.
The ReadRow
Service retrieves the record and the JCA Framework extracts the ECID
from the message. The ECID element is removed from the message.
An instance of ReadRowBPELProcess
is created and it is associated with the retried ECID.
The
ReadRowBPELProcess
now writes the record to the file system via the File Adapter. The
JCA Framework adds the ECID to the message prior to writing the
message to file.
The
ReadFile Service retrieves the record from the file system and the
JCA Framework extracts the ECID from the message. The ECID element
is removed from the message.
An
instance of ReadFileBPELProcess
is created and it is associated with the retried ECID.
The
ReadFileBPELProcess
now enqueues the message via the JMS Adapter. The JCA Framework adds
the ECID to the message prior to enqueuing the message.
The DequeueMessage
Service retrieves the record and the JCA Framework extracts the ECID
from the message. The ECID element is removed from the message.
An
instance of DequeueMessageBPELProcess
is created and it is associated with the retried ECID.
The logical flow ends.
When viewing the Flow Trace in the Enterprise
Manger, you will now see all the instances correlated via ECID:
Please check back here when SOA Suite 11.1.1.7 is
released for this example. With the example you can run it yourself and
reinforce what has been shared in this blog via a hands-on
experience. One final note: the contents of this blog may be
included in the official SOA Suite 11.1.1.7 documentation, but you will still need
to come here to get the example.