RabbitMQ介紹與原理見:消息隊列之 RabbitMQ
RabbitMQ安裝見:RabbitMQ安裝
依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
在Spring Boot中配置RabbitMQ比較簡單,首先配置yml文件,properties也可以。
application-rabbitmq.yml
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
connection-timeout: 60s
listener:
direct:
acknowledge-mode: none
RabbitMQ默認的ExChange消息類型是direct,而且不用自己配置交換機exchange、路由鍵routing-key及bind信息。發送消息amqpTemplate.convertAndSend(routingKey, data)時,將隊列名字作爲routing-key和消息一塊發送。在consumer監聽相應隊列即可。
編寫配置類RabbitMqOperator:
package com.qiqi.mq;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* 消息隊列
*/
@Component
public class RabbitMqOperator {
private AmqpTemplate amqpTemplate;
@Autowired
public RabbitMqOperator(AmqpTemplate amqpTemplate) {
this.amqpTemplate = amqpTemplate;
}
/**
* 異步發送字節數組到rabbitmq
* @param data
*/
public void push(String routingKey, byte[] data){
amqpTemplate.convertAndSend(routingKey, data);
}
/**
* 異步發送int類型消息到rabbitmq
* @param data
*/
public void pushInt(String routingKey, int data){
amqpTemplate.convertAndSend(routingKey, data);
}
/**
* 定義一個名爲:first_queue 的隊列
* @return
*/
@Bean
public Queue firstQueue() {
return new Queue("first_queue");
}
/**
* 定義一個名爲:second_queue 的隊列
* @return
*/
@Bean
public Queue secondQueue() {
return new Queue("second_queue");
}
}
生產者:
public class Productor{
//消息隊列
private RabbitMqOperator rabbitMqOperator;
@Autowired
public Productor(RabbitMqOperator operator) {
this.rabbitMqOperator = operator;
Assert.notNull(this.rabbitMqOperator, "rabbitmq init fail.");
}
/**
* 數據發送到rabbitMq
*/
public void sendData() {
byte[] data = new byte[11];
// data[10] = ;
//發送數據到first_queue隊列
rabbitMqOperator.push("first_queue" ,data);
for (int i = 0; i < 100; i++){
//發送數據到second_queue隊列
rabbitMqOperator.pushInt("second_queue",i);
}
}
}
消費者:
package com.qiqi.mq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 消費者
*/
@Component
public class Consumer {
private static final Logger log = LoggerFactory.getLogger(Consumer.class);
/**
* @RabbitHandler 指定消息的處理方法
* @param message
*/
@RabbitListener(queues = "first_queue")////@RabbitListener 監聽 first_queue 隊列
@RabbitHandler
public void process(String message) {
//接收first_queue隊列消息
log.info("接收的消息爲: {}", message);
}
@RabbitListener(queues = "second_queue")////@RabbitListener 監聽 second_queue 隊列
@RabbitHandler
public void process1(String message) {
//接收second_queue隊列消息
log.info("2接收的消息爲: {}", message);
}
}
輸出例子: