[ADOS] ADOS Developer's Site - XML Stadium
ADOS Company slogan - XML Total Solution

【1アクションPIPの開始側処理】

目次

概要

1アクションPIPの開始側処理について解説します。

PIPの開始側ではオブジェクトが図のような連携を行います。

g01.gif

PIPを開始するにはInitiationSessionを生成します。InitiationSessionはPIPプロセスのステータス情報を保持しており、StatusContainerを受け取ることにより役割を終えます。

EISとHestiaとの接続はDirectMessageExchangerを介して行います。EISとHestiaはJavaオブジェクトの形式でデータを送受信します。一方、Hestiaは、パートナーRosettaNetサーバと、RNIF仕様に基づきMIME形式にパックされたXMLデータを送受信します。

サンプルプログラム全体を以下に示します。

【PIPSender.java】

1 : import java.io.FileInputStream;
2 : import java.util.Date;
3 : import java.util.Properties;
4 : 
5 : import com.ados.hestia.parser.rnbm.access.Validator;
6 : import com.ados.hestia.parser.rnbm.exchange.Container;
7 : import com.ados.hestia.parser.rnbm.exchange.PayloadContainer;
8 : import com.ados.hestia.parser.rnbm.exchange.StatusContainer;
9 : import com.ados.hestia.parser.rnbm.model.RootElement;
10 : import com.ados.hestia.parser.rnbm.particle.DateTimeStamp;
11 : import com.ados.hestia.parser.rnbm.particle.ServiceContent;
12 : import com.ados.hestia.parser.rnbm.repository.Repository;
13 : import com.ados.hestia.sdk.Configuration;
14 : import com.ados.hestia.sdk.Connection;
15 : import com.ados.hestia.sdk.message.DirectMessageExchanger;
16 : import com.ados.hestia.sdk.rnbm.randomgenerator.RootElementGenerator;
17 : import com.ados.hestia.sdk.session.InitiationSession;
18 : import com.ados.hestia.sdk.session.Session;
19 : import com.ados.hestia.utils.UID;
20 : 
21 : public class PIPSender {
22 : 
23 :   public static void main(String[] args) {
24 :     try {
25 :       Properties prop = new Properties();
26 :       prop.load(new FileInputStream("sample.properties"));
27 :       String HOST = prop.getProperty("HOST");
28 :       String USER = prop.getProperty("USER");
29 :       String PASS = prop.getProperty("PASS");
30 :       String HANDLER_ID = prop.getProperty("HANDLER_ID");
31 :       String SENDER = prop.getProperty("SENDER");
32 :       String RECEIVER = prop.getProperty("RECEIVER");
33 : 
34 :       Connection connection = new Connection(HOST, USER, PASS,
35 :           Connection.EXCHANGE_MODE_DIRECT, null, null, null,
36 :           HANDLER_ID);
37 :       DirectMessageExchanger exchanger = new DirectMessageExchanger(
38 :           connection, Configuration.getInstance());
39 : 
40 :       RootElement re = Repository.getDefault().getResolver()
41 :           .resolveByVersion("0C1",
42 :               "Pip0C1AsynchronousTestNotification", "R01.01.00");
43 :       RootElementGenerator reg = new RootElementGenerator(re);
44 :       reg.process();
45 :       ServiceContent sc = new ServiceContent("0C1", re);
46 :       sc.setGlobalDocumentFunctionCode("Request");
47 :       sc.setDocumentGenerationDateTime(new DateTimeStamp());
48 :       sc.setDocumentIdentifier((new UID()).toString());
49 :       sc.setElementValue(
50 :           "fromRole/PartnerRoleDescription/PartnerDescription/BusinessDescription/GlobalBusinessIdentifier",
51 :               SENDER);
52 :       sc.setElementValue(
53 :           "toRole/PartnerRoleDescription/PartnerDescription/BusinessDescription/GlobalBusinessIdentifier",
54 :               RECEIVER);
55 : 
56 :       Session session = new InitiationSession(new PayloadContainer(
57 :           new Date(), SENDER, RECEIVER, (new UID()).toString(), sc,
58 :           null));
59 :       SampleUtils.printSessionState("created", session);
60 :       PayloadContainer request = session.getMessageToSend();
61 :       SampleUtils.printSessionState("got", session);
62 :       SampleUtils.printContainerInformation(request);
63 :       SampleUtils.printServiceContent(request.getServiceContent());
64 :       new Validator(request.getServiceContent().getElement()).validate();
65 :       exchanger.sendMessage(request);
66 :       SampleUtils.printSessionState("sent", session);
67 : 
68 :       int time = 0;
69 :       boolean loop = true;
70 :       while (loop) {
71 :         Thread.sleep(5000);
72 :         exchanger.hit();
73 :         SampleUtils.printSessionState("loop=" + time++, session);
74 : 
75 :         Container container = exchanger.receiveMessage();
76 :         if (container != null) {
77 :           SampleUtils.printContainerInformation(container);
78 :           session.pushStatus((StatusContainer) container);
79 :           SampleUtils.printSessionState("pushed", session);
80 :           loop = false;
81 :         }
82 :       }
83 : 
84 :     } catch (Exception e) {
85 :       e.printStackTrace();
86 :     }
87 :   }
88 : 
89 : }

