前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq。

首先引入配置文件org.springframework.amqp,如下

  1. <dependency>
  2. <groupId>org.springframework.amqp</groupId>
  3. <artifactId>spring-rabbit</artifactId>
  4. <version>1.6.0.RELEASE</version>
  5. </dependency>

一:配置消费者和生成者公共部分

  1. <rabbit:connection-factory id="connectionFactory" host="${rabbit.hosts}"
  2. port="${rabbit.port}" username="${rabbit.username}" password="${rabbit.password}" virtual-host="${rabbit.virtualHost}"
  3. channel-cache-size="50"/>
  4. <rabbit:admin connection-factory="connectionFactory"/>
  5. <!--定义消息队列-->
  6. <rabbit:queue name="spittle.alert.queue.1" durable="true" auto-delete="false"/>
  7. <rabbit:queue name="spittle.alert.queue.2" durable="true" auto-delete="false"/>
  8. <rabbit:queue name="spittle.alert.queue.3" durable="true" auto-delete="false"/>
  9. <!--绑定队列-->
  10. <rabbit:fanout-exchange id="spittle.fanout" name="spittle.fanout" durable="true">
  11. <rabbit:bindings>
  12. <rabbit:binding queue="spittle.alert.queue.1"></rabbit:binding>
  13. <rabbit:binding queue="spittle.alert.queue.2"></rabbit:binding>
  14. <rabbit:binding queue="spittle.alert.queue.3"></rabbit:binding>
  15. </rabbit:bindings>
  16. </rabbit:fanout-exchange>

二:配置生成者

  1. <import resource="amqp-share.xml"/>
  2. <!--创建消息队列模板-->
  3. <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"
  4. exchange="spittle.fanout" message-converter="jsonMessageConverter">
  5. </rabbit:template>
  6. <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"></bean>

三:生产者程序

  1. public class Spittle implements Serializable {
  2. private Long id;
  3. private Spitter spitter;
  4. private String message;
  5. private Date postedTime;
  6.  
  7. public Spittle(Long id, Spitter spitter, String message, Date postedTime) {
  8. this.id = id;
  9. this.spitter = spitter;
  10. this.message = message;
  11. this.postedTime = postedTime;
  12. }
  13.  
  14. public Long getId() {
  15. return this.id;
  16. }
  17.  
  18. public String getMessage() {
  19. return this.message;
  20. }
  21.  
  22. public Date getPostedTime() {
  23. return this.postedTime;
  24. }
  25.  
  26. public Spitter getSpitter() {
  27. return this.spitter;
  28. }
  29. }
  1. public class ProducerMain {
  2. public static void main(String[] args) throws Exception {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("amqp/amqp-producer.xml");
  4. AmqpTemplate template = (AmqpTemplate) context.getBean("rabbitTemplate");
  5. for (int i = 0; i < 20; i++) {
  6. System.out.println("Sending message #" + i);
  7. Spittle spittle = new Spittle((long) i, null, "Hello world (" + i + ")", new Date());
  8. template.convertAndSend(spittle);
  9. Thread.sleep(5000);
  10. }
  11. System.out.println("Done!");
  12. }
  13. }

其中convertAndSend方法默认第一个参数是交换机名称,第二个参数是路由名称,第三个才是我们发送的数据,现在我们启动程序,效果如下

第四个:消费者程序

