ナビゲーションをスキップ

Application Integration Design Console の使い方

  前 次 vertical dots separating previous/next from contents/index/pdf 目次  

カスタム コードの記述によるアプリケーション ビューの使用

開発者は、カスタム コードを記述してアプリケーション ビューを修正することができます。ほとんどのアプリケーション ビューの機能は Application Integration Design Console から使用できますが、中にはカスタム コードを記述しないと使用できないものもあります。

この節では、カスタム コードを使用した 2 つのシナリオを紹介します。

 


シナリオ 1 : 特定の資格を使用した接続の作成

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

ConnectionSpec オブジェクトは、BEA WebLogic Integration ADK (Adapter Development Kit) で提供されている ConnectionRequestInfoMap クラスを使用するか、独自のクラスを実装してインスタンス化できます。独自のクラスを実装する場合は、ConnectionSpecConnectionRequestInfoMap、および Serializable の 4 つのインタフェースを含める必要があります。

ConnectionSpec の実装

setConnectionSpec() または getConnectionSpec() を使用するには、その前に ConnectionSpec オブジェクトをインスタンス化する必要があります。これには、ADK で提供されている ConnectionRequestInfoMap クラスを使用するか、または独自のクラスを記述します。

ConnectionSpec を実装するには

  1. ADK で提供されている ConnectionRequestInfoMap クラスを使用する方法と、独自のクラスを実装する方法のいずれかを選択します。
  2. 独自の ConnectionSpec クラスを実装する場合は、次のインタフェースを追加します。

setConnectionSpec() と getConnectionSpec() の呼び出し

ConnectionSpec クラスを実装し、ConnectionSpec オブジェクトをインスタンス化したら、それらを次の ApplicationView メソッドと組み合わせて使用できます。

次のリストは、setConnectionSpec() のコードです。

コード リスト 5-1 setConnectionSpec() のコード全文

/**
* EIS への接続に使用する connectionSpec を設定する。
* 設定した ConnectionSpec は、サービスを呼び出したときに、EIS との接続に
* 使用される。この接続仕様をクリアしてデフォルトの接続パラメータを
* 使用するには、null を使ってこのメソッドを呼び出す。
*
* @params connectionCriteria EIS の接続条件。
*/
public void setConnectionSpec(ConnectionSpec connectionCriteria)
{
m_connCriteria = connectionCriteria;
}

次のリストは、setConnectionSpec() のコードです。

コード リスト 5-2 getConnectionSpec() のコード全文

/**
* setConnectionSpec で設定された ConnectionSpec を返す。
* 設定されている ConnectionSpec がない場合は、null を返す。
*
* @returns ConnectionSpec
*/
public ConnectionSpec getConnectionSpec()
{
return m_connCriteria;
}

ConnectionSpec クラスの使用

ConnectionSpec クラスを設定するには、正しく初期化された ConnectionSpec オブジェクトを ConnectionSpec クラスに渡します。ConnectionSpec クラスをクリアするには、null 値を持つ ConnectionSpec オブジェクトを ConnectionSpec クラスに渡します。

コード リスト 5-3 は、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());

 


シナリオ 2 : ビジネス プロセスのカスタム コーディング

ビジネス プロセスでアプリケーション ビューを使用する最も簡単な方法はアプリケーション ビュー コントロールを追加することですが、代わりに独自の Java コードを記述して、ビジネス プロセスを表すことができます。カスタム コードを記述する場合は、以下に示す簡単な例を参照して、独自のビジネス プロセスを記述する方法について理解するようにしてください。

アプリケーション ビューを使用するための 2 つの方法の詳細な比較については、「ビジネス プロセスの実装方法の選択」を参照してください。

このシナリオの概要

ある企業で、カスタマ リレーションシップ マネジメント (Customer Relationship Management : CRM) システムと注文処理 (Order Processing : OP) システムを使用しているものとします。経営陣は、CRM システムに新しい顧客が追加されるたびに、OP システムでも対応する顧客レコードが自動的に作成されることを望んでいます。そこで、あなたを含む企業内の Java 開発者は、これら 2 つのシステムで同期的に情報がメンテナンスされるようなビジネス プロセスを作成するよう指示されました。このビジネス ロジックは、以下に紹介する Java クラス SyncCustomerInformation によって実装されます。

この例は、カスタム コードを使って実行できることをすべて示しているわけではありません。ここでは、独自のビジネス プロセスをコーディングする際のテンプレートとして、組織のビジネス プロセスを実装するのに必要な基本手順を示します。