SampleUtilsは状態を標準出力するユーティリティクラスです。SampleUtilsを読み飛ばしてSDKの処理のみを理解することができます。

RMIによる接続

DirectMessageExchangerはRMIによる接続を行うクラスです。また、 Connectionコンストラクタには、RMIでの接続を意味するEXCHANGE_MODE_DIRECT を指定します。また、同コンストラクタにはハンドラIDを指定します。このハンドラIDはbridgehandlers.xmlに登録されているものを指定する必要があります。

34 :       Connection connection = new Connection(HOST, USER, PASS,
35 :           Connection.EXCHANGE_MODE_DIRECT, null, null, null,
36 :           HANDLER_ID);
37 :       DirectMessageExchanger exchanger = new DirectMessageExchanger(
38 :           connection, Configuration.getInstance());
関連クラス機能
com.ados.hestia.sdk.ConnectionHestiaのネットワークアドレス等のプロパティのラッピング。
com.ados.hestia.sdk.ConfigurationSDKのコンフィギュレーションクラス。
com.ados.hestia.sdk.message.DirectMessageExchangerHestiaとRMI接続を行う。

ServiceContentの生成

PIPSender.javaでは、ServiceContentのサンプルデータを内部生成しています。ただし、実際の運用では、XMLやCSVの形式でビジネスデータをバックエンドから入力してServiceContentに構成するため、このような処理を通常行いません。

40 :       RootElement re = Repository.getDefault().getResolver()
41 :           .resolveByVersion("0C1",
42 :               "Pip0C1AsynchronousTestNotification", "R01.01.00");
43 :       RootElementGenerator reg = new RootElementGenerator(re);
44 :       reg.process();
45 :       ServiceContent sc = new ServiceContent("0C1", re);

一方、ビジネスデータ以外のドキュメントIDやドキュメント生成時間などが入力データに含まれない場合は、下記のようにEISで動的に生成して設定する必要があります。

46 :       sc.setGlobalDocumentFunctionCode("Request");
47 :       sc.setDocumentGenerationDateTime(new DateTimeStamp());
48 :       sc.setDocumentIdentifier((new UID()).toString());
49 :       sc.setElementValue(
50 :           "fromRole/PartnerRoleDescription/PartnerDescription/BusinessDescription/GlobalBusinessIdentifier",
51 :               SENDER);
52 :       sc.setElementValue(
53 :           "toRole/PartnerRoleDescription/PartnerDescription/BusinessDescription/GlobalBusinessIdentifier",
54 :               RECEIVER);

なお、ServiceContentクラスの各設定メソッドは下記のパスに対応します。

