[応用機能]メッセージ配信

アプリケーション開発において、複数のサーバ間で、1対多でメッセージのやりとりが必要とされる場合があります。

メッセージの送信者は、ServerConnectionFactoryからServerConnectionを取得して、メッセージを送信します。その際、メッセージには、論理的な宛先であるサブジェクトと、そのサブジェクト内でのキーを指定します。同一サブジェクト、同一キーのメッセージは到達順序が保証されます。

メッセージの受信者は、ClientConnectionFactoryからClientConnectionを取得して、MessageListenerを登録して、メッセージを受信します。MessageListenerの登録時に、サブジェクトとキーを指定して受信するメッセージを指定します。
1つのサーバに複数の受信者がいる場合は、MessageReceiverを使う事で、単独の接続を共有して、各受信者毎の受信したいサブジェクト及びキーを管理して受信する事ができます。

ServerConnectionClientConnectionを使った送受信は、送信者が一方的に複数の受信者にメッセージを送信するものですが、RequestServerConnectionRequestMessageListenerを使うと、送信者が複数の受信者にメッセージを送り、受信者は応答を返し、送信者が同期的及び非同期的に応答を受け取る事ができます。

通信プロトコルとしては、TCP、UDPユニキャスト、UDPマルチキャスト及びブロードキャストをサポートします。

関連するパッケージは、以下です。

アプリケーション向けインタフェース ServerConnectionFactory

アプリケーション向けインタフェースServerConnectionFactoryを使った簡単なアプリケーションのサンプルを示します。

  1. import jp.ossc.nimbus.core.ServiceManagerFactory;
  2. import jp.ossc.nimbus.service.publish.ServerConnectionFactory;
  3. import jp.ossc.nimbus.service.publish.ServerConnection;
  4. import jp.ossc.nimbus.service.publish.Message;
  5. // ServerConnectionFactoryを取得
  6. ServerConnectionFactory scf = (ServerConnectionFactory)ServiceManagerFactory.getServiceObject("ConnectionFactory");
  7. // ServerConnectionを取得する
  8. ServerConnection sc = scf.getServerConnection();
  9. // 送信するMessageを生成する
  10. Message message = sc.createMessage("Subject", "key");
  11. message.setObject("Hello.");
  12. // 送信する
  13. sc.send(message);

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.publish.tcp.ConnectionFactoryServiceTCPでメッセージを送受信する
jp.ossc.nimbus.service.publish.udp.ConnectionFactoryServiceUDPでメッセージを送受信する
jp.ossc.nimbus.service.publish.DistributedConnectionFactoryService論理的に1つの接続を複数の接続を使って送受信する
jp.ossc.nimbus.service.publish.GroupConnectionFactoryService複数の接続を1つの接続に見せかけて送受信する
jp.ossc.nimbus.service.publish.RequestConnectionFactoryService1対多で要求/応答のメッセージを送受信する

アプリケーション向けインタフェース ClientConnectionFactory

アプリケーション向けインタフェースClientConnectionFactoryを使った簡単なアプリケーションのサンプルを示します。

  1. import jp.ossc.nimbus.core.ServiceManagerFactory;
  2. import jp.ossc.nimbus.repository.Repository;
  3. import jp.ossc.nimbus.service.publish.ClientConnectionFactory;
  4. import jp.ossc.nimbus.service.publish.ClientConnection;
  5. import jp.ossc.nimbus.service.publish.Message;
  6. import jp.ossc.nimbus.service.publish.MessageListener;
  7. import jp.ossc.nimbus.service.publish.MessageException;
  8. // ClientConnectionFactoryを取得
  9. // 取得方法は、ClientConnectionFactory実装サービスに依存する
  10. Repository repository = (Repository)ServiceManagerFactory.getServiceObject("JndiRepository");
  11. ClientConnectionFactory ccf = (ClientConnectionFactory)repository.get("publish/ClientConnectionFactory");
  12. // ClientConnectionを取得する
  13. ClientConnection cc = ccf.getClientConnection();
  14. // 接続する
  15. cc.connect();
  16. // 受信するサブジェクト及びキーを登録する
  17. cc.addSubject("Subject", new String[]{"key"});
  18. // MessageListenerを設定する
  19. cc.setMessageListener(
  20. new MessageListener(){
  21. public void onMessage(Message message){
  22. try{
  23. System.out.println(message.getObject());
  24. }catch(MessageException e){
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. );
  30. // 受信を開始する
  31. cc.startReceive();

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.publish.tcp.ConnectionFactoryServiceTCPでメッセージを送受信する
jp.ossc.nimbus.service.publish.udp.ConnectionFactoryServiceUDPでメッセージを送受信する
jp.ossc.nimbus.service.publish.DistributedConnectionFactoryService論理的に1つの接続を複数の接続を使って送受信する
jp.ossc.nimbus.service.publish.GroupConnectionFactoryService複数の接続を1つの接続に見せかけて送受信する
jp.ossc.nimbus.service.publish.GroupClientConnectionFactoryService受信者側で複数の接続を1つの接続に見せかけて受信する
jp.ossc.nimbus.service.publish.ClusterConnectionFactoryServiceClientConnectionFactoryをクラスタ化する
jp.ossc.nimbus.service.publish.ClusterClientConnectionFactoryServicejp.ossc.nimbus.service.publish.ClusterConnectionFactoryServiceによってクラスタ化されたClientConnectionFactoryにアクセスする受信者側サービス

アプリケーション向けインタフェース MessageReceiver

アプリケーション向けインタフェースMessageReceiverを使った簡単なアプリケーションのサンプルを示します。

  1. import jp.ossc.nimbus.core.ServiceManagerFactory;
  2. import jp.ossc.nimbus.service.publish.MessageReceiver;
  3. import jp.ossc.nimbus.service.publish.Message;
  4. import jp.ossc.nimbus.service.publish.MessageListener;
  5. import jp.ossc.nimbus.service.publish.MessageException;
  6. // MessageReceiverを取得
  7. MessageReceiver mr = (MessageReceiver)ServiceManagerFactory.getServiceObject("MessageReceiver");
  8. // 接続する
  9. mr.connect();
  10. // MessageListenerが受信するサブジェクト及びキーを登録する
  11. mr.addSubject(
  12. new MessageListener(){
  13. public void onMessage(Message message){
  14. try{
  15. System.out.println(message.getObject());
  16. }catch(MessageException e){
  17. e.printStackTrace();
  18. }
  19. }
  20. },
  21. "Subject",
  22. new String[]{"key"}
  23. );
  24. // 受信を開始する
  25. mr.startReceive();

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.publish.MessageReceiverService複数の受信者を管理してメッセージを受信する
jp.ossc.nimbus.service.publish.RequestConnectionFactoryService要求メッセージを受信する
jp.ossc.nimbus.service.publish.MessageForwardingServiceメッセージを転送する

サンプルは、以下。