Spring整合RabbitMQ

好久不见. 提交于 2020-01-28 07:36:10

Spring实战4介绍了AMQP消息高级协议。进而提到了AMQP协议的实现——RabbitMQ。
RabbitMQ作为一个消息代理中间件。非常的流行,exchange的使用,让消息生产者和消息队列实现了解耦。提供了多种消息路由的方式。
本文不谈原理,只谈集成
1 .引入依赖
2 .RabbitMQ配置文件
3 .占位符配置
4 .使用RabbitMQ

1 .引入依赖

		<dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>1.5.0.RELEASE</version>
        </dependency>

2 .RabbitMQ配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/rabbit"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/rabbit
                           http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd
                           http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--rabbitmq工厂配置-->
   <connection-factory id="connectionFactory"
                       host="${rabbitmq.host}"
                       port="${rabbitmq.port}"
                       username="${rabbitmq.username}"
                       password="${rabbitmq.password}"/>
    <!--rabbitmq模板类-->
    <template id="rabbitTemplate" encoding="utf-8" connection-factory="connectionFactory" />
    <admin connection-factory="connectionFactory"/>
    <!--定义3个队列-->
           <queue name="spittle.alert.queue.1" />
           <queue name="spittle.alert.queue.2" />
           <queue name="spittle.alert.queue.3" />
    <!--定义一个fanout类型的exchange-->
           <fanout-exchange name="spittle.fanout">
              <bindings>
                  <binding queue="spittle.alert.queue.1"></binding>
                  <binding queue="spittle.alert.queue.2"></binding>
                  <binding queue="spittle.alert.queue.3"></binding>
              </bindings>
           </fanout-exchange>
    <!--定义一个基于rabbitMQ的监听POJO-->
    <!--<beans:bean id="userInfoListener" class="cn.org.javamvc.config.rabbitmq.UserInfoAlertHandler"/>-->
    <!--<listener-container connection-factory="connectionFactory">-->
        <!--<listener-->
                <!--ref="userInfoListener"-->
                <!--method="handleUserInfoAlert"-->
                <!--queue-names="spittle.alert.queue.1" />-->
    <!--</listener-container>-->
</beans:beans>

3 .占位符配置
你可能也注意到了,在上面的rabbitmq的配置文件中,我们使用了${ }的占位符设置。使用占位符,就涉及到了PropertySourcesPlaceholderConfigurer类的实例化,这个类就是用来帮助spring配置文件引用外置properties配置文件的。
如下图,实例化PropertySourcesPlaceholderConfigurer类

@Configuration
//java config方式引入xml显示配置
@ImportResource("classpath:config/rabbit/application-rabbit.xml")
public class RabbitMQConfig {
    //实例化PropertySourcesPlaceholderConfigurer配置
    @Bean
    public PropertySourcesPlaceholderConfigurer propertySource(){
        PropertySourcesPlaceholderConfigurer property = new PropertySourcesPlaceholderConfigurer();
        //加载classpath路径下的rabbitmq.properties配置文件
        ClassPathResource classPathResources = new ClassPathResource("rabbitmq.properties");
        property.setLocations(classPathResources);
        return property;
    }
}

我新建的这个ssm工程,没有使用web.xml。使用的是java config方式。所以不能使用ContextLoaderListener加载Spring的配置文件,使用的是java config方式加载Spring配置文件
以上就完成了RabbitMQ的配置工作。下面,我们使用RabbitMQ

前提肯定是你已经安装好了一个RabbitMQ的服务啊。推荐使用windows的安装方式,简单
4 .使用RabbitMQ

@RestController
@RequestMapping("/rabbit")
public class RabbitMQController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @RequestMapping("/sendMessage")
    public void sendMessage(){
        UserInfo userInfo = new UserInfo();
        userInfo.setPassword("111111");
        userInfo.setUniqueId("222222");
        userInfo.setUserName("测试");
        //将userInfo用户发送到RabbitMQ
        rabbitTemplate.convertAndSend("spittle.fanout","",userInfo);
    }

    @RequestMapping("/receiveMessage")
    public String receiveMessage(){
        //从RabbitMQ的指定队列获取消息
        UserInfo result = (UserInfo) rabbitTemplate.receiveAndConvert("spittle.alert.queue.1");
        JSONObject jsonObject = new JSONObject();
        return jsonObject.toJSONString(result);
    }
}

rabbitTemplate提供了很多convertAndSend方法的重载方式,可以用Idea下载源码自行查看,比较简单。就不说了
同理,receiveAndConvert方法,也是。帮助我们省去了对象转换的复杂逻辑,直接将接收到的消息强转成所需要的对象即可。其他重载方式,有兴趣的同学,可以看一下源码

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!