このシナリオでは、SyncCustomerInformation という具体的なクラスを例にとり、カスタム コードを記述する方法を示しています。一般に、ビジネス プロセスでアプリケーション ビューを使用するためのカスタム コードを作成するには、次の 2 つの手順を実行する必要があります。

  1. ビジネス プロセスの実装先アプリケーションを示す Java クラスがあることを確認する。
  2. その Java クラス内に、ビジネス ロジックを実装するコードを追加する。

始める前に

カスタム コードを記述してビジネスプロセスを実装するには、事前に次の要件を満たす必要があります。

また、このシナリオは、次の要件が満たされていることを前提としています。

SyncCustomerInformation クラスの作成

カスタム コードを記述する前に、ビジネス プロセスに必要なそれぞれのアプリケーションを表す Java クラスが存在していることを確認します。必要な Java クラスがない場合は、ここで作成します。この例では、SyncCustomerInformation という 1 つのアプリケーション クラスを呼び出します。もちろん、実際に記述するコードには別の変数名を使用します。SyncCustomerInformation Java クラスを作成するには

  1. Java アプリケーション クラスのソース コード全文については、「サンプルの Java クラスのコード」を参照してください。
  2. 注意 : 実際のプロジェクトでは、テンプレートまたは参考ガイドとして SyncCustomerInformation コードを使用してください。サンプルの SyncCustomerInformation コードには、詳細なコメントが挿入されています。

  3. East Coast.New Customer をリスンするためのコードを作成します。
  4. WebLogic Server で、NamespaceManager (変数名 m_namespaceMgr) と ApplicationViewManager (変数名 m_appViewMgr) に対する参照を取得します。この手順を実行するには、WebLogic Server で JNDI ルックアップを使用します。
  5. nm.getRootNamespace() を呼び出す NamespaceManager を使用して、ルート ネームスペースに対する参照を取得します。この参照は、変数 root に格納されます。
  6. root.getNamespaceObject("East Coast") を呼び出す root 変数を使用して、East Coast ネームスペースに対する参照を取得します。この参照は、変数 eastCoast に格納されます。
  7. eastCoast 変数を使用して、顧客管理の ApplicationView に対する一時参照を取得し、変数 custMgmtHandle に格納します。
  8. この custMgmtHandle 一時参照を使用して、顧客管理の ApplicationView インスタンスに対する参照を取得します。具体的には、ApplicationViewManageravm.getApplicationViewInstance (custMgmtHandle.getQualifiedName()) として呼び出します。返された参照を、変数 custMgmt に格納します。
  9. custMgmt.addEventListener("New Customer", listener) を呼び出し、listener を New Customer イベントに応答できるオブジェクトの名前と置き換えることにより、New Customer イベントのリスンを開始します。イベント リスナと EventListener インタフェースの詳細については、アプリケーション統合 API を参照してください。
  10. リスナ クラスの onEvent メソッドを実装します。
  11. New Customer イベントを受け取ると、リスナの onEvent メソッドが呼び出されます。

    onEvent メソッドは、イベントに応答するメソッドを呼び出します。この例では、onEvent メソッドにより、イベントに関連付けられたデータが含まれるイベント オブジェクトが取得されます。イベントに応答するために呼び出されるメソッドは、handleNewCustomer です。

  12. 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.Customer Management アプリケーション ビューの場合と同じ方法で、East Coast.Order Processing アプリケーション ビューのインスタンスに対する参照を取得する。この参照は、変数 orderProc に格納されます。
    3. handleNewCustomer が、orderProc.invokeService("Create Customer", createCustomerRequest) を呼び出すことによって、East Coast.Order Processing アプリケーション ビューに Create Customer サービスを呼び出す。ここで、createCustomerRequest は Create Customer サービスの要求ドキュメントを保持する変数であることに留意してください。このサービスの応答ドキュメントは、変数 createCustomerResponse に格納されます。
    4. handleNewCustomer が実行を終了し、次の New Customer イベントを処理できる状態になる。

    この最後の手順が終了すると、新しい Java クラス SyncCustomerInformation が作成されます。このクラスは、Sync Customer Information ビジネス ロジックを実装します。SyncCustomerInformation クラスはアプリケーション統合 API を使用して、CRM システムからイベントを取得し、OP システムでサービスを呼び出します。

サンプルの Java クラスのコード

次のコード リストは、SyncCustomerInformation Java クラスのソース コードの全文です。このコードは、概要で説明したシナリオのビジネス ロジックを実装します。このサンプルを、実際の企業のビジネス プロセスを実装するコードを作成するときのテンプレートとして活用してください。

コード リスト 5-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' ネームスペースにデプロイされているものとする。
*そのアプリケーション ビューと、ぞれぞれに要求されるイベントとサービスは、
* 次のとおりである。
*
* 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();
}
}
}

 

ナビゲーション バーのスキップ  ページの先頭 前 次