[ADOS] ADOS Developer's Site - XML Stadium
ADOS Company slogan - XML Total Solution
RIGHT:[[目次>Hestia Hacks]]|[[前>本ガイドとサンプルについて]]|[[次>1アクションPIPの回答側処理]]

目次

#contents

*概要 [#i6e1057e]

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

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

#ref(g01.gif,center)

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

EISとHestiaとの接続はDirectMessageExchangerを介して行います。EISとHestiaはJavaオブジェクトの形式でデータを送受信します。一方、Hestiaは、パートナーRossetaNetサーバと、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による接続 [#wd97e796]

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());


|関連クラス|機能|h
|com.ados.hestia.sdk.Connection|Hestiaのネットワークアドレス等のプロパティのラッピング。|
|com.ados.hestia.sdk.Configuration|SDKのコンフィギュレーションクラス。|
|com.ados.hestia.sdk.message.DirectMessageExchanger|HestiaとRMI接続を行う。|

*ServiceContentの生成 [#n5be4ae0]

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|入力値|h
|setGlobalDocumentFunctionCode|/*/GlobalDocumentFunctionCode|ドキュメントのタイプ('要求'または'回答')|
|setDocumentGenerationDateTime|/*/thisDocumentGenerationDateTime/DateTimeStamp|ドキュメント生成時間|
|setDocumentIdentifier|/*/thisDocumentIdentifier/ProprietaryDocumentIdentifier|ドキュメントID|
|setElementValue|任意のパスを、ルート要素の下から指定|*|

CENTER:_

|関連クラス|機能|h
|com.ados.hestia.parser.rnbm.model.RootElement|ServiceContentのルート要素の抽象クラス。|
|com.ados.hestia.sdk.rnbm.randomgenerator.RootElementGenerator|ルート要素を生成するクラス。|
|com.ados.hestia.parser.rnbm.repository.Repository||
|com.ados.hestia.parser.rnbm.particle.ServiceContent|ServiceContentを表すクラス。|
|com.ados.hestia.parser.rnbm.particle.DateTimeStamp|RossetaNet形式の時間データを表すクラス。|
|com.ados.hestia.utils.UID|ユニークなIDを生成するクラス。|

*Sessionの生成 [#k23dfe24]

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

 56 :       Session session = new InitiationSession(new PayloadContainer(
 57 :           new Date(), SENDER, RECEIVER, (new UID()).toString(), sc,
 58 :           null));

|関連クラス|機能|h
|com.ados.hestia.sdk.session.Session|InitiationSessionの上位クラス。|
|com.ados.hestia.sdk.session.InitiationSession|自社から送信を開始(Initiation)するセッションを表すクラス。|
|com.ados.hestia.parser.rnbm.exchange.PayloadContainer|ServiceContentを保持し、Hestiaへ渡される。|

*PayloadContainerの送信 [#edf97b7e]

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

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

*StatusContainerの受信 [#i71f86ae]

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

 72 :         exchanger.hit();

 75 :         Container container = exchanger.receiveMessage();

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

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

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

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

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

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