<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2583565177075565132</id><updated>2011-11-28T00:35:29.618+01:00</updated><category term='ORACLE'/><category term='B2B'/><category term='JMS'/><category term='XML debatching BPEL'/><category term='Integration B2B'/><category term='Rejection handler'/><category term='BPEL'/><category term='AQ'/><title type='text'>Oracle Consulting Netherlands Integration Community</title><subtitle type='html'>This blog is maintained by members of the SOA and Integration community working for Oracle Consulting Netherlands.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oraintpc.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oraintpc.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Marc Kelderman SOA Blog</name><uri>http://www.blogger.com/profile/13131001868435096782</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_QolFV9VBHas/S7EDmKUKjvI/AAAAAAAAAKE/deuLFDqhBKw/S220/MySelfSmall.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2583565177075565132.post-6290567215418264931</id><published>2008-08-15T15:39:00.001+02:00</published><updated>2008-08-15T15:39:36.313+02:00</updated><title type='text'></title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;Although there’s a bunch of stuff out there about transaction handling, bpel and esb, see copied links for a start, it still took me some time to figure out who to get it to work..&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;So, I’ll just add one to the number of blogs / discussions out there&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;The goal is to have a bpel process that calls two ESB services. If the second fails, the first should be rolled back.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;I have two ESB services. These two ESB services both consist of a routing service in front of a Database adapter service. Both DB adapter services write a record to the database. The first write always is ok, the second should fail.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;The BPEL process calls both ESB services as a partner link, within a scope S1.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;Crucial in the bpel.xml are the transaction property and the preferredPort properties on both partnerlink definitions, and also the transaction property in the configurations section. This “configurations” section you need to add yourself in a text editor.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;The preferredPort you can get from the ESB Routing service WSDL. Look for the esb binding port&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&amp;lt;?xml version = '1.0' encoding = 'UTF-8'?&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&amp;lt;BPELSuitcase&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;BPELProcess id="testTransactionBPEL" src="testTransactionBPEL.bpel"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span lang="NL"&gt;&amp;lt;partnerLinkBindings&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span style="" lang="EN-US"&gt;&amp;lt;partnerLinkBinding name="client"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;property name="wsdlLocation"&amp;gt;testTransactionBPEL.wsdl&amp;lt;/property&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span lang="NL"&gt;&amp;lt;/partnerLinkBinding&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;         &lt;/span&gt;&amp;lt;partnerLinkBinding name="PL1"&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt;           &lt;/span&gt;&amp;lt;property name="wsdlLocation"&amp;gt;http://mysoa.com:7777/esb/wsil/DefaultSystem/Insert1?wsdl&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="" lang="EN-US"&gt;&amp;lt;property name="transaction"&amp;gt;participate&amp;lt;/property&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;property name="preferredPort"&amp;gt;__esb_Insert1_execute_ppt&amp;lt;/property&amp;gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;span style=""&gt;         &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span lang="NL"&gt;&amp;lt;/partnerLinkBinding&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;         &lt;/span&gt;&amp;lt;partnerLinkBinding name="PL2"&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;property name="wsdlLocation"&amp;gt;http://mysoa.com:7777/esb/wsil/DefaultSystem/Insert2?wsdl&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="" lang="EN-US"&gt;&amp;lt;property name="transaction"&amp;gt;participate&amp;lt;/property&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;property name="preferredPort"&amp;gt;__esb_Insert2_execute_ppt&amp;lt;/property&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span lang="NL"&gt;&amp;lt;/partnerLinkBinding&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;         &lt;/span&gt;&amp;lt;partnerLinkBinding name="HelloRandstad"&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;property name="wsdlLocation"&amp;gt;http://mysoa.com:7777/orabpel/default/HelloWorld/HelloWorld?wsdl&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;         &lt;/span&gt;&amp;lt;/partnerLinkBinding&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;/partnerLinkBindings&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="NL"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="" lang="EN-US"&gt;&amp;lt;configurations&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;property name="transaction"&amp;gt;participate&amp;lt;/property&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;/configurations&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span lang="NL"&gt;&amp;lt;/BPELProcess&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&amp;lt;/BPELSuitcase&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;The drawback of this is that you also lose your instance. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;You can workaround this by adding an exception handling section to the bpel process on the scope S1. In the exception handling you call some bpel error handling / registration process. In my case I just called a version of the HelloWorld process. Then, after this call you throw a bpelx:rollback. The rollback section you just add in the text editor.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;faultHandlers&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;catchAll&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;sequence name="Sequence_1"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;invoke name="Invoke_3" partnerLink="HelloWorld"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;                &lt;/span&gt;portType="ns9:HelloWorld" operation="process"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;                &lt;/span&gt;inputVariable="Invoke_3_process_InputVariable"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;                &lt;/span&gt;outputVariable="Invoke_3_process_OutputVariable"/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;throw name="Throw" faultName="bpelx:rollback"/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;/sequence&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/catchAll&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;/faultHandlers&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;The result, you have no inserts in the database, no instance of the actual bpel process, but a HelloWorld instance. This shows you something went wrong.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2583565177075565132-6290567215418264931?l=oraintpc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/6290567215418264931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/6290567215418264931'/><link rel='alternate' type='text/html' href='http://oraintpc.blogspot.com/2008/08/although-theres-bunch-of-stuff-out.html' title=''/><author><name>Jan Willem Portengen</name><uri>http://www.blogger.com/profile/10619946305519798217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-2583565177075565132.post-3467231530157677059</id><published>2007-11-20T10:09:00.000+01:00</published><updated>2007-11-20T10:11:19.978+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='B2B'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration B2B'/><title type='text'>Business Process extension with Integration B2B</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }   H1 { margin-bottom: 0.08in }   H1.western { font-family: "Helvetica"; font-size: 16pt }   H1.cjk { font-family: "AR PL ShanHeiSun Uni"; font-size: 16pt }   H1.ctl { font-family: "Tahoma"; font-size: 16pt }   H3 { margin-bottom: 0.08in }   H3.western { font-family: "Helvetica" }   H3.cjk { font-family: "AR PL ShanHeiSun Uni" }   H4 { margin-bottom: 0.08in }   H4.western { font-family: "Helvetica"; font-size: 11pt; font-style: italic }   H4.cjk { font-family: "AR PL ShanHeiSun Uni"; font-size: 11pt; font-style: italic }   H4.ctl { font-size: 11pt; font-style: italic }  --&gt;  &lt;/style&gt;  &lt;h1 class="western"&gt;Business Process extension with Integration B2B&lt;/h1&gt; &lt;h3 class="western"&gt;Introduction&lt;/h3&gt; &lt;p&gt;Already for a few years Enterprises are aware of the need of Application Integration. The days we build large integrated Custom Development Application are behind us (although I know of some exceptions). Enterprises tend more and more to choose for standard application suites. But it is an illusion to think a company could do with only one integrated standard application suite. A company certainly has special business needs it has to full fill with other applications, that can be standard commercial ones or custom developed applications. So there is a need to application integration.  &lt;/p&gt; &lt;p&gt;The integration discussion is also grown to the business level with Process Integration and Service Oriented Architecture (SOA). It is not only about synchronizing data between applications (data integration) or exchanging business events (as in Enterprise Application Integration). A company has a business process that has to be executed and preferably in an agile way controlled by a business process manager that merely call services of applications instead of control applications or be controlled by an application. Like in SOA. This way the Business Process can be modeled in a way that suites best with the companies business model but can be adapted according to changed insights of the business model or changes in the marketplace. It then can support business process optimization. But also it opens the possibility to extend the business process over the boundaries of the organization.  &lt;/p&gt; &lt;p&gt;Conventionally companies exchange data by ftp-ing large datafiles to each other once in a while. Batch processes have to read and process the file and execute different functions for each record in the file. These functions can be seen as services that should be called on message driven basis. These messages could be received from a trading partner on ad-hoc basis and should lead to an invocation of certain parts of the Business Process as a Business Event.&lt;/p&gt; &lt;p&gt;However, a company does not want to open up his business process for just every individual in the evil kosmos.  Only the trading partners that it does business with and probably not every business partner may assert every service, raise every possible business event. Also not every business partner support every protocol. Some do ftp, some do http. Some do EDI-documents, some do Custom documents. Some even do some highlevel business protocols like Rosettanet.&lt;/p&gt; &lt;p&gt;Another thing a company wants abstract of is the  guarantee of the delivering. When companies exchange files of multiples of data-records, they have to decide how to handle faults in the processing of individual records. Does that lead to the withdrawal of the complete datafile and thus rolling back the correctly processed data records? Or does the delivering partner receives a list of only disapproved records? With a message driven solution a company has to be sure that a message has been delivered correctly. When it has an acknowledgment of the delivery of the message it should not care any more about the processing of the message. Only when the message turns out to be faulty it should get a functional notification of disapproval of the message. It should not bother about the delivery.&lt;/p&gt; &lt;p&gt;A B2B product like Integration B2B takes care of the certainty of delivery of messages. A backoffice raises a business action for a trading partner to Integration B2B and Integration B2B will deliver the message to the partner using the right protocol. It handles the acknowledgments and if needed the resending of a message at time-outs for a predefined maximum number of times. Also it signs and/or encrypts the messages using certificates. But everything provided that it is according to the agreement that is defined between the two partners. So it disapproves business messages send by or send to trading partners when they are not defined in the agreement or when the agreement is not valid on the current date. For the backoffice a business message can be considered as a Business Event, in B2B terms called a business action. Doing so, Integration B2B provide a means of delivering configurable services that can be called within a Business Process or that call or invoke a Business Process.  &lt;/p&gt; &lt;h3 class="western"&gt;When to use Integration B2B&lt;/h3&gt; &lt;p&gt;When to use Integration B2B, ESB or Webservices? Why use Integration B2B when one can also create a Webservice that is secured by authentication? Or why create webservices while it is also possible to define an ESB service that calls an application interface using an adapter?&lt;/p&gt; &lt;p&gt;All three approaches provide a means to extend the business process to interact with a trading partner. Although there is overlap between the approaches in terms of functionality, they're not the same and certainly have their functions.&lt;/p&gt; &lt;h4 class="western"&gt;Webservices&lt;/h4&gt; &lt;p&gt;In a Service Oriented Architecture it is about services. But a service is not per definition a Webservice. A webservice is in fact a manner of exposing a service based on industry standards. It enables the service to be called regardless of technology. The technology that calls the service can be totally different and also on a geographically very different location as the called service. I would dare to state that a webservice should be no more than a wrapper around a service. I think it is a best practice to separate the implementation of the service and the exposure of the service as a webservice, even if the implementation and the exposure are using the same technology. But that is a different discussion.&lt;/p&gt; &lt;p&gt;Webservices can be secured using industry standards on authentication and authorization. Also the data exchange can be encrypted for example using SSL.  &lt;/p&gt; &lt;p&gt;But webservices have to be created per exchange. Ok, a webservice can support multiple operations, described in the WSDL (Webservice Description Language) document. But every operation have to be programmed and made available through the WSDL.  &lt;/p&gt; &lt;p&gt;Another disadvantage is that a Webservice in nature is a request/response operation. Although a webservice can be synchronous or asynchronous, the request and the response is closely related. With a synchronous webservice the response comes as a result of the request in one operation. With an asynchronous webservice the webservice calls the requesting client back with the response. But as described in the WSDL the client expects one certain response and has to trust that the webservice will come with that response. There are no means of guaranteeing message delivery and also no means of doing a retry if the response is not received within a certain amount of time. These mechanisms have to be build around the webservice exchange. The same counts for juridical protocols that state that a request should be followed by an acknowledgment of receipt as well as a response message.&lt;/p&gt; &lt;p&gt;Also there are no means of Trading partner management, controlling what actions a certain partner may call during a certain period. Of course there are tools that fill that gap (like Oracle Webservice Manager).&lt;/p&gt; &lt;h4 class="western"&gt;ESB&lt;/h4&gt; &lt;p&gt;The ESB is an integration tool that can pick up events that are raised in various ways. Events can be raised by placing a file in a directory, enqueueing a message on a queue, updating data in a database or a webservice call. Adapters exist for picking up these technical events but also for events in specific standard Applications. On these events various actions can be subscribed that can be actually one or more of the counterparts of the events named above. So interfaces in packaged applications can be called, database updates can be done, messages enqueued on queues (AQ, JMS, MQ Series, etc.), files can be created or webservices can be called. Also BPEL Processes can be called to perform more complex processing. The flexibility and the publish subscribe features of ESB make it possible to integrate with trading partners or expose webservices on specific services in the applications of a trading partner, even without programming a line of code.&lt;/p&gt; &lt;p&gt;But it lacks of more complex protocol handling. It is aimed for internal application to application integration (A2A), but for doing authentication and  authorization other means have to be put in place (like Oracle Webservice Manager, OWSM). And complexer business protocol handling have to be coded.&lt;/p&gt; &lt;h4 class="western"&gt;Integration B2B&lt;/h4&gt; &lt;p&gt;With Integration B2B it is possible to send messages over multiple protocols and define which protocol to be used for a certain business action for a trading partner. A trading partner can be defined with its capabilities, that define which business actions it can receive or initiate. Also the particular communication channels can be defined for each trading partner. A communication channel can be file,  SMTP or HTTP(S). The corresponding servers, authentication, Signing and Encryption certificates and parameters can be defined.  &lt;/p&gt; &lt;p&gt;An agreement defines which supported business action a tradingpartner may initiate or receive within the validity-period of the agreement. Integration B2B will not except a business action that is initiated by a tradingpartner that is not defined within a valid agreement. Integration B2B takes care of the guaranteed delivery of messages over a predefined communication channel for a certain trading partner. Provided that the protocol supports the guaranteed delivery of messages (like in ebXML). Also Integration B2B will sign and encrypt messages using certificates if defined.&lt;/p&gt; &lt;p&gt;This can be defined using a UI in a declarative way. No line of code have to be programmed. Of course the backoffice have to be coupled to Integration B2B. The backoffice applications should be able to deliver messages to Integration B2B using its internal delivery channel. For Integration B2B the preferred internal delivery channel is AQ. So when an application (this can be ESB or BPEL PM, but also custom developed functionality) can enqueue a message on the queue, Integration B2B can send it. Using BPEL PM a message can be send without coding anything.  &lt;/p&gt; &lt;h3 class="western"&gt;Supported Protocols, Standards and certification&lt;/h3&gt; &lt;p&gt;Integration B2B supports an extensive list of protocols, standards. Below the protocols that I could find in a datasheet of B2B.&lt;/p&gt; &lt;table style="color: rgb(0, 0, 0);" border="1" cellpadding="4" cellspacing="0" width="100%"&gt;  &lt;col width="44*"&gt;  &lt;col width="76*"&gt;  &lt;col width="43*"&gt;  &lt;col width="34*"&gt;  &lt;col width="59*"&gt;  &lt;tbody&gt;&lt;tr valign="top"&gt;   &lt;td width="17%"&gt;    &lt;p&gt;&lt;span style="font-size:85%;"&gt;Industry Standards &lt;/span&gt;    &lt;/p&gt;   &lt;/td&gt;   &lt;td width="30%"&gt;    &lt;p&gt;&lt;span style="font-size:85%;"&gt;Documents &lt;/span&gt;    &lt;/p&gt;   &lt;/td&gt;   &lt;td width="17%"&gt;    &lt;p&gt; &lt;span style="font-size:85%;"&gt;Message formats &lt;/span&gt;    &lt;/p&gt;   &lt;/td&gt;   &lt;td width="13%"&gt;    &lt;p&gt;&lt;span style="font-size:85%;"&gt;Transports&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="23%"&gt;    &lt;p&gt;&lt;span style="font-size:85%;"&gt;Exchanges&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="17%"&gt;    &lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;EDI &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;UCCnet &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;RosettaNet &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;CIDX &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;PIDX &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;VICS &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;ebXML &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;UBL &lt;/span&gt;     &lt;/p&gt;    &lt;/li&gt;&lt;/ul&gt;   &lt;/td&gt;   &lt;td width="30%"&gt;    &lt;ul&gt;&lt;li value="1"&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;UBL &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;UN/EDIFACT &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;X12 &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;X12 Property &amp;amp; Casualty &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;X12 HIPAA &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p style="margin-right: 0in;"&gt;&lt;span style="font-size:85%;"&gt;X12 HIPAA External     code list &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;X12N Life &amp;amp; Annuity &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;X12N Healthcare &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;NCPDP SCRIPT &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;HL7 &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;OAG &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;cXML &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;xCBL &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;DTD &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;W3C XML Schema &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;Custom &lt;/span&gt;     &lt;/p&gt;    &lt;/li&gt;&lt;/ul&gt;   &lt;/td&gt;   &lt;td width="17%"&gt;    &lt;ul&gt;&lt;li value="1"&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;MIME &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;SMIME &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;XMLDSig &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;XMLEncrypt &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;SOAP &lt;/span&gt;     &lt;/p&gt;    &lt;/li&gt;&lt;/ul&gt;   &lt;/td&gt;   &lt;td width="13%"&gt;    &lt;ul&gt;&lt;li value="1"&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;File &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;FTP &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;FTPS &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;HTTP &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;HTTPS &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;SMTP &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;TCP / IP&lt;/span&gt;&lt;/p&gt;    &lt;/li&gt;&lt;/ul&gt;   &lt;/td&gt;   &lt;td width="23%"&gt;    &lt;ul&gt;&lt;li value="1"&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;AS2 &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;ebMS &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt; &lt;span style="font-size:85%;"&gt;RNIF &lt;/span&gt;     &lt;/p&gt;     &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;MLLP &lt;/span&gt;     &lt;/p&gt;    &lt;/li&gt;&lt;/ul&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Integration B2B is certified on several protocols by accredited instances. For example the Drummond group certified Integration B2B on ebXML.&lt;/p&gt; &lt;p&gt;The ebXML standard is a very useful protocol that supports encryption and signing and uses SOAP over Http to exchange messages. It supports reliable messaging using acknowledgments and an configurable number of retries with configurable time to acknowledge. Since it supports any kind of message the specific transformation of the message can be handled within Integration B2B or outside using the transformation capabilities of ESB or BPEL PM.&lt;/p&gt; &lt;h3 class="western"&gt;Where to put in the Integration Architecture&lt;/h3&gt; &lt;p&gt;How to couple Integration B2B with the backoffice? What topologies to use? Since a tool as Integration B2B can be considered as just another application in the business's IT-landscape there are several topologies that can be used to integrate a B2B tool with the backoffice.  &lt;/p&gt; &lt;h4 class="western"&gt;Tightly coupled&lt;/h4&gt; &lt;p&gt;The preferred internal delivery channel of Integration B2B is AQ. So a database oriented application could directly enqueue out-going messages in the out-queue of B2B and consume in-comming messages from the In-queue. A java-application could use the Oracle AQJms interfaces to produce and/or consume messages to B2B. Also a file based coupling is supported. However such a tight coupling is not recommended. It will lead to problems in routing the messages internally between the message handling business processes and/or the different applications a business uses.&lt;/p&gt; &lt;p&gt;When each application that uses the gateway has it's own set of businessactions with the remote tradingpartners it is possible to couple each application in this way with Integration B2B. But there are minor capabilities to route messages over the applications. Actually the only way is define each application as a partner in the agreemeents with the remote tradingpartners. Each application should then have it's own Routing ID, an application specific code that the remote tradingpartner have to denote on sending a message. Then the remote tradingpartner must have “knowledge” about the internal applications of the business. When the business decides to change the business process for example by migrating applications to a standard application suite, the remote tradingpartner is needed to change his process too.  &lt;/p&gt; &lt;p&gt;Recommended is to have a setup that no matter how messages are processed internally, which applciation is handling certain messages, the remote trading partner should have only one Routing ID. To the outside world the company should be exposed as one tradingpartner.&lt;/p&gt; &lt;h4 class="western"&gt;Using EAI/SOA&lt;/h4&gt; &lt;p&gt;This is the recommended topology. An EAI environment Integration B2B is considered as a spoke of the EAI tool. In a SOA environment the different Business Actions defined in Integration B2B are considered as seperate services. By this means an abstraction layer is build between Integration B2B and the backoffice. Actually Integration B2B is an extra application that supports the extension of the business processes over the boundaries of the business. So that each other application or each separate business process can make use of it. Routing over the different applications can be done within the business processes of a Process Manager like BPEL PM or using publish/subscribe mechanisms of an ESB. Since different business processes and applications send and receive messages over the same infrastructure, project-collisions should be considered. When there is a clear separation of business actions over the different processes and applications problems are little. But when there is a overlap in used businessactions then the scenarios have to be thought over carefully and tested thoroughly. Also if one project is responsible for implementing the Integration B2B infrastructure and is also on the overall critical path of all running projects, other projects can be stressed. The other projects can't get their interactions implementated.&lt;/p&gt; &lt;h4 class="western"&gt;Routing Service&lt;/h4&gt; &lt;p&gt;In spite of my recommendations above there are several reasons to separate the different applications within an enterprise and connect them to Integration B2B independly. It can be that the internal processes are to separate. Or for projectmanagement reasons it is not wise to incorporate them into one. For example for planning or scoping reasons. In that case you should provide a means of routing incoming messages over the different applications and/or processes. Sometimes that is easy when there is no overlap (see the section about tightly coupling). But it might be that different applications or processes have the same interactions. A routing service can then solve the problem. A routing service is a piece of functionality that receives incoming messages and route them over the different applications. For a product like Integration B2B that uses AQ as an internal Delivery channel this service can be a quite easy Pl/Sql service in the database, that is subscribed (see documentation on Pl/Sql Callback notifications in Oracle Streams AQ) on the in-queue of Integration B2B. To do the job properly the service should also be responsible of receiving out going messages of the internal applications to be send via Integration B2B. The reason for this is that the main algorithm for doing the routing is to try to couple an incoming message to an earlier send outgoing message. For the routing four types of routing rules can be defined:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;On In-reply-to message id: when a message is a response on an  earlier outgoing message this is denoted by supplying the id of the  request message as an in-reply-to-message-id. When the Routing  Service processes the outgoing request message it can store that in  a message-table related to the application that send the message.  When an incoming messages refers to that message using the id, the  routing service can query on the message table with that id. When  the request message is found the response message can be routed to  the corresponding application. This should be a 100% match for  respons messages: when a request-message cannot be found the trading  partner probably provided an invalid in-reply-to-message-id.&lt;br /&gt;An  additional requirement for this kind of routing is that the  different applications should use mutually exclusive message id  ranges to get enterprise wide unique message-id's.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;On Business Action/Document type: when no  in-reply-to-message-id is provided the routing service can check the  Business Action or Document Type definitions. The Document Type  definitions describe for ebXML messages the ebMS header attributes  (the envelop). When a Business action/Document Type combination only  exist for one application a routing rule of this type can denote the  application to route to for that particular Business Action/Document  type.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;On content based routing: for outgoing messages rules can be  defined that have xpath-expressions to extract  identification-information from the outgoing message and store that  in the Routing Service's repository referring to the outgoing  message. For incoming messages the same mechanism can provide an  identification code that can be looked up in the repository. Finding  an outgoing message this way lead to the application to route to.  This is a type of routing that is especially useful for incoming  messages on ad-hoc-basis, provided that they relate to particular  cases (for example order-id's) in the content. An additional  requirement (like in-reply-to-routing) is the need for enterprise  wide unique identification expressions.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h4 class="western"&gt;Multi-hop&lt;/h4&gt; &lt;p&gt;Integration B2B contains functionality to function as a hop. This is useful in ebXML based infrastructures. A tradingpartner sends messages to other tradingpartners. But instead of communicating directly to the transport-server of the tradingpartner it connects to the Hop. The Hop (a central B2B implementation) reads the envelop and concludes that the message is not adressed to him. So it will forward the message to the transport server that it considers to be the transportserver of the addressed tradingpartner. This can in fact be another Hop. The chain of hops can  be any number, provided that each hop has a correct configuration routing-definitions.  &lt;/p&gt; &lt;p&gt;This configuration is especially useful in those wide-area networks where each trading partner has its own set of firewalls, etc. Using a central hop centralizes the complexity. Only the hop has to know the addresses of each firewalled transportserver of the tradingpartners. Each tradingpartner only need to know how to connect to the hop. If a ping to the hop succeed, each other tradingpartner can be reached through the hop.&lt;/p&gt; &lt;p&gt;This topology is not useful within an enterprise to connect applications using ebXML. That does not make sense. Doing that is comparable of having UPS deliver your reports from your desk to the desk of your colleague in the room next door. It is still needed to create interfaces to Integration B2b and to write the messages and produce them on a queue and consume from another queue. This has to be done  for each application within the enterprise. Also n+1 implementations of Integration B2B is needed, one for each application and one extra for the hop. This is very expensive, where one (quite simple) implementation of AQ or ESB would suffice.&lt;/p&gt; &lt;h4 class="western"&gt;Oracle EBS's XML Gateway&lt;/h4&gt; &lt;p&gt;Integration B2B has an internal delivery channel especially for use with XML Gateway of EBS. This is exist for backward compatibility. This can be useful for those EBS implementations where EBS is the core application of the company and no other applications have to be coupled to B2B. Mark that this is actually an implementation of the first topology mentioned: tightly coupled. This can suffice for a company but keep in mind that there is nothing as permanent as a temporary solution! And nothing changes as much as requirements, not even the weather.  So requirements may read that in no hundred years another application have to interact with that same tradingpartner using the same interactions. And within a year after going live the first exception is defined. But once an application is coupled tightly to Integration B2B and interfaces are build, it is not very likely that the program management chooses to break it up and introduce a ESB or EAI tool in between. That's why I don't recommend this and see a combination with SOASuite (or comparable middleware solution) as the preferred topology.&lt;/p&gt; &lt;h3 class="western"&gt;Conclusion&lt;/h3&gt; &lt;p&gt;Business to Business integration is growing in importance. And there are several ways to integrate with Trading partners. But it is very important to think about how to integrate the B2B-gateway within the internal business's integration. Consider that a company's partners are part of his business process. So it's best practice to consider a B2B-Business action as a Business Service.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;i&gt;Martien van den Akker&lt;br /&gt;Integration Specialist&lt;br /&gt;Oracle Netherlands&lt;/i&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2583565177075565132-3467231530157677059?l=oraintpc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/3467231530157677059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/3467231530157677059'/><link rel='alternate' type='text/html' href='http://oraintpc.blogspot.com/2007/11/business-process-extension-with.html' title='Business Process extension with Integration B2B'/><author><name>Martien van den Akker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_myrkQ5dyTYg/SumoQRjDiqI/AAAAAAAACNY/vz6mJ0PTT5w/S220/MartienInStoomtreinAnduze2009.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2583565177075565132.post-7924507984414281642</id><published>2007-11-06T19:36:00.000+01:00</published><updated>2007-11-06T19:47:11.599+01:00</updated><title type='text'>How to set up an SSL test environment with OC4J and Oracle BPEL</title><content type='html'>Recently, I needed to configure a SSL test environment configured with a self-signed certificate, a Oracle BPEL process for the SSL client and a EJB3 HelloWorld service secured with SSL. As an Oracle employee the choice for a (standalone) OC4J as the server container should be evident.&lt;br /&gt;&lt;br /&gt;This post is hopefully a step by step tutorial to configure this SSL test environment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;OC4J container&lt;/span&gt;&lt;br /&gt;- Download and install a standalone OC4J container version 10.1.3.3 from &lt;a href="http://otn.oracle.com"&gt;OTN&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Developing a HelloWord EJB3 service&lt;/span&gt;&lt;br /&gt;- Use the EJB3 session bean wizard in JDeveloper 10.1.3.x to generate the skeleton code for you HelloWorld service. Make sure that you also generate a webservice interface.&lt;br /&gt;- Add a simple HelloWorld method to your bean implemention and add this method signature to the webservice interface as well. The method will now be exposed as a webservice operation when&lt;br /&gt;deployed to the OC4J container.&lt;br /&gt;- Add &lt;a href="http://jcp.org/en/jsr/detail?id=181"&gt;JSR-181&lt;/a&gt; annotation to webservice interface to configure the webservice wsdl. Here's an example that I used:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package nl.oracle.com.ssl;&lt;br /&gt;&lt;br /&gt;import java.rmi.Remote;&lt;br /&gt;&lt;br /&gt;import javax.jws.WebMethod;&lt;br /&gt;import javax.jws.WebParam;&lt;br /&gt;import javax.jws.WebService;&lt;br /&gt;&lt;br /&gt;import oracle.webservices.annotations.Deployment;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@WebService(name="HelloWorldWS",&lt;br /&gt;            targetNamespace="http://ejb.oracle.com/targetNamespace",&lt;br /&gt;            serviceName="HelloWorldWSService")&lt;br /&gt;@Deployment(contextPath="ejb-ws",&lt;br /&gt;            uriPath="HelloWorldWS",&lt;br /&gt;            portName="HelloWorldService")&lt;br /&gt;&lt;br /&gt;public interface HelloWorldEJBWebService extends Remote {&lt;br /&gt;    &lt;br /&gt;    @WebMethod&lt;br /&gt;    public void helloWorld(@WebParam(name="input") String in);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After finishing the implementation cycle you generate a deployement descriptor and deploy it to your just installed OC4J container. Verify that you can access the webservice and test it with the &lt;em&gt;Test Webservice&lt;/em&gt; functionality.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Configure OC4J for SSL&lt;/span&gt; &lt;br /&gt;(look &lt;a href="http://download.oracle.com/docs/cd/B25221_04/web.1013/b14429/configssl.htm"&gt;here&lt;/a&gt; for more info)&lt;br /&gt;&lt;br /&gt;First, we need to generate a self-signed certificate and put it in a new keystore. Use the &lt;a href="http://java.sun.com/j2se/1.3/docs/tooldocs/win32/keytool.html"&gt;keytool&lt;/a&gt; utility from java SDK.&lt;br /&gt;Generate a certificate using the following commando:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;keytool -genkey -alias oc4j-server -keyalg RSA -keypass welcome -storepass welcome -keystore c:\oc4jserver.jks&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You will be prompted for specific certificate information. YOU HAVE TO MAKE SURE THAT THE "FIRSTNAME/LASTNAME" question is answered with the hostname of the server on which you have installed the OC4J container (I used localhost, because the container is running on my laptop). This will overcome "wrong hostname" exceptions later on. &lt;br /&gt;&lt;br /&gt;Now you have a RSA encrypted certificate in the oc4jserver.jks keystore located in the root of your C drive.&lt;br /&gt;&lt;br /&gt;As a second step, we need to configure which web application we want to secure with SSL. Open the $ORACLE_HOME/j2ee/home/config/default-web-site.xml file&lt;br /&gt;and copy all the contents to $ORACLE_HOME/j2ee/home/config/secure-web-site.xml (create the file when it does not exist yet). Change the &lt;web-site&gt; element and make&lt;br /&gt;sure that it looks like the example below. Change where needed.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;web-site   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;                xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/web-site-10_0.xsd"&lt;br /&gt;                port="4443"&lt;br /&gt;                secure="true"&lt;br /&gt;                display-name="OC4J 10g (10.1.3) Default Web Site"&lt;br /&gt;                schema-major-version="10"&lt;br /&gt;                schema-minor-version="0" &amp;gt;&lt;br /&gt;            ...&lt;br /&gt;            &amp;lt;ssl-config keystore="c:\oc4jserver.jks" keystore-password="welcome" /&amp;gt;&lt;br /&gt;            ...&lt;br /&gt;    &amp;lt;/web-site&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Delete all the web-app entries except the helloworld entry and the default web application entry. Here is the one that I am using:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;web-site xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" &lt;br /&gt;xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/web-site-10_0.xsd"  &lt;br /&gt;port="4443" secure="true" display-name="OC4J 10g (10.1.3) Default Web Site" schema-major-version="10" schema-minor-version="0" &amp;gt; &lt;br /&gt; &amp;lt;default-web-app application="default" name="defaultWebApp" /&amp;gt;&lt;br /&gt;  &amp;ltweb-app application="helloworld" name="helloworld" load-on-startup="true" root="/ejb-ws" /&amp;gt;&lt;br /&gt; &amp;lt;access-log path="../log/default-web-access.log" split="day" /&amp;gt;&lt;br /&gt; &amp;lt;ssl-config factory="com.evermind.ssl.JSSESSLServerSocketFactory" keystore="d:/java-keystores/mykeystore.jks" keystore-password="welcome" truststore-password=""/&amp;gt;&lt;br /&gt;&amp;lt;/web-site&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As a final step we need to tell the OC4J instance that we have some SSL secured web applications add the following line to the server.xml (located under: $ORACLE_HOME/j2ee/home/config/):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;web-site path="./secure-web-site.xml" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Basically, we now have specified that the OC4J container should secure the HelloWorld webservice with SSL and using the certificate in the specified keystore. You can test this by going to the HTTPS url of the HelloWorld test service (change http to https and change the port to 4443 of the URL you used before).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Configuring JDeveloper and BPEL for the SSL HelloWorld service&lt;/span&gt;&lt;br /&gt;To be able to invoke the HelloWorld service over HTTPS we need to make sure that JDeveloper and the BPEL container trust the certificate. I assume that you have installed JDeveloper 10.1.3.x and a BPEL container (I have used a complete SOA Suite installation).&lt;br /&gt;&lt;br /&gt;First we have to export the certificate from the oc4j keystore:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;keytool -keystore c:\oc4jserver.jks -export -alias oc4jserver-server -file c:\oc4jserver.cer&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we have a trusted certificate &lt;em&gt;oc4jserver.cer&lt;/em&gt; that need to import in the keystore of JDeveloper and BPEL. The command examples will use the standard Java SDK keystore &lt;em&gt;cacerts&lt;/em&gt; and&lt;br /&gt;the default keystore password &lt;em&gt;changeit&lt;/em&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  keytool -keystore &amp;ltJDEV_HOME&amp;gt;\jdk\jre\lib\security\cacerts -import -file c:\oc4jserver.cer&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;Do the same for your BPEL installation.&lt;br /&gt;&lt;br /&gt;The SSL configuration is finished now. I leave the implementation of the BPEL process that invokes the HelloWorld service over HTTPS as an exercise for the reader :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2583565177075565132-7924507984414281642?l=oraintpc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/7924507984414281642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/7924507984414281642'/><link rel='alternate' type='text/html' href='http://oraintpc.blogspot.com/2007/11/how-to-set-up-ssl-test-environment-with.html' title='How to set up an SSL test environment with OC4J and Oracle BPEL'/><author><name>Tom Hofte</name><uri>http://www.blogger.com/profile/11228605775527929516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/83/8894/320/Afbeelding%20083.0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2583565177075565132.post-6075249981914418514</id><published>2007-10-14T19:38:00.000+02:00</published><updated>2007-10-14T19:45:24.589+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORACLE'/><category scheme='http://www.blogger.com/atom/ns#' term='JMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Rejection handler'/><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><category scheme='http://www.blogger.com/atom/ns#' term='AQ'/><title type='text'>In Action: Adapter Rejection Handlers in Oracle BPEL</title><content type='html'>In Oracle BPEL you can use several types (e.g. file, JMS or Oracle AQ) of technology adapters to activate a bpel process. This is done by using a BPEL receive task on a adapter partner link that is that actually is polling a file directory for specific files or is listening on a JMS or Oracle AQ queue for inbound messages.  In most cases the inbound message or file contains XML structured data or  data that needs to be translated to a custom native XML structure. In both cases the data must cohere to a defined structure otherwise the data cannot be translated to the XML type of the variable that the bpel process will use the store the message for later use. But what if the data doesn't cohere to the structure?&lt;br /&gt;&lt;br /&gt;The adapter will reject malformed messaged and will log a message and will store the rejected message in a default folder. In the BPM console you don't see any indication that a message has been rejected by the inbound adapter. So this is not very convenient for a production environment. The use of rejection handlers makes it possible to handle rejected messages in a proper way. A rejection handler must defined in bpel.xml with a adapter activation agent and only works for inbound bpel receive operations. Rejection handlers come in for different flavors:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;File based&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Oracle AQ based&lt;/li&gt;&lt;br /&gt;&lt;li&gt;BPEL process rejection handler&lt;/li&gt;&lt;br /&gt;&lt;li&gt;WSIF based&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;In this posting I will only discuss the BPEL process rejection handler. Please look here &lt;a href="http://www.oracle.com/technology/products/integration/adapters/pdf/Adapter_TN_004_Adapter_ErrorManagement.pdf"&gt;here&lt;/a&gt; for more information about the other three flavors.&lt;br /&gt;To use a bpel process rejection handler you have to define a bpel process that takes an input message of type &lt;em&gt;RejectedMessage&lt;/em&gt;. Like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;message name="RejectionMessage"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;part name="message" element="err:RejectedMessage"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/part&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The schema for this type is in the &lt;em&gt;rejectionmessage.wsdl&lt;/em&gt; file in the xmllib directory. In the wsdl file of your BPEL process you can just import this wsdl file and the appropriate partnerlink. E.g.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;definitions xmlns="http://schemas.xmlsoap.org/wsdl/" bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" tns="http://xmlns.oracle.com/pcbpel/rejectionHandler" xsd="http://www.w3.org/2001/XMLSchema" name="RejectionMessage" targetnamespace="http://xmlns.oracle.com/pcbpel/rejectionHandler"&gt;&lt;br /&gt;  &amp;lt;import location="http://genomw01:7777/Artifacts/RejectionMessage.wsdl" namespace="http://xmlns.oracle.com/pcbpel/rejectionHandler"&gt;&lt;br /&gt;  &amp;lt;plnk:partnerlinktype name="RejectionHandlerPortType_PL"&amp;gt;&lt;br /&gt;      &amp;lt;plnk:role name="RejectionHandlerPortType_Role"&amp;gt;&lt;br /&gt;          &amp;lt;plnk:porttype name="tns:RejectionHandlerPortType"&amp;gt;&lt;br /&gt;      &amp;lt;/plnk:porttype&amp;gt;&lt;br /&gt;  &amp;lt;/plnk:role&amp;gt;&lt;br /&gt;&amp;lt;/plnk:partnerlinktype&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this example BPEL wsdl definition file you can see that the wsdl is imported (a project copy is used here) and that &lt;em&gt;RejectionHandlerPortType&lt;/em&gt; is referenced here.&lt;br /&gt;&lt;br /&gt;In the RejectionHandler process you have now access to the rejection reason, payload of the reject message and many more useful attributes to show a proper error message to an administrator. For example, you can use your custom Error Hospital for further processing.&lt;br /&gt;&lt;br /&gt;The final things you have to do to make things work is adding an rejection handler property to the adapter activation agent in the bpel.xml file. E.g:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;activationagents&amp;gt;&lt;br /&gt;    &amp;lt;activationagent classname="oracle.tip.adapter.fw.agent.jca.JCAActivationAgent" partnerlink="DEQUEUE_DCS731_B2B_IP_IN_QUEUE"&amp;gt;&lt;br /&gt;      &amp;lt;property name="portType"&amp;gt;Dequeue_ptt&amp;lt;/property&amp;gt;&lt;br /&gt;      &amp;lt;property name="rejectedMessageHandlers"&amp;gt;bpel://default|JCARejectionHandler|handleRejection|message&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/activationagent&amp;gt;&lt;br /&gt;&amp;lt;/activationagents&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Just applying some small steps you are able to add more robustness to you inbound adapters so that malformed rejected message will eventually reach the system administrator that can decide how to deal with them. This sounds more convenient than scanning log files for possible rejected messages :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2583565177075565132-6075249981914418514?l=oraintpc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/6075249981914418514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/6075249981914418514'/><link rel='alternate' type='text/html' href='http://oraintpc.blogspot.com/2007/10/in-action-adapter-rejection-handlers-in.html' title='In Action: Adapter Rejection Handlers in Oracle BPEL'/><author><name>Tom Hofte</name><uri>http://www.blogger.com/profile/11228605775527929516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/83/8894/320/Afbeelding%20083.0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2583565177075565132.post-2731432054053345441</id><published>2007-09-14T13:08:00.000+02:00</published><updated>2007-10-18T12:36:02.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML debatching BPEL'/><title type='text'>XML Debatching in File / FTP adapter</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;With the release of patchset 10.1.3.3 for Oracle SOA Suite 10.1.3, some cool new features have been introduced that I would like to bring to your attention.&lt;/span&gt; &lt;span style="font-family:Arial;"&gt;Besides the long-awaited error-policy framework, we now also get the option to de-batch large XML files when polling them from a file or FTP location.&lt;/span&gt; &lt;span style="font-family:Arial;"&gt;Debatching has been an option for the File and FTP adapters for some time now, but was always restricted to native (flat) files (typically record-based layouts).&lt;/span&gt; &lt;span style="font-family:Arial;"&gt;Large XML files have always been a challenge to BPEL, because internally XML is loaded in a DOM tree, which takes a considerable amount of memory compared to the original size of the document in its text form.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:15;"  &gt;What does de-batching do?&lt;/span&gt;&lt;/b&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;Debatching polls for incoming files, and when it finds a file and starts reading it, it doesn't start a single new instance of a BPEL process and delivers the file contents, but instead it chops up the file in "batches" of configurable size (typically 1), and starts a new instance for each batch.&lt;/span&gt; &lt;span style="font-family:Arial;"&gt;So for a file of 1000 records (lines) and a batch size of 1, you will end up with 1000 new instances. There is no guarantee that these 1000 instances will be executed in order of the records in the original file, mind you. These instances will be processed by the pool of engine threads just like any other active instance.&lt;/span&gt; &lt;span style="font-family:Arial;"&gt;For XML, as part of the patch install instructions for the 10.1.3.3 &lt;/span&gt;&lt;a href="http://updates.oracle.com/ARULink/PatchDetails/process_form?patch_num=6148874"&gt;&lt;span style="font-family:Arial;"&gt;patchset&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Arial;"&gt;, you install a "stream-based" XML parser called STaX, which is well-known in the Java community.&lt;/span&gt; &lt;span style="font-family:Arial;"&gt;Instead of reading the whole file into main memory, the STaX parser just "browses" like a lexical scanner through the XML file and does not build large trees of objects in memory.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:15;"  &gt;How it works&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:15;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;To activate the de-batching behaviour of the adapter, you have to add the "PublishSize" attribute to the jca:operation tag in the adapter's wsdl:&lt;/span&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&amp;lt;jca:operation&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt; &lt;/span&gt;PhysicalDirectory="D:\"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt; &lt;/span&gt;ActivationSpec="oracle.tip.adapter.file.inbound.FileActivationSpec"&lt;br /&gt;&lt;span style=""&gt; &lt;/span&gt;DeleteFile="true"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt; &lt;/span&gt;IncludeFiles=".*\.xml"&lt;br /&gt;&lt;span style=""&gt; &lt;/span&gt;PublishSize="1"&lt;br /&gt;&lt;span style=""&gt; &lt;/span&gt;PollingFrequency="10"&lt;br /&gt;&lt;span style=""&gt; &lt;/span&gt;MinimumAge="5"&lt;br /&gt;&lt;span style=""&gt; &lt;/span&gt;OpaqueSchema="false"&lt;/span&gt;&lt;span style="font-size:10;"&gt; &amp;gt;&lt;/span&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;What it will do at runtime is take your XML file, preserve the root tag, and for each child of the root, generate a separate inbound document containing the child with the root tag again wrapped around it:&lt;/span&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-right: 36pt; margin-left: 36pt;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&amp;lt;dcs320 xmlns="http://www.customer.com/schemas/dcs320/1.0"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;salesline&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messagetype&amp;gt;DCS320&amp;lt;/messagetype&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messageid&amp;gt;487235&amp;lt;/messageid&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messagelinenumber&amp;gt;1&amp;lt;/messagelinenumber&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;datamutationtype&amp;gt;0&amp;lt;/datamutationtype&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;dcaddressnumber&amp;gt;0000410&amp;lt;/dcaddressnumber&amp;gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;/salesline&amp;gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;salesline&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messagetype&amp;gt;DCS320&amp;lt;/messagetype&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messageid&amp;gt;487235&amp;lt;/messageid&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messagelinenumber&amp;gt;2&amp;lt;/messagelinenumber&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;datamutationtype&amp;gt;0&amp;lt;/datamutationtype&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;dcaddressnumber&amp;gt;0000411&amp;lt;/dcaddressnumber&amp;gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;/salesline&amp;gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;salesline&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messagetype&amp;gt;DCS320&amp;lt;/messagetype&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messageid&amp;gt;487235&amp;lt;/messageid&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;messagelinenumber&amp;gt;3&amp;lt;/messagelinenumber&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;datamutationtype&amp;gt;0&amp;lt;/datamutationtype&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;dcaddressnumber&amp;gt;0000412&amp;lt;/dcaddressnumber&amp;gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;/salesline&amp;gt;&lt;br /&gt;&amp;lt;/dcs320&amp;gt; &lt;/span&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;The above document will launch instances that get documents as input that look like:&lt;/span&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-right: 36pt; margin-left: 36pt;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&amp;lt;dcs320 xmlns="http://www.customer.com/schemas/dcs320/1.0"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;salesline&amp;gt;&lt;br /&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;messagetype&amp;gt;DCS320&amp;lt;/messagetype&amp;gt;&lt;br /&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;messageid&amp;gt;487235&amp;lt;/messageid&amp;gt;&lt;br /&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;messagelinenumber&amp;gt;1&amp;lt;/messagelinenumber&amp;gt;&lt;br /&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;datamutationtype&amp;gt;0&amp;lt;/datamutationtype&amp;gt;&lt;br /&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;dcaddressnumber&amp;gt;0000410&amp;lt;/dcaddressnumber&amp;gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;/salesline&amp;gt;&lt;br /&gt;&amp;lt;/dcs320&amp;gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;And so on, one for each &amp;lt;salesline&amp;gt; child. The ability to de-batch large XML files gives us the option to process large XML documents (that have a repeating structure) in BPEL, one piece at a time.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:15;"  &gt;Process Control Challenges&lt;/span&gt;&lt;/b&gt; &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;The main challenge I've always had with debatching or other "parallel processing" patterns is to stay in control regarding error handling and monitoring progress &amp;amp; completion. Especially for non-transactional protocols like File and FTP, this can be tricky. Another neat feature that has been built into the 10.1.3.3 adapter is a batch notification mechanism. This means that at certain points in its processing, the adapter will post meta-data events about its progress to an event handler, typically another BPEL process. You configure this notification behaviour in the activationAgent section of the bpel.xml in the debatching process. Below an example of such a bpel.xml: &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-right: 36pt; margin-left: 36pt;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&amp;lt;?xml version = '1.0' encoding = 'UTF-8'?&amp;gt;&lt;br /&gt;&amp;lt;BPELSuitcase&amp;gt;&lt;br /&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;BPELProcess id="XMLDebatcher" src="XMLDebatcher.bpel"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;partnerLinkBindings&amp;gt;&lt;br /&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;partnerLinkBinding name="debatch"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;property name="wsdlLocation"&amp;gt;debatch.wsdl&amp;lt;/property&amp;gt;&lt;br /&gt;&lt;span style=""&gt;         &lt;/span&gt;&amp;lt;/partnerLinkBinding&amp;gt;&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;/partnerLinkBindings&amp;gt;&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;activationAgents&amp;gt;&lt;br /&gt;&lt;span style=""&gt;         &lt;/span&gt;&amp;lt;activationAgent className="oracle.tip.adapter.fw.agent.jca.JCAActivationAgent" partnerLink="debatch"&amp;gt;&lt;br /&gt;&amp;lt;property name="batchNotificationHandler"&amp;gt;bpel://default|BatchMgmtProcess&amp;lt;/property&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;property name="portType"&amp;gt;Read_ptt&amp;lt;/property&amp;gt;&lt;br /&gt;&lt;span style=""&gt;         &lt;/span&gt;&amp;lt;/activationAgent&amp;gt;&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;/activationAgents&amp;gt;&lt;br /&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;/BPELProcess&amp;gt;&lt;br /&gt;&amp;lt;/BPELSuitcase&amp;gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;Above, the batch notification events are sent to a BPEL process called "BatchMgmtProcess", deployed in the "default" domain on the same BPEL server. The wsdl of this BatchMgmtProcess must define a number of messageTypes and operations. This is what it should look like (never mind the correlation stuff for now): &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-right: 36pt; margin-left: 36pt;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&amp;lt;definitions&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;name="BatchManagerInterface"&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;targetNamespace="http://xmlns.oracle.com/pcbpel/batching"&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;xmlns="http://schemas.xmlsoap.org/wsdl/"&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;xmlns:tns="http://xmlns.oracle.com/pcbpel/batching"&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;xmlns:pns1="http://xmlns.oracle.com/BatchMgmtProcess/correlationset"&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;xmlns:batch="http://xmlns.oracle.com/pcbpel/batching/types"&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;import namespace="http://xmlns.oracle.com/BatchMgmtProcess/correlationset" location="BatchMgmtProcess_Properties.wsdl"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;types&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/pcbpel/batching/types"&lt;br /&gt;&lt;span style=""&gt;             &lt;/span&gt;xmlns:tns="http://xmlns.oracle.com/pcbpel/batching/types" xmlns="http://www.w3.org/2001/XMLSchema"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;element name="batchReadInitiateElement" type="tns:batchReadInitiateType"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;complexType name="batchReadInitiateType"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&amp;lt;sequence&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchId" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchMetaData" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;span style=""&gt;                 &lt;/span&gt;&amp;lt;element name="batchDescription" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="process" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="domain" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&amp;lt;/sequence&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;/complexType&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;element name="batchReadCompleteElement" type="tns:batchReadCompleteType"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;complexType name="batchReadCompleteType"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&amp;lt;sequence&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchId" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchMetaData" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchDescription" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchExpectedSize" type="long"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="process" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="domain" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&amp;lt;/sequence&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;/complexType&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;element name="batchProcessCompleteElement" type="tns:batchProcessCompleteType"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;complexType name="batchProcessCompleteType"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&amp;lt;sequence&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchId" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchMetaData" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchDescription" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchFinalSize" type="long"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="process" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="domain" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&amp;lt;/sequence&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;/complexType&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;element name="batchReadFailureElement" type="tns:batchReadFailureType"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;complexType name="batchReadFailureType"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&amp;lt;sequence&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchId" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchMetaData" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchDescription" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="batchPartialSize" type="long"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="process" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;&amp;lt;element name="domain" type="string"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&amp;lt;/sequence&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;/complexType&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;/schema&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/types&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;message name="batchReadInitiateMessage"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;part name="event" element="batch:batchReadInitiateElement"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;message name="batchReadCompleteMessage"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;part name="event" element="batch:batchReadCompleteElement"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;message name="batchProcessCompleteMessage"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;part name="event" element="batch:batchProcessCompleteElement"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;message name="batchReadFailureMessage"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;part name="event" element="batch:batchReadFailureElement"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;portType name="BatchManagerInterface"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;operation name="onBatchReadStart"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;input message="tns:batchReadInitiateMessage"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;/operation&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;operation name="onBatchReadComplete"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;input message="tns:batchReadCompleteMessage"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;/operation&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;operation name="onBatchProcessComplete"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;input message="tns:batchProcessCompleteMessage"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;/operation&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;operation name="onBatchReadFailure"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp;lt;input message="tns:batchReadFailureMessage"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;/operation&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/portType&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;plnk:partnerLinkType name="BatchManagerInterfacePartnerLinkType"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;plnk:role name="BatchManagerInterfaceRole"&amp;gt;&lt;br /&gt;&lt;span style=""&gt;         &lt;/span&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;plnk:portType name="tns:BatchManagerInterface"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;/plnk:role&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/plnk:partnerLinkType&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;bpws:propertyAlias propertyName="pns1:batchId" messageType="tns:batchReadCompleteMessage" part="event"&lt;br /&gt;&lt;span style=""&gt;         &lt;/span&gt;query="/batch:batchReadCompleteElement/batch:batchId"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;bpws:propertyAlias propertyName="pns1:batchId" messageType="tns:batchReadInitiateMessage" part="event"&lt;br /&gt;&lt;span style=""&gt;         &lt;/span&gt;query="/batch:batchReadInitiateElement/batch:batchId"/&amp;gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;bpws:propertyAlias propertyName="pns1:batchId" messageType="tns:batchReadFailureMessage" part="event"&lt;br /&gt;&lt;span style=""&gt;         &lt;/span&gt;query="/batch:batchReadFailureElement/batch:batchId"/&amp;gt;&lt;br /&gt;&amp;lt;/definitions&amp;gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;The value of the batchId field is generated at runtime by the adapter, and can for example be used to initiate a correlationSet. You can then later on receive (e.g. using a Pick with correlation) a batchReadComplete or batchReadFailure message for the same file in the same monitoring instance. Here’s a fragment of what it could look like:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;correlationSets&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;correlationSet name="CorrelationSet_1" properties="ns3:batchId"/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;/correlationSets&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;sequence name="main"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;pick name="Pick_1" createInstance="yes"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;      &lt;/span&gt;&amp;lt;onMessage portType="ns1:BatchManagerInterface"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;                 &lt;/span&gt;operation="onBatchReadStart"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;                 &lt;/span&gt;variable="OnMessage_onBatchReadStart_InputVariable"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;                 &lt;/span&gt;partnerLink="BatchManagerInterface"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;correlations&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;          &lt;/span&gt;&amp;lt;correlation initiate="yes" set="CorrelationSet_1"/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;/correlations&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;span style=";font-family:Arial;font-size:12;"  &gt;Happy Debatching!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2583565177075565132-2731432054053345441?l=oraintpc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/2731432054053345441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/2731432054053345441'/><link rel='alternate' type='text/html' href='http://oraintpc.blogspot.com/2007/08/xml-debatching-in-file-ftp-adapter.html' title='XML Debatching in File / FTP adapter'/><author><name>Marc De Brouwer</name><uri>http://www.blogger.com/profile/10316352970734644765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-2583565177075565132.post-9104441921870564943</id><published>2007-08-02T09:27:00.001+02:00</published><updated>2007-08-26T13:28:19.619+02:00</updated><title type='text'>How to approach an SOA project</title><content type='html'>Service Oriented Architecture is all about business processing. How is the current/future business process is defined? What are the rules within this process? What is the input and the output of the process. How are will the business process act when in some particular stage a failure occurs. For example, the customer does not pay, the partner does not deliver the goods, the product is out of stock or some technical issues occurs; the netwrok is down, database crashes and many many more.&lt;br /&gt;&lt;br /&gt;To implement a business process into a Service Oriented Architecture is not different before SOA did not exists. All the information flows, business  flows , exceptions should be described in detail. This is what we still call the functional design. While we normally describe this in one or more documents, we should now focus more on process diagrams and data flows. An image says more than thousand words.&lt;br /&gt;&lt;br /&gt;Drawing business process with their information flows make the process more transparent and the communication to the customer more clear. Drawings are easily to change, in case new functionality is added or flows should be combined to make the process more efficient.&lt;br /&gt;&lt;br /&gt;A functional process flow diagram should the describe the whole process including the exceptions. After the functional process flow diagram  a design will be made of the process. This means that the business process could be split in one ore more other processes. In practice it will result in many processes.&lt;br /&gt;&lt;br /&gt;These small processes can be split up again in two different flavors, processes that are related to functional business process and processes that are more technical. Examples of functional processes are "collect products for shipping", "select customers who did not pay their order". Technical processes are for example; "send customer an notification", "update the order status for a customer".&lt;br /&gt;&lt;br /&gt;Technical processes should not be exposed to the outside world. They are not meant to be called as a reusable service. These processes will not cover the business rules from their parent processes.&lt;br /&gt;&lt;br /&gt;The functional processes can marked for being reused in the business process itself, but can also be exposed to other processes in the organization or third parties.&lt;br /&gt;&lt;br /&gt;To summarize:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Define the functional process with all the incoming and outgoing information flows.&lt;/li&gt;&lt;li&gt;Define all internal information flows.&lt;/li&gt;&lt;li&gt;Described the content of the flows.&lt;/li&gt;&lt;li&gt;Describe the type of flows.&lt;/li&gt;&lt;li&gt;Split the functional processes into smaller processes.&lt;/li&gt;&lt;li&gt;For each smaller process, described also the previous steps.&lt;/li&gt;&lt;li&gt;Define which of the smaller processes can be reused.&lt;/li&gt;&lt;li&gt;Define for each smaller process the technical processes needed.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Regards,&lt;br /&gt;&lt;br /&gt;Marc Kelderman&lt;br /&gt;Technical Architect&lt;br /&gt;http://orasoa.blogspot.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2583565177075565132-9104441921870564943?l=oraintpc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/9104441921870564943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2583565177075565132/posts/default/9104441921870564943'/><link rel='alternate' type='text/html' href='http://oraintpc.blogspot.com/2007/08/test.html' title='How to approach an SOA project'/><author><name>Marc Kelderman SOA Blog</name><uri>http://www.blogger.com/profile/13131001868435096782</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_QolFV9VBHas/S7EDmKUKjvI/AAAAAAAAAKE/deuLFDqhBKw/S220/MySelfSmall.jpg'/></author></entry></feed>
