QuarkusとAMQP連携の基本完全ガイド|RabbitMQ・ActiveMQで学ぶイベント駆動開発入門
Quarkus / AMQP / RabbitMQ / ActiveMQ / イベント駆動開発 / Reactive Messaging / Java 初心者向け
生徒
「Quarkusでイベント駆動開発をやりたいんですが、AMQPって何ですか?」
先生
「AMQPは、アプリ同士がメッセージをやり取りするための共通ルールです。QuarkusではRabbitMQやActiveMQと組み合わせて、イベント駆動開発ができます。」
生徒
「REST APIと何が違うんですか?」
先生
「リクエストを待つのではなく、出来事が起きたら自動で処理が流れる点が大きな違いです。順番に見ていきましょう。」
1. Quarkusにおけるイベント駆動開発とは
Quarkusのイベント駆動開発とは、ある出来事をきっかけに処理が自動で実行される設計手法です。 ユーザー登録、注文完了、データ更新などをイベントとして扱い、アプリ同士を疎結合に保てます。 従来の同期的なREST APIと異なり、処理の流れを止めずに非同期で動くため、スケーラブルで高速なシステムを構築できます。 クラウドネイティブやマイクロサービスと非常に相性が良い点も特徴です。
2. AMQPの基本概念をやさしく理解する
AMQPはメッセージングの共通仕様で、送信側と受信側の間にメッセージブローカーが存在します。 送信側はメッセージを投げるだけで、誰が受け取るかを意識しません。 受信側はキューに届いたメッセージを順番に処理します。 この仕組みにより、システム変更に強く、障害にも耐えやすい構成になります。
RabbitMQやActiveMQは、このAMQPを実装した代表的なメッセージブローカーです。
3. QuarkusとRabbitMQ・ActiveMQの関係
QuarkusではSmallRye Reactive Messagingを利用して、AMQPと簡単に連携できます。 RabbitMQやActiveMQの違いを意識せず、設定とアノテーションだけでメッセージ送受信が可能です。 Java初心者でも、シンプルなコードでイベント駆動開発を体験できます。
4. AMQP送信側の基本実装
まずはイベントを送信する側の基本コードです。 処理が完了したタイミングでメッセージを送信するイメージになります。
import jakarta.enterprise.context.ApplicationScoped;
import org.eclipse.microprofile.reactive.messaging.Channel;
import org.eclipse.microprofile.reactive.messaging.Emitter;
@ApplicationScoped
public class OrderEventProducer {
@Channel("order-out")
Emitter<String> emitter;
public void sendOrder(String message) {
emitter.send(message);
}
}
このコードでは、注文が発生したというイベントをAMQPへ送信しています。 REST APIと違い、相手の処理を待たずに次の処理へ進めます。
5. AMQP受信側の基本実装
次はメッセージを受け取る側です。 キューにメッセージが届いた瞬間に、自動で処理が実行されます。
import jakarta.enterprise.context.ApplicationScoped;
import org.eclipse.microprofile.reactive.messaging.Incoming;
@ApplicationScoped
public class OrderEventConsumer {
@Incoming("order-in")
public void receive(String message) {
System.out.println("受信した注文イベント: " + message);
}
}
ポーリング処理を書かなくても、イベントが届けば自動的に動く点が大きな特徴です。
6. application.propertiesの基本設定
Quarkusでは設定ファイルに接続情報を書くだけで、AMQPと連携できます。 初心者でも設定の全体像を把握しやすいのが魅力です。
mp.messaging.outgoing.order-out.connector=smallrye-amqp
mp.messaging.outgoing.order-out.address=orders
mp.messaging.incoming.order-in.connector=smallrye-amqp
mp.messaging.incoming.order-in.address=orders
amqp-host=localhost
amqp-port=5672
amqp-username=guest
amqp-password=guest
7. イベント駆動開発で得られるメリット
QuarkusとAMQPを組み合わせることで、処理の分離、拡張のしやすさ、障害耐性が向上します。 新しい機能を追加しても、既存システムに影響を与えにくくなります。 特にマイクロサービス構成では、この考え方が大きな力を発揮します。
8. 初心者がつまずきやすいポイント
メッセージが届かない場合は、キュー名や設定の不一致が原因であることが多いです。 まずは送信と受信で同じアドレスを使っているかを確認しましょう。 ローカル環境ではRabbitMQの起動忘れにも注意が必要です。