MessageReceiver、ServerConnectionFactory実装サービス jp.ossc.nimbus.service.publish.RequestConnectionFactoryService

jp.ossc.nimbus.service.publish.RequestConnectionFactoryServiceは、1対多の応答ありメッセージ送受信を行うMessageReceiver及びServerConnectionFactory実装サービスです。
このサービスは、要求メッセージ及び応答メッセージを送信するServerConnectionFactory実装サービスと、要求メッセージ及び応答メッセージを受信するMessageReceiver実装サービスを使用して、1対多の応答ありメッセージ送受信を行うサービスです。そのため、このサービスとは別に、送受信を行う実体となるMessageReceiver及びServerConnectionFactory実装サービスが必要となります。

このサービスを使って、メッセージを送受信するには、このサービスをServerConnectionFactoryとして取得して、ServerConnectionFactory.getServerConnection()で取得したServerConnectionをRequestServerConnectionへとキャストして使用します。

  1. import jp.ossc.nimbus.core.ServiceManagerFactory;
  2. import jp.ossc.nimbus.service.publish.ServerConnectionFactory;
  3. import jp.ossc.nimbus.service.publish.RequestServerConnection;
  4. import jp.ossc.nimbus.service.publish.Message;
  5. // ServerConnectionFactoryを取得
  6. ServerConnectionFactory scf = (ServerConnectionFactory)ServiceManagerFactory.getServiceObject("RequestConnectionFactory");
  7. // RequestServerConnectionを取得する
  8. RequestServerConnection sc = (RequestServerConnection)scf.getServerConnection();
  9. // 送信するMessageを生成する
  10. Message request = sc.createMessage("Subject", "key");
  11. request.setObject("Hello.");
  12. // 要求メッセージを送信して、応答メッセージを受信する
  13. Message[] responses = sc.request(message, 1, 1000l);
  14. System.out.println(responses[0].getObject());

このサービスを使って、要求メッセージを受信して応答メッセージを送信するには、このサービスをMessageReceiverとして取得して、java.lang.String) MessageReceiver.addSubject(MessageListener, String)を使って、RequestMessageListenerを登録しておき、RequestMessageListenerを実装します。

  1. import jp.ossc.nimbus.core.ServiceManagerFactory;
  2. import jp.ossc.nimbus.service.publish.ServerConnectionFactory;
  3. import jp.ossc.nimbus.service.publish.RequestServerConnection ;
  4. import jp.ossc.nimbus.service.publish.MessageReceiver;
  5. import jp.ossc.nimbus.service.publish.RequestMessageListener;
  6. import jp.ossc.nimbus.service.publish.Message;
  7. import jp.ossc.nimbus.service.publish.MessageException;
  8. // ServerConnectionFactoryを取得
  9. ServerConnectionFactory scf = (ServerConnectionFactory)ServiceManagerFactory.getServiceObject("RequestConnectionFactory");
  10. // RequestServerConnectionを取得する
  11. final RequestServerConnection sc = (RequestServerConnection)scf.getServerConnection();
  12. // MessageReceiverを取得
  13. MessageReceiver mr = (MessageReceiver)ServiceManagerFactory.getServiceObject("RequestConnectionFactory");
  14. // RequestMessageListenerを登録する
  15. mr.addSubject(
  16. new RequestMessageListener(){
  17. public void onMessage(Message message){}
  18. public Message onRequestMessage(
  19. Object sourceId,
  20. int sequence,
  21. Message message,
  22. String responseSubject,
  23. String responseKey
  24. ){
  25. try{
  26. System.out.println(message.getObject());
  27. // 送信する応答Messageを生成する
  28. Message response = sc.createMessage(responseSubject, responseKey);
  29. response.setObject("Hi.");
  30. return response;
  31. }catch(MessageException e){
  32. e.printStackTrace();
  33. return null;
  34. }
  35. }
  36. },
  37. "Subject"
  38. );

このサービスは、複合的なサービスで、以下のサービスを下位サービスとして使用します。

下位サービスインタフェース用途
jp.ossc.nimbus.service.publish.MessageReceiver要求メッセージ及び応答メッセージを受信するMessageReceiverとして使用する。
jp.ossc.nimbus.service.publish.ServerConnectionFactory要求メッセージ及び応答メッセージを送信するServerConnectionFactoryとして使用する。

以下に簡単なサービス定義を示します。

  1. <?xml version="1.0" encoding="Shift_JIS"?>
  2. <!DOCTYPE server PUBLIC
  3. "-//Nimbus//DTD Nimbus 1.0//JA"
  4. "http://nimbus.sourceforge.jp/dtd/nimbus-service_1_0.dtd">
  5. <server>
  6. <manager>
  7. <!-- リクエストコネクションファクトリサービス -->
  8. <service name="RequestConnectionFactory"
  9. code="jp.ossc.nimbus.service.publish.RequestConnectionFactoryService">
  10. <!-- サーバコネクションファクトリサービスのサービス名を設定する -->
  11. <attribute name="ServerConnectionFactoryServiceName">#ConnectionFactory</attribute>
  12. <!-- メッセージ受信サービスのサービス名を設定する -->
  13. <attribute name="MessageReceiverServiceName">#MessageReceiver</attribute>
  14. <depends>#ConnectionFactory</depends>
  15. <depends>#MessageReceiver</depends>
  16. </service>
  17. <!-- メッセージ受信サービス -->
  18. <service name="MessageReceiver"
  19. code="jp.ossc.nimbus.service.publish.MessageReceiverService">
  20. <attribute name="ClientConnectionFactoryServiceName">#ClusterConnectionFactory</attribute>
  21. <attribute name="StartReceiveOnStart">true</attribute>
  22. <depends>#ClusterConnectionFactory</depends>
  23. </service>
  24. <!-- クラスタコネクションファクトリサービス -->
  25. <service name="ClusterConnectionFactory"
  26. code="jp.ossc.nimbus.service.publish.ClusterConnectionFactoryService">
  27. <attribute name="JndiRepositoryServiceName">#LocalRMIRepository</attribute>
  28. <attribute name="ClientConnectionFactoryServiceName">#ConnectionFactory</attribute>
  29. <attribute name="ClusterServiceName">#Cluster</attribute>
  30. <attribute name="FlexibleConnect">true</attribute>
  31. <attribute name="Multiple">true</attribute>
  32. <depends>
  33. <!-- RMIサーバに登録するリポジトリサービス -->
  34. <service name="LocalRMIRepository"
  35. code="jp.ossc.nimbus.service.repository.RMIRepositoryService">
  36. <attribute name="CreateRegistry">true</attribute>
  37. <attribute name="Port">1099</attribute>
  38. </service>
  39. </depends>
  40. <depends>ConnectionFactory</depends>
  41. <depends>
  42. <!-- クラスタサービス -->
  43. <service name="Cluster"
  44. code="jp.ossc.nimbus.service.keepalive.ClusterService">
  45. <attribute name="MulticastGroupAddress">239.0.0.10</attribute>
  46. <attribute name="JoinOnStart">false</attribute>
  47. </service>
  48. </depends>
  49. </service>
  50. <!-- TCPコネクションファクトリサービス -->
  51. <service name="ConnectionFactory"
  52. code="jp.ossc.nimbus.service.publish.tcp.ConnectionFactoryService"/>
  53. </manager>
  54. </server>


メッセージ配信/ServerConnectionFactory
メッセージ配信/MessageReceiver