- 追加された行はこの色です。
- 削除された行はこの色です。
RIGHT:[[目次>Hestia Hacks]]|[[前>1アクションPIPの開始側処理]]|[[次>2アクションPIPの開始側処理]]
目次
#contents
*概要 [#g183d043]
1アクションPIPの回答側処理について解説します。
PIPの回答側ではオブジェクトが図のような連携を行います。
#ref(g04.gif,center)
Hestiaがパートナーからアクションメッセージを受信すると、EISとは無関係に、アクションメッセージのバリデーション後、自動的にシグナルメッセージをパートナーに送信します。さらに、HestiaはEISからStatusContainerを受信しないか、RejectのStatusContainerを受信した場合、0A1 NotificationofFailure(NOF)をパートナーに送信します。
Hestiaがパートナーからアクションメッセージを受信すると、EISとは無関係に、アクションメッセージのバリデーション後、自動的にシグナルメッセージをパートナーに送信します。さらに、HestiaはEISからStatusContainerを受信しないか、RejectのStatusContainerを受信した場合、PIP 0A1 NotificationofFailure(NOF:失敗の通知)をパートナーに送信します。
EISはHestiaからPayloadContainerを受信した後、RespondSessionを生成し、このPIPプロセスの管理を行います。HestiaにStatusContainerを送信することにより役割を終えます。
サンプルプログラム全体を以下に示します。
【PIPReceiver.java】
1 : import java.io.FileInputStream;
2 : import java.util.Properties;
3 :
4 : import com.ados.hestia.parser.rnbm.exchange.Container;
5 : import com.ados.hestia.parser.rnbm.exchange.PayloadContainer;
6 : import com.ados.hestia.parser.rnbm.exchange.StatusContainer;
7 : import com.ados.hestia.sdk.Configuration;
8 : import com.ados.hestia.sdk.Connection;
9 : import com.ados.hestia.sdk.message.DirectMessageExchanger;
10 : import com.ados.hestia.sdk.session.RespondSession;
11 : import com.ados.hestia.sdk.session.Session;
12 :
13 : public class PIPReceiver {
14 :
15 : public static void main(String[] args) {
16 : try {
17 : Properties prop = new Properties();
18 : prop.load(new FileInputStream("sample.properties"));
19 : String HOST = prop.getProperty("HOST");
20 : String USER = prop.getProperty("USER");
21 : String PASS = prop.getProperty("PASS");
22 : String HANDLER_ID = prop.getProperty("HANDLER_ID");
23 :
24 : Connection connection = new Connection(HOST, USER, PASS,
25 : Connection.EXCHANGE_MODE_DIRECT, null, null, null,
26 : HANDLER_ID);
27 : DirectMessageExchanger exchanger = new DirectMessageExchanger(
28 : connection, Configuration.getInstance());
29 :
30 : int time = 0;
31 : boolean loop = true;
32 : while (loop) {
33 : Thread.sleep(5000);
34 : SampleUtils.println("loop : " + time++);
35 : exchanger.hit();
36 :
37 : Container container = exchanger.receiveMessage();
38 : if (container != null) {
39 : SampleUtils.printContainerInformation(container);
40 : PayloadContainer request = (PayloadContainer) container;
41 : SampleUtils.printServiceContent(request.getServiceContent());
42 : Session session = new RespondSession(request
43 : .getRemotePartner(), request.getPIPID());
44 : SampleUtils.printSessionState("created", session);
45 : session.pushMessage(request);
46 : SampleUtils.printSessionState("pushed", session);
47 : session.acceptPartnerMessage();
48 : SampleUtils.printSessionState("accepted", session);
49 : StatusContainer status = session.getStatusToSend();
50 : SampleUtils.printSessionState("sent status", session);
51 : SampleUtils.printContainerInformation(status);
52 : exchanger.sendMessage(status);
53 : exchanger.hit();
54 : loop = false;
55 : }
56 : }
57 :
58 : } catch (Exception e) {
59 : e.printStackTrace();
60 : }
61 : }
62 :
63 : }
*PayloadContainerの受信 [#hec3871b]
DirectMessageExchanger#hitを呼出し後、DirectMessageExchanger#receiveMessageによりメッセージを取得します。
DirectMessageExchanger#hitを呼出し、Hestiaからのメッセージを受信します。そして、DirectMessageExchanger#receiveMessageによりメッセージを取得します。
35 : exchanger.hit();
37 : Container container = exchanger.receiveMessage();
メッセージがアクションメッセージであればPayloadContainerにキャストできます。
Hestiaからは、PayloadContainerかStatusContainerを受信する可能性があります。メッセージが、パートナーから開始されたアクションメッセージであれば、PayloadContainerにキャストできます。
40 : PayloadContainer request = (PayloadContainer) container;
|関連クラス|機能|h
|com.ados.hestia.sdk.message.DirectMessageExchanger|HestiaとRMI接続を行う。|
|com.ados.hestia.parser.rnbm.exchange.PayloadContainer|ServiceContentを保持し、Hestiaから渡される。|
|com.ados.hestia.parser.rnbm.exchange.Container|PayloadContainerおよびStatusContainerの上位クラス。|
*Sessionの生成 [#sdcb83a5]
PIPの回答側はRespondSessionによりセッションを生成します。
42 : Session session = new RespondSession(request
43 : .getRemotePartner(), request.getPIPID());
Sessionに、受信したPayloadContainerを入力します。それによりSessionのステータスが更新されます。
45 : session.pushMessage(request);
|関連クラス|機能|h
|com.ados.hestia.sdk.session.Session|InitiationSessionの上位クラス。|
|com.ados.hestia.sdk.session.RespondSession|回答側のPIPプロセスを表すクラス。|
*StatusContainerの送信 [#oa55232b]
パートナーからPIPメッセージを受信した時点で、Hestiaはデータバリデーションを行い、AcknowledgmentまたはExceptionを返信します。ここでの処理は、ハンドラによる、パートナーへ0C1を送信するか、何もしないかの制御を表します。
ここでの処理は、パートナーへ0A1を送信するか、何もしなで正常にPIPプロセスを完了するかの制御を表します。パートナーへのAcknowledgmentまたはExceptionの返信はHestiaのみで行っており、EISはその制御を行いません。
具体的には、パートナーに対して何もしない場合は、セッションのacceptPartnerMessage メソッドを呼び出します。パートナーへ0A1()を送信する場合は、*メソッドを呼び出します。これらのメソッドによりHestiaへのシグナル送信が待機され、hitメソッドにより送信が実行されます。
具体的には、正常にPIPプロセスを完了する場合は、Session#acceptPartnerMessageを呼び出します。一方、パートナーへ0A1を送信する場合は、Session#rejectPartnerMessageを呼び出します。
&color(red,※0A1の送信は、システムの処理が失敗した場合に行います。ビジネス上の受諾や拒否を意味するものではありません。);
47 : session.acceptPartnerMessage();
その後、StatusContainerを生成し、DirectMessageExchangerを介してHestiaへ送信します。
49 : StatusContainer status = session.getStatusToSend();
52 : exchanger.sendMessage(status);
53 : exchanger.hit();
|関連クラス|機能|h
|com.ados.hestia.sdk.message.DirectMessageExchanger|HestiaとRMI接続を行う。|
|com.ados.hestia.parser.rnbm.exchange.StatusContainer|シグナル情報を運ぶ。|