ServiceContentの設定メソッド対応するXPath入力値
setGlobalDocumentFunctionCode/*/GlobalDocumentFunctionCodeドキュメントのタイプ('要求'または'回答')
setDocumentGenerationDateTime/*/thisDocumentGenerationDateTime/DateTimeStampドキュメント生成時間
setDocumentIdentifier/*/thisDocumentIdentifier/ProprietaryDocumentIdentifierドキュメントID
setElementValue任意のパスを、ルート要素の下から指定*
関連クラス機能
com.ados.hestia.parser.rnbm.model.RootElementServiceContentのルート要素の抽象クラス。
com.ados.hestia.sdk.rnbm.randomgenerator.RootElementGeneratorルート要素を生成するクラス。
com.ados.hestia.parser.rnbm.repository.Repository
com.ados.hestia.parser.rnbm.particle.ServiceContentServiceContentを表すクラス。
com.ados.hestia.parser.rnbm.particle.DateTimeStampRosettaNet形式の時間データを表すクラス。
com.ados.hestia.utils.UIDユニークなIDを生成するクラス。

Sessionの生成

1つのSessionは1つのPIPプロセスを表します。SessionはPIPプロセスのステータス情報を保持するため、そのフラグを参照することによって疎通管理を行えます。

56 :       Session session = new InitiationSession(new PayloadContainer(
57 :           new Date(), SENDER, RECEIVER, (new UID()).toString(), sc,
58 :           null));
関連クラス機能
com.ados.hestia.sdk.session.SessionInitiationSessionの上位クラス。
com.ados.hestia.sdk.session.InitiationSession自社から送信を開始(Initiation)するセッションを表すクラス。
com.ados.hestia.parser.rnbm.exchange.PayloadContainerServiceContentを保持し、Hestiaへ渡される。

PayloadContainerの送信

SessionからPayloadContainerを取り出します。それによりSessionのステータスが更新されます。

60 :       PayloadContainer request = session.getMessageToSend();

メッセージの送信時にHestia側ではデータバリデーションを行わないため、EIS側でデータバリデーションを行う必要があります。なお、データバリデーションのルールは個々のPIP仕様に基づきます。

64 :       new Validator(request.getServiceContent().getElement()).validate();

DirectMessageExchanger#sendMessageを呼び出してPayloadContainerを入力すると、Hestiaへの送信が待機されます。そして、DirectMessageExchanger#hitが呼び出されると、Hestiaへ送信されます。

65 :       exchanger.sendMessage(request);
72 :         exchanger.hit();

なお、HestiaからパートナーRosettaNetサーバへのメッセージ送信は、EISから管理できません。また、DirectMessageExchanger#hitを起動すると、1件のPIPメッセージ送信だけでなく、その時待機している全てのメッセージの送受信を行います。

関連クラス機能
com.ados.hestia.parser.rnbm.access.Validatorデータのバリデーションを行うクラス。

StatusContainerの受信

パートナーRosettaNetサーバから受信して待機しているメッセージを、DirectMessageExchanger#hitを起動して受け取ります。受信したメッセージがあると、DirectMessageExchanger#receiveMessageにより取得できます。

72 :         exchanger.hit();
75 :         Container container = exchanger.receiveMessage();

そして、Session#pushStatusを呼び出し、受信メッセージを入力します。それによりSessionのステータスが更新されます。

78 :           session.pushStatus((StatusContainer) container);

RNIFの非同期通信においては、いつシグナルメッセージを受信するか予測できません。したがって、実際のEISプログラムにおいては、このような受信処理をループで周期的に実行させる必要があります。

関連クラス機能
com.ados.hestia.parser.rnbm.exchange.ContainerPayloadContainerおよびStatusContainerの上位クラス。
com.ados.hestia.parser.rnbm.exchange.StatusContainerシグナル情報を運ぶクラス。

添付ファイル: fileg01.gif 716件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Mon, 24 Oct 2005 17:10:44 JST (4925d)

Copyright 2005-2008. ADOS Co., Ltd. All Rights Reserved.