首先编写一个用于监听生产者发送信息的代码

  1. /**
  2. * Created by Administrator on 2016/11/18.
  3. */
  4. public class SpittleAlertHandler implements MessageListener {
  5. @Override
  6. public void onMessage(Message message) {
  7. try {
  8. String body=new String(message.getBody(),"UTF-8");
  9. System.out.println(body);
  10. } catch (UnsupportedEncodingException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }

一定要注意实现MessageListener,我们只需要获取message的body即可,通过json来转换我们需要的程序(比如我们可以发送一个map,map存放方法和实体,这样我们可以通过反射来调用不同的程序来运行)。

下面我们配置消费者

  1. <import resource="amqp-share.xml"/>
  2. <rabbit:listener-container connection-factory="connectionFactory">
  3. <rabbit:listener ref="spittleListener" method="onMessage" queues="spittle.alert.queue.1,spittle.alert.queue.3,spittle.alert.queue.2"/>
  4. </rabbit:listener-container>
  5. <bean id="spittleListener" class="com.lp.summary.rabbitmq.impl.SpittleAlertHandler"/>

其中spittleListener是监听的程序,method是执行的方法,queues是我们监听的队列,多个队列可以逗号隔开(因为我们采用的是分发,所以三个队列获取的消息是相同的,这里为了简便我放在一个监听程序中了,其实我们可以写三个消费者,每个消费者监听一个队列)

现在只需要启动程序即可运行

  1. public class ConsumerMain {
  2. public static void main(String[] args) {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("amqp/amqp-consumer.xml");
  4. }
  5. }

当然direct跟上面的情况差不多,只不过这个是根据路由匹配,先把数据发送到交换机,然后绑定路由和队列,通过交换机id和路由来找到队列,下面是一些主要的配置

  1. <rabbit:queue id="spring-test-queue1" durable="true" auto-delete="false" exclusive="false" name="spring-test-queue1"></rabbit:queue>
  2. <rabbit:queue name="spring-test-queue2" durable="true" auto-delete="false" exclusive="false"></rabbit:queue>
  3. <!--交换机定义-->
  4. <!--rabbit:direct-exchange:定义exchange模式为direct,
  5. 意思就是消息与一个特定的路由键完全匹配,才会转发。
  6. rabbit:binding:设置消息queue匹配的key-->
  7. <rabbit:direct-exchange name="${rabbit.exchange.direct}" durable="true" auto-delete="false" id="${rabbit.exchange.direct}">
  8. <rabbit:bindings>
  9. <rabbit:binding queue="spring-test-queue1" key="spring.test.queueKey1"/>
  10. <rabbit:binding queue="spring-test-queue2" key="spring.test.queueKey2"/>
  11. </rabbit:bindings>
  12. </rabbit:direct-exchange>
  13.  
  14. <!--spring template声明-->
  15. <rabbit:template exchange="${rabbit.exchange.direct}" id="rabbitTemplate" connection-factory="connectionFactory"
  16. message-converter="jsonMessageConverter"></rabbit:template>
  17. <!--消息对象转成成json-->
  18. <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"></bean>

下面是消费者监听配置

  1. <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
  2. <rabbit:listener queues="spring-test-queue1" method="onMessage" ref="queueListenter"></rabbit:listener>
  3. </rabbit:listener-container>
  4. <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
  5. <rabbit:listener queues="spring-test-queue2" method="onMessage" ref="queueListenter"></rabbit:listener>
  6. </rabbit:listener-container>

下面是程序

  1. public static void main(String[] args) {
  2. ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-rabbitmq-producer.xml");
  3. MQProducer mqProducer=(MQProducer) context.getBean("mqProducer");
  4. mqProducer.sendDateToQueue("spring.test.queueKey1","Hello World spring.test.queueKey1");
  5. mqProducer.sendDateToQueue("spring.test.queueKey2","Hello World spring.test.queueKey2");
  6. }

实际情况可能需要我们去分离消费者和生成者的程序。当然spring还有负载均衡的配置,这里就不多介绍了。

rabbitMQ第五篇:Spring集成RabbitMQ的更多相关文章

  1. RabbitMQ第四篇:Spring集成RabbitMQ

    前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq. 首先引入配置文件org.springframework.amqp,如下 <dependency> ...

  2. spring集成rabbitMq(非springboot)

    首先 , pom文件需要加入spring集成rabbitMq的依赖: <dependency> <groupId>org.springframework.amqp</gr ...

  3. RabbitMQ入门到进阶(Spring整合RabbitMQ&SpringBoot整合RabbitMQ)

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...

  4. SSM框架开发web项目系列(五) Spring集成MyBatis

    前言 在前面的MyBatis部分内容中,我们已经可以独立的基于MyBatis构建一个数据库访问层应用,但是在实际的项目开发中,我们的程序不会这么简单,层次也更加复杂,除了这里说到的持久层,还有业务逻辑 ...

  5. spring集成RabbitMQ配置文件详解(生产者和消费者)

    1,首先引入配置文件org.springframework.amqp,如下: <dependency> <groupId>org.springframework.amqp< ...

  6. Spring 集成 RabbitMQ

    pom.xml <dependency> <groupId>org.springframework.amqp</groupId> <artifactId> ...

  7. spring集成rabbitmq

    https://www.cnblogs.com/nizuimeiabc1/p/9608763.html

  8. MongoDB的使用学习之(五)Spring集成MongoDB以及简单的CRUD

    这篇文章不错:Spring Data - MongoDB 教程 (1.0.0.M1)http://miller-cn.iteye.com/blog/1258859 1.介绍 之前在很多地方一直见到这个 ...

  9. shiro实战系列(十五)之Spring集成Shiro

    Shiro 的 JavaBean 兼容性使得它非常适合通过 Spring XML 或其他基于 Spring 的配置机制.Shiro 应用程序需要一个具 有单例 SecurityManager 实例的应 ...

随机推荐

  1. Java Web 项目目录规范

    一.项目结构 这里和其他项目区别不大,我将模板抽离出来,更容易分析和理解: 解释一下:js主要包括extends(引入第三方的js).module(项目模块自己的js).lib(引用包,这里也可以继续 ...

  2. switch..case使用

    1.多个if...else连在一起使用的时候,可以转为使用更方便的switch结构.switch (XXX) { case "aaa": // ... break; case &q ...

  3. 浅谈我对 jQuery 的了解

    总述 0 获取 jQuery 对象 1 对象跳转 2 方法调用 3 常用API 4 $(…); 5 jQuery 对象获取 6 Data 相关方法 7 选择器 8 基本的过滤器 9 内容过滤选择器 1 ...

  4. db2定界符

    在DB2数据库中,在导出DEL文件时,默认的字符分隔符是".字段分隔符是, (逗号).有一个需求是要为Oracle数据库提供数据,因此就想使用"|"作为数据的字段分隔符. ...

  5. JAVA基础整理-集合篇(一)

    集合作为JAVA的基础知识,本来感觉自己理解的很清楚了,但是在最近的一次面试中还是答得不尽如人意!再次做一下整理,以便加深理解以及随时查阅. 首先,java.util包中三个重要的接口及特点:List ...

  6. Redis 做消息队列

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...

  7. Android中获取选择图片与获取拍照返回结果差异

    导语: 如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式 今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测 ...

  8. lucene和es总结

    一.首先介绍lucene涉及到的排序过程 1.1.如何自定义排序对象 你可以自定义collector对象: 亦可以自定义comparator对象: 可以自定义scoredoc对象,决定如何处理结果集合 ...

  9. SMA、SMB、SMC封装的二极管

    以常见的贴片肖特基二极管SS14 SS24 SS34为例,三种管子区别主要在电流上,有三种封装:SMA.SMB.SMC. 从成本和体积来说,优先选用最小尺寸的SMA/DO-214AC封装,其他封装一般 ...

  10. Mimikatz 使用Tips

    1.记录 Mimikatz输出: C:\>mimikatz.exe ""privilege::debug"" ""log sekurl ...