rabbitmq简单介绍:
rabbitmq是一种消息中间件,用于在分布式 系统中存储转发消息的网络通信协议
消息中间件的工作过程就是生产者不断地向消息队列发送消息,消费者从消息队列中消费消息。
rabbitmq的工作过程:生产者将消息通过路由键投递给交换机,交换机绑定到具体队列,消费者消费的消息只与队列有关
SpringBoot整合RabbitMQ
1.在pom文件中添加依赖
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency> |
2.在application.yml或者application.properties文件中增加rabbitmq配置
spring:
application:
name: 工程名
rabbitmq:
addresses: rabbitmq地址,rabbitmq集群多地址以逗号分隔
username: 用户名
password: 密码
publisher-confirms: true (这个是消息失败返回)
virtual-host: / |
3.配置消息队列,配置交换机,把队列按照规则绑定到交换机上
创建一个类如下:
@Configuration
@Slf4j
public class MqConfig {
//配置队列 DIRECT_QUEUE_XJ_ORDER自定义
@Bean
Queue queueXJorder(){
return QueueBuilder.durable("DIRECT_QUEUE_XJ_ORDER").build();
}
//配置交换机PUSH_XJ_NEWCENTER_ORDER自定义
@Bean
Exchange exchangeXJOrder() {
return ExchangeBuilder.directExchange("PUSH_XJ_NEWCENTER_ORDER").durable(true).build();
}
//通过ROUTING_XJ_ORDER,将上面的队列绑定到上面的交换机上
@Bean
public Binding directBinding2() {
//通过绑定键 将指定队列绑定到一个指定的交换机 .
return BindingBuilder.bind(queueXJorder()).to(exchangeXJOrder()).with("ROUTING_XJ_ORDER").noargs();
}
|
4.创建发送消息的工具类(提供一个公用的方法给生产者使用)
@Component
public class RabbitMqSender {
//这个方法接收的参数message将会发送给消费者
@Autowired
RabbitTemplate rabbitTemplate;
public void PushXjOrder(String message) {
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
//PUSH_XJ_NEWCENTER_ORDER是交换机的的配置,ROUTING_XJ_ORDER是绑定的规则,和上一个类中配置的保持一致
this.rabbitTemplate.convertAndSend("PUSH_XJ_NEWCENTER_ORDER","ROUTING_XJ_ORDER" , message, correlationData);
}
} |
5.生产者发送消息
@Autowired
RabbitMqSender rabbitMqSender;
@Test
public void sendmessage(){
Map livingMap = new HashMap();
livingMap.put("msg1","我是msg1");
livingMap.put("msg2","我是msg2");
livingMap.put("msg3","我是msg3");
rabbitMqSender.PushXjOrder(JSON.toJSONString(livingMap));
}
|
6.接受者接收消息
//DIRECT_QUEUE_XJ_ORDER 是队列名称,message是传过来的信息 @RabbitListener(queues = MqQueueConstant.DIRECT_QUEUE_XJ_ORDER) public void handler(Message message, Channel channel) throws IOException { log.info("接收消息:{}", new String(message.getBody())); String orderInfo=new String(message.getBody()); Map orderMap = JSON.parseObject(orderInfo,Map.class); //消息确认机制 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } |
|
happy ending!!