Symfoware

Symfowareについての考察blog

RabbitMQにJavaクライアントからメッセージを送信、受信する

Debian 7にRabbitMQ 3.3.5をインストールして、
Webインターフェースを有効にしてみました。

RabbitMQ 3.3.5をDebian 7にapt-getでインストールする
RabbitMQ Web Interfaceの有効化とログインユーザー

オフィシャルで提供されているJavaクライアントからメッセージの送受信を行ってみます。




開発環境の準備



ライブラリのjarファイルはこちらからダウンロードしました。
http://www.rabbitmq.com/download.html

467_01.png


ダウンロードしたrabbitmq-java-client-bin-3.3.5.zipの内容を見てみるとこんな感じ。

467_02.png


必要なファイルは
・commons-cli-1.1.jar
・commons-io-1.2.jar
・rabbitmq-client.jar
の3つです。

ビルドパスに追加しておきます。

467_03.png




メッセージ送信サンプル



このチュートリアルの写経です。
http://www.rabbitmq.com/tutorials/tutorial-one-java.html

"hello"というキュー名に対して"Hello World!"というメッセージを送っています。

・Send.java


  1. package sample;
  2. import com.rabbitmq.client.ConnectionFactory;
  3. import com.rabbitmq.client.Connection;
  4. import com.rabbitmq.client.Channel;
  5. // Rabbit MQ送信サンプル
  6. public class Send {
  7.     private final static String QUEUE_NAME = "hello";
  8.     public static void main(String[] argv) throws java.io.IOException {
  9.         
  10.         // Rabbit MQとのチャンネルを確立
  11.         ConnectionFactory factory = new ConnectionFactory();
  12.         factory.setHost("192.168.1.12");
  13.         
  14.         // ユーザーを作成した場合は必須
  15.         factory.setUsername("symfo");
  16.         factory.setPassword("P@ssw0rd");
  17.         
  18.         Connection connection = factory.newConnection();
  19.         Channel channel = connection.createChannel();
  20.         
  21.         // "hello"というキューを使用
  22.         // "Hello World!"というメッセージを送信する
  23.         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  24.         String message = "Hello World!";
  25.         channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  26.         System.out.println(" [x] Sent '" + message + "'");
  27.         
  28.         // チャンネルを閉じる
  29.         channel.close();
  30.         connection.close();
  31.     }
  32. }




ユーザー名とパスワードを指定している点がサンプルと異なります。

RabbitMQ Web Interfaceの有効化とログインユーザー

ここでユーザーを作ってしまったことが原因なのか、
ユーザー、パスワードを指定しないとこんなエラーになりました。


Exception in thread "main" com.rabbitmq.client.AuthenticationFailureException:
ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:338)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:590)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:612)
at sample.Send.main(Send.java:18)




ユーザーを削除してみても、


# rabbitmqctl delete_user symfo



エラーが解消できなかったので諦めました。

実行すると、こんな文字列がコンソールに表示されるはずです。


[x] Sent 'Hello World!'




管理画面でQueuesタブを確認すると、「Ready」が1になっています。

467_04.png





メッセージ受信サンプル



メッセージを受信するサンプルはこのようになりました。

・Recv.java


  1. package sample;
  2. import com.rabbitmq.client.ConnectionFactory;
  3. import com.rabbitmq.client.Connection;
  4. import com.rabbitmq.client.Channel;
  5. import com.rabbitmq.client.QueueingConsumer;
  6. //Rabbit MQ受信サンプル
  7. public class Recv {
  8.     
  9.     private final static String QUEUE_NAME = "hello";
  10.     public static void main(String[] argv) throws java.io.IOException,
  11.             java.lang.InterruptedException {
  12.         
  13.         // Rabbit MQとのチャンネルを確立
  14.         ConnectionFactory factory = new ConnectionFactory();
  15.         factory.setHost("192.168.1.12");
  16.         
  17.         // ユーザーを作成した場合は必須
  18.         factory.setUsername("symfo");
  19.         factory.setPassword("P@ssw0rd");
  20.         
  21.         Connection connection = factory.newConnection();
  22.         Channel channel = connection.createChannel();
  23.         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  24.         System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
  25.         QueueingConsumer consumer = new QueueingConsumer(channel);
  26.         channel.basicConsume(QUEUE_NAME, true, consumer);
  27.         while (true) {
  28.             QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  29.             String message = new String(delivery.getBody());
  30.             System.out.println(" [x] Received '" + message + "'");
  31.         }
  32.     }
  33. }





実行してみると、ちゃんとHello World!が受信できています。

[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'

※このプログラムは終了しないので、強制終了させます。


管理画面を確認すると、「Ready」が0に戻りました。

467_05.png
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/09/06(土) 18:44:27|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<RabbitMQでキューの内容を永続化する | ホーム | RabbitMQ Web Interfaceの有効化とログインユーザー>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1487-7afcb8b4
この記事にトラックバックする(FC2ブログユーザー)