bpelx:execタグを使用してBPELプロセスにJavaコード・スニペットを埋め込む方法
Javaコード・スニペットは、Java BPEL exec拡張要素bpelx:execを使用してBPELプロセスに直接埋め込むことができます。この方法の利点は、パフォーマンスに優れていることとトランザクション性が維持されることです。小さいコード・セグメントのみを組み込むことをお薦めします。BPELは、ビジネス・ロジックを実装から切り離します。プロセスの多数のJavaコードを削除すると、この切離しを維持できなくなります。Java埋込みは、ビジネス・コードではなく、短いユーティリティ系の操作を対象としています。ビジネス・ロジックは別の場所に配置し、配置したロジックをBPELからコールします。
サーバーは、bpelx:execアクティビティ内のJavaコード・スニペットをそのJava Transaction API (JTA)トランザクション・コンテキスト内で実行します。このBPELタグbpelx:execは、Java例外をBPELフォルトに変換し、BPELプロセスに追加します。Javaスニペットは、コールするセッションBeanとエンティティBeanに、そのJTAトランザクションを伝播できます。
たとえば、SessionBeanSample.bpelファイルは、次のコードに示すbpelx:execタグを使用して、invokeSessionBean Java Beanを埋め込みます。
<bpelx:exec name="invokeSessionBean" language="java" version="1.5">
<![CDATA[
try {
Object homeObj = lookup("ejb/session/CreditRating");
Class cls = Class.forName(
"com.otn.samples.sessionbean.CreditRatingServiceHome");
CreditRatingServiceHome ratingHome = (CreditRatingServiceHome)
PortableRemoteObject.narrow(homeObj,cls);
if (ratingHome == null) {
addAuditTrailEntry("Failed to lookup 'ejb.session.CreditRating'"
+ ". Ensure that the bean has been"
+ " successfully deployed");
return;
}
CreditRatingService ratingService = ratingHome.create();
// Retrieve ssn from scope
Element ssn =
(Element)getVariableData("input","payload","/ssn");
int rating = ratingService.getRating( ssn.getNodeValue() );
addAuditTrailEntry("Rating is: " + rating);
setVariableData("output", "payload",
"/tns:rating", new Integer(rating));
} catch (NamingException ne) {
addAuditTrailEntry(ne);
} catch (ClassNotFoundException cnfe) {
addAuditTrailEntry(cnfe);
} catch (CreateException ce) {
addAuditTrailEntry(ce);
} catch (RemoteException re) {
addAuditTrailEntry(re);
}
]]>
</bpelx:exec>