記事ディレクトリ
初期環境を構築する
依存関係を導入する
<!--引入与rabbitmq集成依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
すばやく構築するときに、この場所を直接確認することもできます。
構成プロファイル
spring:
application:
name: springboot_rabbitmq
rabbitmq:
host: 10.15.0.9
port: 5672
username: ems
password: 123
virtual-host: /ems
この名前には実際的な意味はありませんが、マイクロサービス プロジェクトでは非常に重要です
. rabbitmq の構成は、RabbitMQ サービスに接続することです
RabbitTemplate
操作を簡素化するために使用され、プロジェクトに注入することで直接使用できます
HelloWorld モデルは
開発プロデューサー
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testHello(){
rabbitTemplate.convertAndSend("hello","hello world");
}
convertAndSend メソッド: 変換して送信します。メッセージをバイトに変換してから送信するために使用されます
- 最初のパラメーター: キューの名前
- 2 番目のパラメーター: メッセージの内容
プロデューサーを実行すると、キューがないことがわかります。
このキューの作成はプロデューサー側ではなく、コンシューマー側で作成されるためです。
コンシューマーがいない場合、キューを作成しても意味がありません
消費者を育成する
@Component
@RabbitListener(queuesToDeclare = @Queue("hello"))
public class HelloCustomer {
@RabbitHandler
public void receive1(String message){
System.out.println("message = " + message);
}
}
コンシューマーには、コンシューマーに代わってリッスンするアノテーション @RabbitListener が必要です。この時点で、hello キューでメッセージを受信する必要がありますが、このキューはまだ存在しないため、queuesToDeclare を使用してここでキューを宣言します。
では、どうすればメッセージをキューに入れることができるでしょうか? メソッドを任意に作成し、その上に @RabbitHandler アノテーションを使用して、キューからメッセージを取得するためのコールバック メソッドを表すことができます. このコールバック メソッドのパラメーターを介してメッセージを取得できます.
次に、実行して調べます。
このモードで作成されたキューはデフォルトで永続的です。では、それを排他的にするか自動的に削除するかをどのように設定すればよいでしょうか?
@Queue アノテーションを使用できます。
デフォルトで作成されるキューは、永続的で排他的ではなく、自動的に削除されません。
作業モデルの使用
開発プロデューサー
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testWork(){
for (int i = 0; i < 10; i++) {
rabbitTemplate.convertAndSend("work","hello work!");
}
}
消費者を育成する
@Component
public class WorkCustomer {
@RabbitListener(queuesToDeclare = @Queue("work"))
public void receive1(String message){
System.out.println("work message1 = " + message);
}
@RabbitListener(queuesToDeclare = @Queue("work"))
public void receive2(String message){
System.out.println("work message2 = " + message);
}
}
ここでは、1 つのクラスに複数のコンシューマーを作成しています。@RabbitListener はクラスで使用され、@RabbitListener はメソッドでも使用できます。
说明:默认在Spring AMQP实现中Work这种方式就是公平调度,如果需要实现能者多劳需要额外配置
ファンアウト ブロードキャスト モデル
開発プロデューサー
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testFanout() throws InterruptedException {
rabbitTemplate.convertAndSend("logs","","这是日志广播");
}
変換して送信:
- 最初のパラメーター: スイッチの名前
- 2 番目のパラメータ: routingkey
- 3 番目のパラメーター: 生成されたメッセージ
同様に、スイッチはプロデューサではなくコンシューマで定義されているため、上記のコードを実行しただけではログ スイッチは作成されません。
消費者を育成する
@Component
public class FanoutCustomer {
@RabbitListener(bindings = @QueueBinding(
value = @Queue, //创建临时队列
exchange = @Exchange(name="logs",type = "fanout") //绑定的交换机
))
public void receive1(String message){
System.out.println("message1 = " + message);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue, //创建临时队列
exchange = @Exchange(name="logs",type = "fanout") //绑定交换机类型
))
public void receive2(String message){
System.out.println("message2 = " + message);
}
}
ルート ルーティング モデル
開発プロデューサー
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testDirect(){
rabbitTemplate.convertAndSend("directs","error","error 的日志信息");
}
消費者を育成する
@Component
public class DirectCustomer {
@RabbitListener(bindings ={
@QueueBinding(
value = @Queue(),
key={
"info","error"},
exchange = @Exchange(type = "direct",name="directs")
)})
public void receive1(String message){
System.out.println("message1 = " + message);
}
@RabbitListener(bindings ={
@QueueBinding(
value = @Queue(),
key={
"error"},
exchange = @Exchange(type = "direct",name="directs")
)})
public void receive2(String message){
System.out.println("message2 = " + message);
}
}
トピック サブスクリプション モデル (動的ルーティング モデル)
開発プロデューサー
@Autowired
private RabbitTemplate rabbitTemplate;
//topic
@Test
public void testTopic(){
rabbitTemplate.convertAndSend("topics","user.save.findAll","user.save.findAll 的消息");
}
消費者を育成する
@Component
public class TopCustomer {
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue,
key = {
"user.*"},
exchange = @Exchange(type = "topic",name = "topics")
)
})
public void receive1(String message){
System.out.println("message1 = " + message);
}
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue,
key = {
"user.#"},
exchange = @Exchange(type = "topic",name = "topics")
)
})
public void receive2(String message){
System.out.println("message2 = " + message);
}
}