Symfoware

Symfowareについての考察blog

RabbitMQでキューの内容を永続化する

RabbitMQ + Javaでメッセージの送受信を行ってみました。
RabbitMQにJavaクライアントからメッセージを送信、受信する

キューの内容が永続化されるか確認してみます。


実験



前回作成したSend.javaを実行してキューを登録した状態にしておきます。

468_01.png


ここでサーバーを停止。


# shutdown -h now




再度サーバーを起動すると、キューが消えました・・・

468_02.png




キューの永続化



サーバーの設定かな?と思っていたのですが、プログラムに問題がありました。

こちらを参考に、キューの保存時の引数に問題ありと。
RabbitMQ を OSX + Homebrew + Java で使ってみる


修正したSend.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.MessageProperties;
  6. // Rabbit MQ送信サンプル
  7. public class Send {
  8.     private final static String QUEUE_NAME = "hello";
  9.     public static void main(String[] argv) throws java.io.IOException {
  10.         
  11.         // Rabbit MQとのチャンネルを確立
  12.         ConnectionFactory factory = new ConnectionFactory();
  13.         factory.setHost("192.168.1.12");
  14.         
  15.         // ユーザーを作成した場合は必須
  16.         factory.setUsername("symfo");
  17.         factory.setPassword("P@ssw0rd");
  18.         
  19.         Connection connection = factory.newConnection();
  20.         Channel channel = connection.createChannel();
  21.         
  22.         // "hello"というキューを使用
  23.         // "Hello World!"というメッセージを送信する
  24.         //channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  25.         // 第二引数にtrueを指定して永続化
  26.         channel.queueDeclare(QUEUE_NAME, true, false, false, null);
  27.         
  28.         String message = "Hello World!";
  29.         
  30.         // 第三引数で永続化の方式を指定
  31.         //channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  32.         channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
  33.         System.out.println(" [x] Sent '" + message + "'");
  34.         
  35.         // チャンネルを閉じる
  36.         channel.close();
  37.         connection.close();
  38.     }
  39. }





以下の二箇所を変更しています。


  1. channel.queueDeclare(QUEUE_NAME, true, false, false, null);
  2. channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());





修正した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.         //第二引数をtrueに変更
  24.         //channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  25.         channel.queueDeclare(QUEUE_NAME, true, false, false, null);
  26.         
  27.         System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
  28.         QueueingConsumer consumer = new QueueingConsumer(channel);
  29.         channel.basicConsume(QUEUE_NAME, true, consumer);
  30.         while (true) {
  31.             QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  32.             String message = new String(delivery.getBody());
  33.             System.out.println(" [x] Received '" + message + "'");
  34.         }
  35.     }
  36. }






以下の箇所を変更しています。


  1. channel.queueDeclare(QUEUE_NAME, true, false, false, null);





helloというキュー名が残っているとエラーになります。
(途中でタイプを変更できないため)

一回サーバーを再起動して、キューがない状態にしました。


改めて、Send.javaを実行。
「D」というアイコンが表示された状態でキューが登録されました。

468_03.png


サーバーを再起動。


# shutdown -r now




管理画面をみると、ちゃんとキューが残っています。
もちろんRecv.javaを実行しての取り出しも行えました。

468_04.png

関連記事

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

  1. 2014/09/06(土) 19:03:22|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<RabbitMQにPythonクライアント(pika)からメッセージを送信、受信する | ホーム | RabbitMQにJavaクライアントからメッセージを送信、受信する>>

コメント

コメントの投稿


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

トラックバック

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