RabbitMQを使ってみた

はじめに

RabbitMQを試すためにやったことを記載する。 Queueを使う機会がなかったが仕事で使うことがあったので プライベートで改めて使ってみる。

RabbitMQとは

公式サイト

www.rabbitmq.com

検証環境

確認を行った環境は以下の通り。 ・端末: ・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になっているはず。

http://localhost:15672/

他情報

他の情報は以下の公式サイトを参照したい。 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があるはず。

f:id:set21set21:20200518205028j:plain
登録した後のイメージ

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という仕組みがあり、その仕組についてはあまり触れていないため 別の機会に実施したい。