SpringBoot(十二)——SpringBoot与消息

在大多应用中,我们系统之间需要进行异步通信,即异步消息,本篇文章主要讲SpringBoot与RabbitMQ整合。

1. RabbitMQ 快速入门

一篇文章,让你快速学会RabbitMQ(超级详细,27489字)

2. Spring 支持

  • spring-jms提供了对JMS的支持
  • spring-rabbit提供了对AMQP的支持
  • 需要ConnectionFactory的实现来连接消息代理
  • 提供JmsTemplate、RabbitTemplate类来发送消息
  • @JmsListener(JMS)、@RabbitListener(AMQP)注解在方法上监听消息代理发 布的消息
  • @EnableJms、@EnableRabbit开启支持

Spring Boot自动配置

  • JmsAutoConfiguration
  • RabbitAutoConfiguration

3. SpringBoot 整合RabbitMQ

1.导入依赖

dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.配置文件

spring.rabbitmq.host=47.94.231.234
#账号密码默认是guest,可以不用配置
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#端口号也可以不写,默认是5672
spring.rabbitmq.port=5672
#虚拟主机不配置的话默认是/
spring.rabbitmq.virtual-host=/spring-rabbitmq

3.测试RabbitTemplate给服务器发送和接收消息

@SpringBootTest
class Springboot10RabbitmqApplicationTests {
    @Autowired
    RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() {
        //使用这种方法Message需要自己构造,需要定义Message的消息体内容个消息头
       // rabbitTemplate.send(exchange, routingKey, message);

        //比较常用的是这个,只需要传入要发送的对象,自动序列化,自动发送给rabbitMq服务器
        //rabbitTemplate.convertAndSend(exchange, routingKey, object);
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "这是第一条消息");
        map.put("data","hello world!");
        //向exchange.direct交换机中发送一条信息map,根据roottingKey(ewen.direct)到达指定队列
        rabbitTemplate.convertAndSend("exchange.direct","ewen.direct",map);
    }
}

(在管理页面查看队列收到的消息)
在这里插入图片描述
4. 测试接收消息

@Test //接收消息
    public void revc() {
        Object map = rabbitTemplate.receiveAndConvert("ewen.queue");
        System.out.println(map.getClass());
        System.out.println(map);

    }

在这里插入图片描述
5.默认的消息转化器是SimpleMessageConverter,对于对象以jdk序列化方式存储,若要以Json方式存储对象,就要自定义消息转换器

@Configuration
public class MyAMQPConfig {

    //自定义MessageConverter,以json的形式发送数据
    @Bean
    public MessageConverter messageConverter() {
        //在容器中导入Json的消息转换器
        return new Jackson2JsonMessageConverter();
    }
}

在这里插入图片描述

  • AmqpAdmin类管理组件,可用于创建和删除exchange、binding和queue
//创建Direct类型的Exchange
amqpAdmin.declareExchange(new DirectExchange("admin.direct"));
//创建Queue,也可以指定一些参数
amqpAdmin.declareQueue(new Queue("admin.test"));
//将创建的队列与Exchange绑定
amqpAdmin.declareBinding(new Binding("admin.test", Binding.DestinationType.QUEUE,"admin.direct","admin.test",null));

3.1 消息的监听

首先在启动类上开启
在这里插入图片描述

在回调方法上标注@RabbitListener注解,并设置其属性queues,注册监听队列,当该队列收到消息时,标注方法会被调用,可分别使用Message和保存消息所属对象进行消息接收,若使用Object对象进行消息接收,实际上接收到的也是Message。相当于接受消息。

@Service
public class BookService {
    @RabbitListener(queues = {"admin.test"})
    public void receive1(Book book){
        System.out.println("收到消息:"+book);
    }

    @RabbitListener(queues = {"admin.test"})
    public void receive1(Object object){
        System.out.println("收到消息:"+object.getClass());
        //收到消息:class org.springframework.amqp.core.Message
    }
    
    @RabbitListener(queues = {"admin.test"})
    public void receive2(Message message){
        System.out.println("收到消息"+message.getHeaders()+"---"+message.getPayload());
    }
}

如有不足之处,欢迎指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值