BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > AI トピック > Application Integration ユーザーズ ガイド > カスタム コードの作成によるアプリケーション ビューの使用方法 |
Application Integration ユーザーズ ガイド
|
カスタム コードの作成によるアプリケーション ビューの使用方法
開発者は、カスタム コードを作成してアプリケーション ビューを修正できます。Application View Console でほとんどのアプリケーション ビュー機能を使用できますが、一部にはカスタム コードを作成しなければ使用できない機能もあります。
この章ではカスタム コードが使用される例として 2 つのシナリオを提示します。
シナリオ 1: 特定の資格に基づいた接続の作成
アプリケーション ビューのサービスを呼び出す前に、そのビューに対して一定のセキュリティ レベルを設定する必要がある場合、該当するに資格を設定することにより、セキュリティを設定できます。資格設定には、ApplicationView メソッドの setConnectionSpec() および getConnectionSpec() を使用します。どちらのメソッドでも ConnectionSpec オブジェクトが使用されます。
ConnectionSpec オブジェクトをインスタンス化するには、BEA WebLogic Integration Adapter Development Kit (ADK) に用意されている ConnectionRequestInfoMap クラスを使用するか、または、ユーザ独自のクラスを実装するか、のいずれかの方法によります。独自のクラスを実装する場合は、ConnectionSpec、ConnectionRequestInfo、Map、および Serializable の 4 つのインタフェースを組み込む必要があります。
ConnectionSpec の実装
setConnectionSpec() または getConnectionSpec() を使用する前に、ConnectionSpec オブジェクトをインスタンス化する必要があります。ADK で用意されている ConnectionRequestInfoMap クラスを使用するか、またはユーザ独自のクラスを作成します。
ConnectionSpec を実装する手順は次のとおりです。
setConnectionSpec() と getConnectionSpec() の呼び出し
ConnectionSpec クラスを実装して ConnectionSpec オブジェクトをインスタンス化したら、それらと次の ApplicationView メソッドと組み合わせて使用できます。
以下に示すのは setConnectionSpec() のコードです。
コード リスト 4-1 setConnectionSpec() のコード全文
/**
* EIS との接続に対して connectionSpec を設定する。ConnectionSpec
* の設定により、サービスの呼び出し時に、このクラスを使用して
* との接続が確立される。接続スペックをクリアしてデフォルトの
* 接続パラメータを使用するには、NULL 値を使用してこのメソッドを呼び出す。
*
* EIS の @params connectionCriteria 接続基準。
*/
public void setConnectionSpec(ConnectionSpec connectionCriteria)
{
m_connCriteria = connectionCriteria;
}
以下に示すのは getConnectionSpec() のコードです。
コード リスト 4-2 getConnectionSpec() のコード全文
/**
* setConnectionSpec によって設定された ConnectionSpec が返される。
* ConnectionSpec が設定されていなければ、NULL 値が返される。
*
* @returns ConnectionSpec
*/
public ConnectionSpec getConnectionSpec()
{
return m_connCriteria;
}
ConnectionSpec クラスの使い方
ConnectionSpec を設定するには、適切に初期化した ConnectionSpec オブジェクトを ConnectionSpec に渡します。ConnectionSpec を消去するには、NULL 値を持つ ConnectionSpec オブジェクトを ConnectionSpec に渡します。
リスト4-3 は、ConnectionSpec の使用例を示しています。
コード リスト 4-3 ConnectionSpec クラスの使用例
Properties props = new Properties();
ApplicationView applicationView = new ApplicationView(getInitialContext(props),"appViewTestSend");
ConnectionRequestInfoMap map = new ConnectionRequestInfoMap();
// プロパティをここにマップする
map.put("PropertyOne","valueOne");
map.put("PropertyTwo","valueTwo");
.
.
.
//新しい接続スペックを設定する
applicationView.setConnectionSpec(map);
IDocumentDefinition requestDocumentDef = applicationView.getRequestDocumentDefinition("serviceName");
SOMSchema requestSchema = requestDocumentDef.getDocumentSchema();
DefaultDocumentOptions options = new DefaultDocumentOptions();
options.setForceMinOccurs(1);
options.setRootName("ROOTNAME");
options.setTargetDocument(DocumentFactory.createDocument());
IDocument requestDocument = requestSchema.createDefaultDocument(options);
requestDocument.setStringInFirst("//ROOT/ElementOne","value");
requestDocument.setStringInFirst("//ROOT/ElementTwo","value");
.
.
.
// サービス呼び出しで、この接続スペック セットを使って EIS に接続する
IDocument result = applicationView.invokeService("serviceName", requestDocument);
System.out.println(result.toXML());
シナリオ 2: ビジネス プロセスのカスタム コードの作成
ビジネス プロセスでアプリケーション ビューを使用する最も簡単なのは、WebLogic Integration Studio を使用する方法ですが、どのような場合でも代替方法としてビジネス プロセスを表すカスタム Java コードを作成できます。カスタム コードを作成する開発者は、この節で提示される、カスタム プロセスの作成方法を示す簡単な例を参照、検討してください。
アプリケーション ビューを使用するための 2 つの方法の詳細な比較については、ビジネス プロセスの実装方法の選択を参照してください。
このシナリオについて
CRM (Customer Relationship Management: 顧客関係管理) システムと OP (Order Processing: 発注処理) システムを所有する企業があると想定します。経営陣は、CRM システムで顧客が登録されると、OP システムの対応する顧客レコードの登録が連動して確実に起動されるようにしたいと考えます。したがって、経営陣は開発者に対して、この 2 つのシステムで管理される情報が常に同期を保つようなビジネス プロセスを作成するように指示します。付属の Java クラス SyncCustomerInformation により、このビジネス ロジックを実装します。
この例で、カスタム コードを使用して実行できるすべての処理が説明できるわけではありません。この例は、あくまでオーガニゼーション独自のビジネス プロセスを実装する際の基本的な手順を紹介し、実際のビジネス プロセスのカスタム コードを作成するにあたってのテンプレートとして提示するためのものです。
このシナリオでは、SyncCustomerInformation という特定のクラス例を使用してカスタム コードの作成方法を説明します。通常、ビジネス プロセス内でアプリケーション ビューを使用するためのカスタム コードを作成するには、次の 2 つの手順に従う必要があります。
始める前に
カスタム コードを作成してビジネス プロセスを実装する前に、以下の前提条件を満たす必要があります。
さらに、このシナリオでは以下の前提条件を満たしていることを仮定しています。
注意: 実際のオーガニゼーションでは、独自のフォルダとアプリケーション ビューが使用されます。
注意: 実際のオーガニゼーションの固有情報は、システム管理者から入手してください。
SyncCustomerInformation クラスの作成
カスタム コードの作成を始める前に、ビジネス クラスに必要な各アプリケーションを表現する Java クラスを準備する必要があります。必要な Java クラスがない場合は、ここでそれらを作成します。この例では、SyncCustomerInformation というアプリケーション クラスを呼び出します。もちろん、実際の独自コードでは異なる変数名を使用します。SyncCustomerInformation Java クラスを作成する手順は次のとおりです。
サンプル Java クラスのコード
次のコード リストは、SyncCustomerInformation Java クラスのソース コード全文です。このコードにより、この節の前半で説明したシナリオに関するビジネス ロジックが実装されます。このサンプルを、実際の企業のビジネス プロセスを実装するコードを作成するときのテンプレートとして活用してください。
コード リスト 4-4 SyncCustomerInformation のクラス ソース コード全文
import java.util.Hashtable;
import javax.naming.*;
import java.rmi.RemoteException;
import com.bea.wlai.client.*;
import com.bea.wlai.common.*;
import com.bea.document.*;
/**
*このクラスにより Sync Customer Information ビジネス プロセスのビジネス ロジックが
* 実装される。このクラスは WLAI API を使用して CRM システムのイベントをリスンし、
* OP システムのサービスを呼び出す。ここでは ApplicationViews が 2 つ定義されており、
* それらが「EastCoast」ネームスペースにデプロイされていることを仮定している。
* 2 つのアプリケーション ビュー、および必要なイベント、サービスは次のとおり。
*
*
* CustomerManagement
* イベント(NewCustomer)
* サービス(なし)
*
* OrderProcessing
* イベント(なし)
* サービス(CreateCustomer)
*/
public class SyncCustomerInformation
implements EventListener
{
/**
* このアプリケーションを起動する主要メソッド。引数は必要なし。
*/
public static void
main(String[ ] args)
{
// サーバ接続に必要な情報の有無をチェック。
if (args.length != 3)
{
System.out.println("Usage: SyncCustomerInformation ");
System.out.println(" <server url> <user id> <password>");
return;
}
try
{
// 連携して動作する SyncCustomerInformation のインスタンスを作成
SyncCustomerInformation syncCustInfo =
new SyncCustomerInformation(args[0], args[1], args[2]);
// WLAI への接続を取得
InitialContext initialContext = syncCustInfo.getInitialContext();
// 「EastCoast.CustomerManagement」のインスタンスへの参照を取得
// アプリケーション ビュー
ApplicationView custMgmt =
new ApplicationView(initialContext, "EastCoast.CustomerManagement");
// 「New Customer」イベントのリスナを追加する。この場合、
// アプリケーション クラスに EventListener を実装し、直接イベントをリスン
// できるようにする。
custMgmt.addEventListener("NewCustomer", syncCustInfo);
// 10 個までのイベントを処理してから終了する。
syncCustInfo.setMaxEventCount(10);
syncCustInfo.processEvents();
}
catch (Exception e)
{
e.printStackTrace();
}
return;
}
/**
* 「New Customer」イベントに応答する EventListener メソッド
*/
public void
onEvent(IEvent newCustomerEvent)
{
try
{
// 着信した「New Customer」イベントの内容を印刷する。
System.out.println("Handling new customer: ");
System.out.println(newCustomerEvent.toXML());
// 処理する。
IDocument response = handleNewCustomer(newCustomerEvent.getPayload());
// 応答を印刷する。
System.out.println("Response: ");
System.out.println(response.toXML());
// 処理対象のすべてのイベントを処理したら終了する。
m_eventCount++;
if (m_eventCount >= m_maxEventCount)
{
quit();
}
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("Quitting...");
quit();
}
}
/**
* 'Order Processing' ApplicationView で 「Create Customer」サービスを
* 呼び出し、「New Customer」イベントを処理する。サービスから
* 戻された応答ドキュメントが、このメソッドの戻り値として
* 返される。
*/
public IDocument
handleNewCustomer(IDocument newCustomerData)
throws Exception
{
// 'OrderProcessing' ApplicationView のインスタンスを取得。
if (m_orderProc == null)
{
m_orderProc =
new ApplicationView(m_initialContext, "EastCoast.OrderProcessing");
}
// newCustomerData のデータを変換し、'Order Processing' ApplicationView
// の「Create Customer」に対する要求ドキュメントに適する形式に
// する。
IDocument createCustomerRequest =
transformNewCustomerToCreateCustomerRequest(newCustomerData);
// サービスを呼び出す。
IDocument createCustomerResponse =
m_orderProc.invokeService("CreateCustomer", createCustomerRequest);
// 応答を返す。
return createCustomerResponse;
}
// ---------------------------------------------
// メンバ変数
// ---------------------------------------------
/**
* WLAI サーバの URL (例 : t3://localhost:7001)
*/
private String m_url;
/**
* WLAI にログインするときに使用されるユーザ ID。
*/
private String m_userID;
/**
* m_userID で指定されたユーザが WLAI にログインするときに使用される
* パスワード。
*/
private String m_password;
/**
* WLAI との通信に使用される初期コンテキスト。
*/
private InitialContext m_initialContext;
/**
* handleNewCustomer に使用される 'East Coast.Order Processing'
* ApplicationView のインスタンス。
*/
private ApplicationView m_orderProc;
/**
* handleNewCustomer で処理される最大イベント数が入る
*/
private int m_maxEventCount;
/**
* handleNewCustomer で処理されるイベント数のカウント
*/
private int m_eventCount;
/**
* 終了要求されるまで待機できるようにするモニタ変数。
*/
private String m_doneMonitor = new String("Done Monitor");
/**
* 処理が終了したかどうかを示すフラグ。
*/
private boolean m_done = false;
// ------------------------------------------------
// ユーティリティ メソッド
// ------------------------------------------------
/**
* コンストラクタ
*/
public SyncCustomerInformation(String url, String userID, String password)
{
m_url = url;
m_userID = userID;
m_password = password;
}
/**
* WLAI に対して初期コンテキストを設定する。
*/
public InitialContext
getInitialContext()
throws NamingException
{
// WLAI サーバの InitialContext を入手するためのプロパティを設定する。
Hashtable props = new Hashtable();
// WLAI ホスト、ポート、ユーザ ID、およびパスワードをプロパティに入力する。
props.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
props.put(Context.PROVIDER_URL, m_url);
props.put(Context.SECURITY_PRINCIPAL, m_userID);
props.put(Context.SECURITY_CREDENTIALS, m_password);
// WLAI サーバに接続する。
InitialContext initialContext = new InitialContext(props);
// 後で使用できるようにこれを保存する。
m_initialContext = initialContext;
return initialContext;
}
/**
* 「New Customer」イベントのドキュメントを「Create Customer」サービスで必要
* とされるドキュメントに変換する。
*/
public IDocument
transformNewCustomerToCreateCustomerRequest(IDocument newCustomerData)
throws Exception
{
// ここでは XSLT 変換を実行しても、ソースから対象ドキュメントに手動で
// データを移動してもよい。この変換の詳細は、このサンプル
// の範囲外となっている。XSLT については、http://www.w3.org/TR/xslt
// を参照のこと。ドキュメント間の手動によるデータ移動
// についての詳細は、JavaDoc マニュアルの com.bea.document.IDocument
// インタフェースを参照。
return newCustomerData;
}
/**
* イベント処理/待機のループ
*/
public void
processEvents()
{
synchronized(m_doneMonitor)
{
while (!m_done)
{
try
{
m_doneMonitor.wait();
}
catch (Exception e)
{
// 無視する
}
}
}
}
/**
* 処理したい最大のイベント数を設定する。
*/
public void
setMaxEventCount(int maxEventCount)
{
m_maxEventCount = maxEventCount;
}
/**
* このアプリケーションを(完全に)強制終了するメソッド
*/
public void
quit()
{
synchronized(m_doneMonitor)
{
m_done = true;
m_doneMonitor.notifyAll();
}
}
}
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |