- 追加された行はこの色です。
- 削除された行はこの色です。
RIGHT:[[目次>Hestia Hacks]]|[[前>2アクションPIPの開始側処理]]|[[次>JMSによるHestiaとの接続]]
#freeze
RIGHT:[[目次>Hestia Hacks#SDKDevDuide]]|[[前>2アクションPIPの開始側処理]]|[[次>JMSによるHestiaとの接続]]
目次
#contents
*概要 [#kdcea949]
2アクションPIPの回答側処理について解説します。
2アクションPIPの回答側処理は、1アクションの回答処理と1アクションの開始処理を合わせたものとなり、処理プログラムの記述はほぼ同様です。ただし、2アクションPIPの1プロセスを通じて、同一のSessionオブジェクトが使用されます。
サンプルプログラム全体を以下に示します。
【PIPReceiver2Action.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.parser.rnbm.model.RootElement;
8 : import com.ados.hestia.parser.rnbm.particle.ServiceContent;
9 : import com.ados.hestia.parser.rnbm.repository.Repository;
10 : import com.ados.hestia.sdk.Configuration;
11 : import com.ados.hestia.sdk.Connection;
12 : import com.ados.hestia.sdk.message.DirectMessageExchanger;
13 : import com.ados.hestia.sdk.rnbm.randomgenerator.RootElementGenerator;
14 : import com.ados.hestia.sdk.session.RespondSession;
15 : import com.ados.hestia.sdk.session.Session;
16 : import com.ados.hestia.utils.UID;
17 : import com.ados.hestia.parser.rnbm.particle.DateTimeStamp;
18 :
19 : public class PIPReceiver2Action {
20 :
21 : public static void main(String[] args) {
22 : try {
23 : Properties prop = new Properties();
24 : prop.load(new FileInputStream("sample.properties"));
25 : String HOST = prop.getProperty("HOST");
26 : String USER = prop.getProperty("USER");
27 : String PASS = prop.getProperty("PASS");
28 : String HANDLER_ID = prop.getProperty("HANDLER_ID");
29 :
30 : Connection connection = new Connection(HOST, USER, PASS,
31 : Connection.EXCHANGE_MODE_DIRECT, null, null, null,
32 : HANDLER_ID);
33 : DirectMessageExchanger exchanger = new DirectMessageExchanger(
34 : connection, Configuration.getInstance());
35 :
36 : Session session = null;
37 : int time = 0;
38 : boolean loop = true;
39 : while (loop) {
40 : Thread.sleep(5000);
41 : exchanger.hit();
42 : SampleUtils.printSessionState("loop=" + time++, session);
43 :
44 : Container container = exchanger.receiveMessage();
45 : if (container != null) {
46 : SampleUtils.printContainerInformation(container);
47 : PayloadContainer request = (PayloadContainer) container;
48 : SampleUtils.printServiceContent(request.getServiceContent());
49 : session = new RespondSession(request.getRemotePartner(),
50 : request.getPIPID());
51 : SampleUtils.printSessionState("created", session);
52 : session.pushMessage(request);
53 : SampleUtils.printSessionState("pushed", session);
54 : session.acceptPartnerMessage();
55 : SampleUtils.printSessionState("accepted", session);
56 : StatusContainer status = session.getStatusToSend();
57 : SampleUtils.printSessionState("sent status", session);
58 : SampleUtils.printContainerInformation(status);
59 : exchanger.sendMessage(status);
60 : exchanger.hit();
61 :
62 : SampleUtils.printContainerInformation(session
63 : .getPartnerMessage());
64 : RootElement element = Repository.getDefault().getResolver()
65 : .resolveByPeer(
66 : request.getServiceContent().getElement());
67 : RootElementGenerator reg = new RootElementGenerator(element);
68 : reg.process();
69 : ServiceContent sc = new ServiceContent(request
70 : .getServiceContent().getPIPID(), element);
71 : sc.setGlobalDocumentFunctionCode("Response");
72 : sc.setDocumentGenerationDateTime(new DateTimeStamp());
73 : sc.setDocumentIdentifier((new UID()).toString());
74 : session.setLocalMessage(new PayloadContainer(null, request
75 : .getLocalPartner(), request.getRemotePartner(),
76 : request.getPipInstanceID(), sc, null));
77 : SampleUtils.printSessionState("set msg", session);
78 : PayloadContainer response = session.getMessageToSend();
79 : SampleUtils.printContainerInformation(response);
80 : SampleUtils.printSessionState("sent msg", session);
81 : SampleUtils.printServiceContent(response
82 : .getServiceContent());
83 : exchanger.sendMessage(response);
84 : exchanger.hit();
85 : loop = false;
86 : }
87 : }
88 :
89 : loop = true;
90 : while (loop) {
91 : Thread.sleep(5000);
92 : exchanger.hit();
93 : SampleUtils.printSessionState("loop=" + time++, session);
94 :
95 : Container container = exchanger.receiveMessage();
96 : if (container != null) {
97 : SampleUtils.printContainerInformation(container);
98 : session.pushStatus((StatusContainer) container);
99 : SampleUtils.printSessionState("pushed", session);
100 : loop = false;
101 : }
102 : }
103 : } catch (Exception e) {
104 : e.printStackTrace();
105 : }
106 : }
107 :
108 : }
*Sessionの使用 [#q2469f6a]
RespondSessionによりセッションオブジェクトを生成し、そのオブジェクトにより4メッセージの処理を行います。RespondSessionは最初のPayloadContainerの受信後に生成します。
PayloadContainerの受信
44 : Container container = exchanger.receiveMessage();
47 : PayloadContainer request = (PayloadContainer) container;
Sessionの生成
49 : session = new RespondSession(request.getRemotePartner(),
50 : request.getPIPID());
受信したPayloadContainerの入力
52 : session.pushMessage(request);
送信するStatusContainerの取得
54 : session.acceptPartnerMessage();
56 : StatusContainer status = session.getStatusToSend();
送信するPayloadContainerの設定と取得
74 : session.setLocalMessage(new PayloadContainer(null, request
75 : .getLocalPartner(), request.getRemotePartner(),
76 : request.getPipInstanceID(), sc, null));
78 : PayloadContainer response = session.getMessageToSend();
受信したStatusContainerの入力
95 : Container container = exchanger.receiveMessage();
98 : session.pushStatus((StatusContainer) container);