依存関係のセットアップ
今回は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」に以下の定義を追加します。
<?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というアノテーションを付与したメソッドで定義していきます。
では実際に見ていきましょう。
import org.springframework.context.annotation.Configuration;
@Configuration
public class SampleConfig {
今回はコンフィグレーション用のクラスとして、SampleConfigというものを用意しました。クラス宣言に対して@Configurationというアノテーションを付与しています。こうすることで、このクラスはコンフィグレーション用クラスであることを宣言しています。
続いてConnectionFactoryをBeanとして定義します。
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
return connectionFactory;
}
メソッドの宣言に対して@Beanというアノテーションを付与しています。こうすることでここでインスタンス化したConnectionFactoryがconnectionFactoryという名前のBeanとしてコンテナ内で実行されるクラスから参照可能になります。
@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メソッド内でコンテナの起動とメッセージの送信処理を行います。
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というクラスを新たに用意してメッセージの取り出し処理を記述していきます。
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"の文字列が出力されれば成功です。

