这两天看了下activemq和rabbitmq,现在跟大家分享下rabbitmq在springboot中的集成及使用。
依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-amqpartifactId>
dependency>
具体代码:
@SpringBootApplication
public class RabbitmqApplication implements CommandLineRunner{
@Autowired
RabbitTemplate rabbitTemplate;//使用springboot配置好的队列RabbitTemplate
public static void main(String[] args) {
SpringApplication.run(RabbitmqApplication.class, args);
}
/**
* 定义目的地队列,命名为my-rabbitmq
* 这里实际上是要往rabbitmq里注册队列名称
* */
@Bean
public Queue myQueue(){
return new Queue("my-rabbitmq");
}
public void run(String... args) throws Exception {
//ͨ使用RabbitTemplate的convertAndSend发送给队列my-rabbitmq消息
rabbitTemplate.convertAndSend("my-rabbitmq", "这是我rabbitmq的测试消息");
}
}
继承CommandLineRunner是消息队列能够在项目启动的时候直接执行。
接收(消费)消息的代码,(现在先以一个项目来操作):
@Component
public class Receiver {
private static final Logger log = LoggerFactory.getLogger(Receiver.class);
@RabbitListener(queues="my-rabbitmq")
public void receive(String message){
System.out.println("我收到的消息是:"+message);
}
}
@RabbitListener(queues=”my-rabbitmq”)是用来监听消息队列的,如果队列中有消息将直接在这里被消费掉。
启动项目,控制台log如下:
我收到的消息是:这是我rabbitmq的测试消息成功消费掉了。
定义两个消息的接收器,代码稍作改动:
public void run(String... args) throws Exception {
for (int i = 0; i < 10; i++) {
rabbitTemplate.convertAndSend("my-rabbitmq", "这里的值是"+i);
}
}
这里一次发送十条消息。
消息接收器代码:
@RabbitListener(queues="my-rabbitmq")
public void receive1(String message){
log.info("我是第一个消费监听器,去消费了:"+message);
}
@RabbitListener(queues="my-rabbitmq")
public void receive2(String message){
log.info("我是第二个消费监听器,去消费了:"+message);
}
我是第一个消费监听器,去消费了:这里的值是0
我是第二个消费监听器,去消费了:这里的值是1
我是第一个消费监听器,去消费了:这里的值是2
我是第二个消费监听器,去消费了:这里的值是3
我是第一个消费监听器,去消费了:这里的值是4
我是第二个消费监听器,去消费了:这里的值是5
我是第一个消费监听器,去消费了:这里的值是6
我是第二个消费监听器,去消费了:这里的值是7
我是第一个消费监听器,去消费了:这里的值是8
我是第二个消费监听器,去消费了:这里的值是9
上面的log可以看到,两个消息接收器都有收到消息,而且是轮询消费消息的,具体是不是一样的大家可以多试几次。
传递对象:
这里分成两种讨论,1、引用的java中的对象,以Map为例;2、自己定义的实体类对象。
1、传递Map
修改代码:
public void run(String... args) throws Exception {
HashMap<String, Object> hm=new HashMap<String, Object>();
hm.put("name", "庞坤");
hm.put("age", 28);
hm.put("address", "上海漕河泾开发区");
rabbitTemplate.convertAndSend("my-rabbitmq", hm);
}
@RabbitListener(queues="my-rabbitmq")
public void receive(HashMap hm){
System.out.println("我接收到消息是:"+hm);
}
启动项目,看到log:
我接收到消息是:{address=上海漕河泾开发区, name=庞坤, age=28}
2、自己定义的实体类对象。
注意,这里一定要对User序列化
@Component
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String userName="";
private Integer age=0;
private String address="";
/**
*省略getter和setter
*/
}
生成消息
public void run(String... args) throws Exception {
User user=new User();
user.setUserName("庞坤");
user.setAge(28);
user.setAddress("上海市徐汇区漕河泾开发区");
rabbitTemplate.convertAndSend("my-rabbitmq", user);
}
消费消息
@RabbitListener(queues="my-rabbitmq")
public void receive(User user) {
System.out.println("我收到的消息是:"+user);
System.out.println("Address:"+user.getAddress());
System.out.println("UserName:"+user.getUserName());
System.out.println("Age:"+user.getAge());
}
控制台log:
我收到的消息是:com.rhett.rabbitmq.User@3289bb89
Address:上海市徐汇区漕河泾开发区
UserName:庞坤
Age:28
注意下user对象com.rhett.rabbitmq.User@3289bb89,直接指向发送的消息的实体类,两个项目之间消费消息的时候这里会有问题。
具体解决方案我会在下篇文章多项目之间说明。
参考书籍:汪云飞老师的 spring boot实战