首先第一步永远是引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
并在配置文件添加配置
spring.rabbitmq.host=192.168.226.140
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
然后方法和activeMQ差不多,建立个发送方,建立个接收方
package com.sola.postmsg;
import java.sql.Date;
import org.apache.tomcat.jni.Time;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author JAVA
* MQ发送方
*/
@Component
public class RabbitMQSend {
//重点在这 要用模板类
@Autowired
private AmqpTemplate amqptemplate;
public void sendMsg(String msg){
amqptemplate.convertAndSend("mymsg",msg+"~~~");
}
}
package com.sola.getmessage;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* @author SOLA
* 接收MQ消息
*/
@Component
public class RabbitMQMessageReceiver{
@RabbitListener(queues = "mymsg")
public void process(String msg){
System.err.println("接收到的msg是"+msg);
}
}
然后我这里写了个接口进行调用
@GetMapping(value="rabbitsimpletest")
@ApiOperation("RabbitMQ简单的队列测试")
public void rabbitTest(){
send.sendMsg("RabbitMQ我来了");
}
然后运行,不出意外报错了。
看着像是找不到这个命名的队列。。。。然后我们去前端管理界面新建一个名为mymsg的队列
然后再运行就可以了,实际测试成功
运行虽然成功了 但是手动添队列太二了,下面我们在程序里加在接收端
/**
* @author SOLA
* 接收MQ消息
*/
@Component
public class RabbitMQMessageReceiver{
/*@RabbitListener(queues = "mymsg")*/
//@RabbitListener(queuesToDeclare="mymsg") 这么写会报错,因为参数类型是一个消息队列的数组
@RabbitListener(queuesToDeclare=@Queue("mymsg"))
public void process(String msg){
System.err.println("接收到的msg是"+msg);
}
}
这样 咱们去前端删除队列 然后再运行程序 就会发现 队列自动创建了。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RabbitMQ好像不像和ActiveMQ一样 要单独创建TOPIC,RabbitMQ好像是需要什么功能就绑定什么Exchanges实现什么功能。
下面是绑定代码
package com.sola.getmessage;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* @author SOLA
* 接收MQ消息
*/
@Component
public class RabbitMQMessageReceiver{
/*@RabbitListener(queues = "mymsg")*/
//@RabbitListener(queuesToDeclare="mymsg") 这么写会报错,因为参数类型是一个消息队列的数组
//@RabbitListener(queuesToDeclare=@Queue("mymsg"))
//新重点
@RabbitListener(bindings=@QueueBinding(
value=@Queue("mysolamsg"),
exchange=@Exchange("myexchange")
))
public void process(String msg){
System.err.println("接收到的msg是"+msg);
}
}
然后去前端看页面就发现已经绑定了
下面我们有个实际应用场景,一个订单服务对应两个商品服务。
数码商只关注数码产品的订单,而水果供应商只需要水果的订单。
然而需要这么做的话需要消息分组,首先先建立两个消息接收端
//数码供应商服务 接收消息
@RabbitListener(bindings=@QueueBinding(
exchange=@Exchange("myOrder"),
key = "computer",
value=@Queue("computerOrder")
))
public void computerMsg(String msg){
System.err.println("数码供应商接到的消息"+msg);
}
//水果供应商服务 接收消息
@RabbitListener(bindings=@QueueBinding(
exchange=@Exchange("myOrder"),
key = "fruit",
value=@Queue("fruitOrder")
))
public void fruitMsg(String msg){
System.err.println("水果供应商接到的消息"+msg);
}
然后去建立消息的发送并调用
@Component
public class RabbitMQSend {
//重点在这 要用模板类
@Autowired
private AmqpTemplate amqptemplate;
public void sendMsg(String msg){
amqptemplate.convertAndSend("mysolamsg",msg+"~~~");
}
//分组发送消息
public void sendOtherOrder(String msg){
//这回要填写三个参数,第一个参数exchange 绑定,第二个参数 分组的key
amqptemplate.convertAndSend("myOrder","computer",msg);
}
}
@GetMapping(value="groupOrder")
@ApiOperation("RabbitMQ分组发送消息")
public void groupOrder(String str){
send.sendOtherOrder(str);
}
这样他就滚到数码商那边去了