![]() ![]() ![]() ![]() |
開発者は、カスタム コードを記述してアプリケーション ビューを修正することができます。ほとんどのアプリケーション ビューの機能は Application Integration Design Console から使用できますが、中にはカスタム コードを記述しないと使用できないものもあります。
この節では、カスタム コードを使用した 2 つのシナリオを紹介します。
サービスを呼び出す前にアプリケーション ビューにセキュリティ レベルを割り当てる必要がある場合は、対象となる EIS に資格を設定することで、これを実現できます。これには、ApplicationView
メソッドの setConnectionSpec()
と getConnectionSpec()
を使用します。どちらのメソッドにも、ConnectionSpec
オブジェクトが使用されています。
ConnectionSpec
オブジェクトは、BEA WebLogic Integration ADK (Adapter Development Kit) で提供されている ConnectionRequestInfoMap
クラスを使用するか、独自のクラスを実装してインスタンス化できます。独自のクラスを実装する場合は、ConnectionSpec
、ConnectionRequestInfo
、Map
、および Serializable
の 4 つのインタフェースを含める必要があります。
setConnectionSpec()
または getConnectionSpec()
を使用するには、その前に ConnectionSpec
オブジェクトをインスタンス化する必要があります。これには、ADK で提供されている ConnectionRequestInfoMap
クラスを使用するか、または独自のクラスを記述します。
ConnectionSpec
クラスを実装し、ConnectionSpec
オブジェクトをインスタンス化したら、それらを次の ApplicationView
メソッドと組み合わせて使用できます。
次のリストは、setConnectionSpec()
のコードです。
* EIS への接続に使用する connectionSpec を設定する。
* 設定した ConnectionSpec は、サービスを呼び出したときに、EIS との接続に
* 使用される。この接続仕様をクリアしてデフォルトの接続パラメータを
* 使用するには、null を使ってこのメソッドを呼び出す。
*
* @params connectionCriteria EIS の接続条件。
*/
public void setConnectionSpec(ConnectionSpec connectionCriteria)
{
m_connCriteria = connectionCriteria;
}
次のリストは、getConnectionSpec()
のコードです。
* setConnectionSpec で設定された ConnectionSpec を返す。
* 設定されている ConnectionSpec がない場合は、null を返す。
*
* @returns ConnectionSpec
*/
public ConnectionSpec getConnectionSpec()
{
return m_connCriteria;
}
ConnectionSpec
クラスを設定するには、正しく初期化された ConnectionSpec
オブジェクトを ConnectionSpec クラスに渡します。ConnectionSpec
クラスをクリアするには、null 値を持つ ConnectionSpec
オブジェクトを ConnectionSpec クラスに渡します。
コード リスト 5-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());
ビジネス プロセスでアプリケーション ビューを使用する最も簡単な方法はアプリケーション ビュー コントロールを追加することですが、代わりに独自の Java コードを記述して、ビジネス プロセスを表すことができます。カスタム コードを記述する場合は、以下に示す簡単な例を参照して、独自のビジネス プロセスを記述する方法について理解するようにしてください。
アプリケーション ビューを使用するための 2 つの方法の詳細な比較については、「ビジネス プロセスの実装方法の選択」を参照してください。
ある企業で、カスタマ リレーションシップ マネジメント (Customer Relationship Management : CRM) システムと注文処理 (Order Processing : OP) システムを使用しているものとします。経営陣は、CRM システムに新しい顧客が追加されるたびに、OP システムでも対応する顧客レコードが自動的に作成されることを望んでいます。そこで、あなたを含む企業内の Java 開発者は、これら 2 つのシステムで同期的に情報がメンテナンスされるようなビジネス プロセスを作成するよう指示されました。このビジネス ロジックは、以下に紹介する Java クラス SyncCustomerInformation
によって実装されます。
この例は、カスタム コードを使って実行できることをすべて示しているわけではありません。ここでは、独自のビジネス プロセスをコーディングする際のテンプレートとして、組織のビジネス プロセスを実装するのに必要な基本手順を示します。
このシナリオでは、SyncCustomerInformation
という具体的なクラスを例にとり、カスタム コードを記述する方法を示しています。一般に、ビジネス プロセスでアプリケーション ビューを使用するためのカスタム コードを作成するには、次の 2 つの手順を実行する必要があります。
カスタム コードを記述してビジネスプロセスを実装するには、事前に次の要件を満たす必要があります。
また、このシナリオは、次の要件が満たされていることを前提としています。
注意 : | 実際には、組織ごとに独自のフォルダとアプリケーション ビューを作成する必要があります。 |
注意 : | 組織固有の情報については、システム管理者から取得してください。 |
カスタム コードを記述する前に、ビジネス プロセスに必要なそれぞれのアプリケーションを表す Java クラスが存在していることを確認します。必要な Java クラスがない場合は、ここで作成します。この例では、SyncCustomerInformation
という 1 つのアプリケーション クラスを呼び出します。もちろん、実際に記述するコードには別の変数名を使用します。SyncCustomerInformation
Java クラスを作成するには
注意 : | 実際のプロジェクトでは、テンプレートまたは参考ガイドとして SyncCustomerInformation コードを使用してください。サンプルの SyncCustomerInformation コードには、詳細なコメントが挿入されています。 |
NamespaceManager
(変数名 m_namespaceMgr
) と ApplicationViewManager
(変数名 m_appViewMgr
) に対する参照を取得します。この手順を実行するには、WebLogic Server で JNDI ルックアップを使用します。nm.getRootNamespace()
を呼び出す NamespaceManager
を使用して、ルート ネームスペースに対する参照を取得します。この参照は、変数 root
に格納されます。root.getNamespaceObject("East Coast")
を呼び出す root
変数を使用して、East Coast ネームスペースに対する参照を取得します。この参照は、変数 eastCoast
に格納されます。eastCoast
変数を使用して、顧客管理の ApplicationView
に対する一時参照を取得し、変数 custMgmtHandle
に格納します。custMgmtHandle
一時参照を使用して、顧客管理の ApplicationView
インスタンスに対する参照を取得します。具体的には、ApplicationViewManager
を avm.getApplicationViewInstance (custMgmtHandle.getQualifiedName())
として呼び出します。返された参照を、変数 custMgmt
に格納します。custMgmt.addEventListener("New Customer",
listener
)
を呼び出し、listener
を New Customer イベントに応答できるオブジェクトの名前と置き換えることにより、New Customer イベントのリスンを開始します。イベント リスナと EventListener
インタフェースの詳細については、Application Integration API を参照してください。onEvent
メソッドを実装します。
New Customer イベントを受け取ると、リスナの onEvent
メソッドが呼び出されます。
onEvent
メソッドは、イベントに応答するメソッドを呼び出します。この例では、onEvent
メソッドにより、イベントに関連付けられたデータが含まれるイベント オブジェクトが取得されます。イベントに応答するために呼び出されるメソッドは、handleNewCustomer
です。
handleNewCustomer
メソッドを実装します。具体的には、次のアクション シーケンスを実行するコードを記述します。handleNewCustomer
メソッドが、イベントで参照されている XML ドキュメントを、East Coast.Order Processing.Create Customer サービスで読み取り可能なフォームに変換する。この変換は、XSLT を使用して実行するか、または独自の変換コードを使用して手動で実行できます。変換後の結果は、East Coast.Order Processing.Create Customer サービスの要求ドキュメントのスキーマに準拠する、XML ドキュメントになります。このドキュメントを変数 createCustomerRequest
に格納します。handleNewCustomer
が、East Coast.Customer Management アプリケーション ビューの場合と同じ方法で、East Coast.Order Processing アプリケーション ビューのインスタンスに対する参照を取得する。この参照は、変数 orderProc
に格納されます。handleNewCustomer
が、orderProc.invokeService("Create Customer", createCustomerRequest)
を呼び出すことによって、East Coast.Order Processing アプリケーション ビューに Create Customer サービスを呼び出す。ここで、createCustomerRequest
は Create Customer サービスの要求ドキュメントを保持する変数であることに留意してください。このサービスの応答ドキュメントは、変数 createCustomerResponse
に格納されます。handleNewCustomer
が実行を終了し、次の New Customer イベントを処理できる状態になる。
この最後の手順が終了すると、新しい Java クラス SyncCustomerInformation
が作成されます。このクラスは、Sync Customer Information ビジネス ロジックを実装します。SyncCustomerInformation
クラスは Application Integration API を使用して、CRM システムからイベントを取得し、OP システムでサービスを呼び出します。
次のコード リストは、SyncCustomerInformation
Java クラスのソース コードの全文です。このコードは、概要で説明したシナリオのビジネス ロジックを実装します。このサンプルを、実際の企業のビジネス プロセスを実装するコードを作成するときのテンプレートとして活用してください。
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' ネームスペースにデプロイされているものとする。
*そのアプリケーション ビューと、ぞれぞれに要求されるイベントとサービスは、
* 次のとおりである。
*
* 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 を参照。ドキュメント間の情報を手動で
// 移動する方法については、com.bea.document.IDocument インタフェースの
// JavaDoc ドキュメントを参照。
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();
}
}
}
![]() ![]() ![]() |