RabbitMQを使ってみた
はじめに
RabbitMQを試すためにやったことを記載する。 Queueを使う機会がなかったが仕事で使うことがあったので プライベートで改めて使ってみる。
RabbitMQとは
公式サイト
検証環境
確認を行った環境は以下の通り。 ・端末: ・RabbitMQ:adminはhomebrewで入れた ・ProducerおよびConsumerの実装: Java11 Gradle
ローカル環境に環境構築
環境用意
まずはhomebrewでRabbitMQを入れる。
brew install rabbitmq
起動コマンド
完了後に以下コマンドで起動できる。
/usr/local/sbin/rabbitmq-server
起動確認
起動後の確認は以下コマンドで。
/usr/local/sbin/rabbitmqctl status
停止
停止は以下コマンドでできる。
/usr/local/sbin/rabbitmqctl stop
起動した管理画面のURL
ローカル環境の管理画面へのアクセスは以下のURLになっているはず。
他情報
他の情報は以下の公式サイトを参照したい。 www.rabbitmq.com
環境用意まとめ
ここまでで、Messageの送信先が構築できた。 次に実際にMessageを送る実装をする。
Producerを実装
Javaで実装を行う。 RabbitMQにMessageを送るメインの部分はRabbitMQの提供しているライブラリを利用して行う。 今回の方法とは別にSpringを使う場合はより簡潔に実装ができるようなので それを別の記事で書きたい。
実装
ライブラリを使った実装をする。今回はビルドをGradleを使って行う。 build.gradleに以下のように記述すればライブラリの設定はできる。
gradleの設定
dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compile 'com.rabbitmq:amqp-client:5.9.0' }
※詳細は以下参照 www.rabbitmq.com
build.gradleの全体は以下のようになる。
plugins { id 'java' } group 'sample' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compile 'com.rabbitmq:amqp-client:5.9.0' }
Javaの実装
以下のように実装した(コメントの部分はあえて残してみた。設定しなくてもRabbitMQサーバがデフォルト設定、かつローカルホストへの接続の場合は問題ない。)
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.io.IOException; import java.util.concurrent.TimeoutException; public class ProducerSample { public static void main(String[] args) { ConnectionFactory factory = new ConnectionFactory(); // "guest"/"guest" by default, limited to localhost connections factory.setUsername("guest"); factory.setPassword("guest"); // factory.setVirtualHost(virtualHost); // factory.setHost(hostName); // factory.setPort(portNumber); try { Connection conn = factory.newConnection(); Channel channel = conn.createChannel(); String exchangeName = "q.test"; String queueName = "q.test"; String routingKey = ""; channel.exchangeDeclare(exchangeName, "direct", true); channel.queueDeclare(queueName, true, false, false, null); channel.queueBind(queueName, exchangeName, routingKey); byte[] messageBodyBytes = "Hello, world!".getBytes(); channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes); channel.close(); conn.close(); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } }
アプリケーションを実行する
実装するとRabbitMQの管理画面上のQueueにMessageがあるはず。
Consumerを実装
Producerと同様にJavaで実装を行う。 実装方法も同様にライブラリを使う。
実装
import com.rabbitmq.client.*; import java.io.IOException; import java.util.concurrent.TimeoutException; public class ConsumerSample { public static void main(String[] args) { ConnectionFactory factory = new ConnectionFactory(); factory.setUsername("guest"); factory.setPassword("guest"); try { Connection conn = factory.newConnection(); Channel channel = conn.createChannel(); String queueName = "q.test"; channel.queueDeclare(queueName, true, false, false, null); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println("Received '" + message + "'"); } }; channel.basicConsume(queueName, true, consumer); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } }
アプリケーションを実装する。
実装すると先程、Queueに登録しておいたMessageが取得され、コンソールに出力される。
まとめ
RabbitMQを自分の端末に用意し、Queueへの登録、Queueからの取得を行った。 今回は簡単な処理を実装してみた。 RabbitMQにはExchangeという仕組みがあり、その仕組についてはあまり触れていないため 別の機会に実施したい。