CodeZine(コードジン)

特集ページ一覧

RabbitMQの導入と、Spring AMQPを利用したメッセージ送受信

Spring AMQP×RabbitMQで始めるメッセージキューイング 第1回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/12/28 14:00

目次

依存関係のセットアップ

 今回はMavenを利用してライブラリの依存関係を管理します。テンプレートを利用してプロジェクトを新規作成すると、Mavenの設定ファイルである「pom.xml」がプロジェクトフォルダ直下に作成されています。このファイルに必要なライブラリの定義を追加します。まず「pom.xml」を開いてください。

 定義内容の概要が表示されます。初期状態では利用するSpringフレームワークのバージョンが少し古いので、最新のものを利用するように変更します。

 「Properties」に表示されている「spring.framework.version」という項目をダブルクリックします。開いたウィンドウの「Value」に「3.2.0.RELEASE」と入力してウィンドウを閉じ、保存します。そうすると自動的にバージョンが3.2.0.RELEASEのSpringフレームワーク関連のjarファイルがダウンロードされます。

 続いてSpring AMQPの依存関係を定義します。「pom.xml」に以下の定義を追加します。

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
(中略)
<dependencies>
(中略)
    <dependency>
        <groupId>org.springframework.amqp</groupId> 
        <artifactId>spring-amqp</artifactId>
        <version>1.1.3.RELEASE</version> 
    </dependency>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-rabbit</artifactId>
        <version>1.1.3.RELEASE</version>
    </dependency>
</dependencies>
(中略)
</project>

configurationクラスの用意

 Springでは伝統的にXMLファイルによってコンテナの各種設定を行うことが多いのですが、今回は「Java-based container configuration」という方法で設定を行います。

 「Java-based container configuration」とは、簡単に言えばアノテーションを用いてJavaのクラスによって設定を行なっていくというものです。コンテナの起動時に@Configurationというアノテーションが付与されたクラスを読み込ませることで設定がコンテナに反映されます。Springの特徴とも言えるBean定義は@Beanというアノテーションを付与したメソッドで定義していきます。

 では実際に見ていきましょう。

Configurationクラスの宣言
import org.springframework.context.annotation.Configuration;

@Configuration
public class SampleConfig {

 今回はコンフィグレーション用のクラスとして、SampleConfigというものを用意しました。クラス宣言に対して@Configurationというアノテーションを付与しています。こうすることで、このクラスはコンフィグレーション用クラスであることを宣言しています。

 続いてConnectionFactoryをBeanとして定義します。

ConnnectionFactoryの定義
@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
    connectionFactory.setUsername("guest");
    connectionFactory.setPassword("guest");
    return connectionFactory;
}

 メソッドの宣言に対して@Beanというアノテーションを付与しています。こうすることでここでインスタンス化したConnectionFactoryがconnectionFactoryという名前のBeanとしてコンテナ内で実行されるクラスから参照可能になります。

RabbitTemplateの定義
@Bean
public AmqpAdmin amqpAdmin() {
    return new RabbitAdmin(connectionFactory());
}

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate template = new RabbitTemplate(connectionFactory());
    template.setRoutingKey("sample_queue");
    template.setQueue("sample_queue");
    return template;
}

 まずはキューやバインディングの管理を行うAmqpAdminインターフェースを、RabbitAdminクラスを用いてBeanとして登録します。続いてRabbitMQと実際にやり取りを行うためのテンプレートクラスであるRabbitTemplateをBeanとして定義します。実際のアプリケーションクラスからは、このRabbitTemplateを利用してメッセージ送受信を行なっていくことになります。

 先ほど定義したConnectionFactoryを利用してRabbitTemplateを初期化します。その後、接続先となるキューの名称とルーティングキーをセットします。

キューの生成
@Bean
public Queue helloWorldQueue() {
    return new Queue("sample_queue");
}

 最後に、今回サンプルで利用するキューの生成を行います。キュー名を指定してQueueクラスを初期化します。これでコンテナの設定はひとまず完了です。

 続いて実際に送受信を行う処理を記述していきましょう。まずは送信側を準備します。新たにSenderというクラスを作成し、mainメソッド内でコンテナの起動とメッセージの送信処理を行います。

Sender.java
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Sender {
    public static void main(String[] args){
        ApplicationContext context = new AnnotationConfigApplicationContext(SampleConfig.class);
        AmqpTemplate amqpTemplate = context.getBean(RabbitTemplate.class);
        amqpTemplate.convertAndSend("Hello world");
        System.out.println("Sent message.");
    }
}

 まず先ほど作成したConfigurationクラスを、引数にしてアプリケーションコンテキストを作成します。その後、getBeanメソッドで先程Configurationクラスに宣言したテンプレートクラスを取得します。メッセージの送信そのものはconvertAndSendメソッドで行います。このメソッド名にある「convert」ですが、これが何を意味するかは後ほど解説いたします。

 続けて、Receiverというクラスを新たに用意してメッセージの取り出し処理を記述していきます。

Receiver.class
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Receiver {
    public static void main(String[] args){
        ApplicationContext context = new AnnotationConfigApplicationContext(SampleConfig.class);
        AmqpTemplate amqpTemplate = context.getBean(RabbitTemplate.class);
        String message = (String)amqpTemplate.receiveAndConvert();
        System.out.println("Receive: " + message);
    }
}

 こちらもSenderと同様にアプリケーションコンテキストを作成してAmqpTemplateを取得します。メッセージの取り出しそのものはAmqpTemplateクラスのreceiveAndConvertクラスで行えます。

 では実際に、Receiverを起動した状態でSenderを実行してみてください。Receiverの標準出力に"Hello world"の文字列が出力されれば成功です。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Spring AMQP×RabbitMQで始めるメッセージキューイング

著者プロフィール

  • 西谷 圭介(ニシタニ ケイスケ)

    TIS株式会社所属。金融系基幹システムの開発等に従事したのち、サービス企画・開発を担当。IaaS開発を経て、現在はアプリ開発者のためのPaaS「eXcale」の開発責任者兼プログラマとして活動中。 Twitter:@Keisuke69 eXcale:http://www.excale.net...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5