BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA
 ドキュメントのダウンロード   サイト マップ   用語集 
検索

Application Integration ユーザーズ ガイド

 前 次 目次 索引 PDFで表示  

カスタム コードの作成によるアプリケーション ビューの使用方法

開発者は、カスタム コードを作成してアプリケーション ビューを修正できます。Application View Console でほとんどのアプリケーション ビュー機能を使用できますが、一部にはカスタム コードを作成しなければ使用できない機能もあります。

この章ではカスタム コードが使用される例として 2 つのシナリオを提示します。

 


シナリオ 1: 特定の資格に基づいた接続の作成

アプリケーション ビューのサービスを呼び出す前に、そのビューに対して一定のセキュリティ レベルを設定する必要がある場合、該当するに資格を設定することにより、セキュリティを設定できます。資格設定には、ApplicationView メソッドの setConnectionSpec() および getConnectionSpec() を使用します。どちらのメソッドでも ConnectionSpec オブジェクトが使用されます。

ConnectionSpec オブジェクトをインスタンス化するには、BEA WebLogic Integration Adapter Development Kit (ADK) に用意されている ConnectionRequestInfoMap クラスを使用するか、または、ユーザ独自のクラスを実装するか、のいずれかの方法によります。独自のクラスを実装する場合は、ConnectionSpecConnectionRequestInfoMap、および Serializable の 4 つのインタフェースを組み込む必要があります。

ConnectionSpec の実装

setConnectionSpec() または getConnectionSpec() を使用する前に、ConnectionSpec オブジェクトをインスタンス化する必要があります。ADK で用意されている ConnectionRequestInfoMap クラスを使用するか、またはユーザ独自のクラスを作成します。

ConnectionSpec を実装する手順は次のとおりです。

  1. ADK で用意されている ConnectionRequestInfoMap クラスを使用するか、独自のクラスを実装するかを決定します。

  2. 独自の 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 つの手順に従う必要があります。

  1. ビジネス プロセスを実装するアプリケーションを表現する Java クラスがあることを確認します。

  2. その Java クラスの中に、ビジネス ロジックを実装するコードを定義します。

始める前に

カスタム コードを作成してビジネス プロセスを実装する前に、以下の前提条件を満たす必要があります。

さらに、このシナリオでは以下の前提条件を満たしていることを仮定しています。

SyncCustomerInformation クラスの作成

カスタム コードの作成を始める前に、ビジネス クラスに必要な各アプリケーションを表現する Java クラスを準備する必要があります。必要な Java クラスがない場合は、ここでそれらを作成します。この例では、SyncCustomerInformation というアプリケーション クラスを呼び出します。もちろん、実際の独自コードでは異なる変数名を使用します。SyncCustomerInformation Java クラスを作成する手順は次のとおりです。

  1. この Java アプリケーション クラスのソース コード全文については、サンプル Java クラスのコードを参照してください。

    注意: 独自のプロジェクトを開始する場合、SyncCustomerInformation コードをテンプレートまたは参考ガイドとして使用してください。コード例の SyncCustomerInformation には詳細なコメントが付いています。

  2. East Coast.New Customer をリスンするコードを作成します。

  3. WebLogic Server 内で NamespaceManager (変数名 m_namespaceMgr) および ApplicationViewManager (変数名 m_appViewMgr) への参照を取得します。この手順を実行するには、WebLogic Server から JNDI ルックアップを使用します。

  4. NamespaceManager を使って nm.getRootNamespace() を呼び出し、ルート ネームスペースの参照を取得します。この参照は、root という変数に格納されます。

  5. root 変数を使用して、root.getNamespaceObject(摘ast Coast) を呼び出し、East Coast ネームスペースへの参照を取得します。この参照は、eastCoast という変数に格納されます。

  6. eastCoast 変数を使用して、顧客管理の ApplicationView への一時参照を取得し、それを custMgmtHandle という変数に格納します。

  7. この custMgmtHandle 一時参照を使用して、顧客管理用の ApplicationView インスタンスへの参照を取得します。具体的には、avm.getApplicationViewInstance (custMgmtHandle.getQualifiedName()) として、ApplicationViewManager を呼び出します。返された参照を custMgmt という変数に格納します。

  8. custMgmt.addEventListener(哲ew Customer, listener) を呼び出し、listener を New Customer イベントに応答できるオブジェクトで置換して New Customer のリスンを開始します(イベント リスナと EventListener インタフェースに関する詳細は、Application Integration API を参照)。

  9. リスナ クラスの onEvent メソッドを実装します。

    New Customer イベントを受信すると、リスナの onEvent メソッドが呼び出されます。

    onEvent メソッドは、イベントに応答するメソッドを呼び出します。この例では、onEvent メソッドを使用して、そのイベントに関連するデータを格納するイベント オブジェクトを提供します。このイベントに応答するメソッドは、handleNewCustomer という名称になっています。

  10. New Customer イベントに応答する handleNewCustomer メソッドを実装します。具体的には、次のアクション シーケンスを実装するコードを作成します。

    1. handleNewCustomer メソッドによって、イベント内で参照される XML ドキュメントを East Coast.Order Processing.Create Customer サービスから要求される形式に変換する。この変換処理は、XSLT を使用して実行するか、カスタム変換コードを使用して手動で実行します。変換後は、East Coast.Order Processing.Create Customer サービスのリクエスト ドキュメントに関するスキーマに準拠した XML ドキュメントになります。このドキュメントを createCustomerRequest という変数に格納します。

    2. handleNewCustomer は、East Coast.Order Processing アプリケーション ビューへの参照を、前述の East Coast.Customer Management アプリケーション ビューの場合と同様に取得する。この参照は、orderProc という変数に格納されます。

    3. handleNewCustomerorderProc.invokeService(鼎reate Customer, createCustomerRequest) を呼び出して、East Coast.Order Processing アプリケーション ビューの Create Customer サービスを呼び出す。createCustomerRequest は Create Customer サービスに対する要求ドキュメントを格納する変数です。このサービスに関する応答ドキュメントは、createCustomerResponse という変数に格納されます。

    4. handleNewCustomer は、実行を終了し、次の着信 New Customer イベントで使用可能になる。

    この最後の手順が終了すると、SyncCustomerInformation という新しい Java クラスが作成されたことになります。このクラスにより Sync Customer Information ビジネス ロジックが実装されます。この SyncCustomerInformation クラスは、Application Integration API を使用して CRM システムからイベントを取得し、OP システム上でサービスを呼び出します。

サンプル 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();
}
}
}

 

ページの先頭 前 次