(转) RabbitMQ学习之spring整合发送异步消息
http://blog.csdn.net/zhu_tianwei/article/details/40919031
实现使用Exchange类型为DirectExchange. routingkey的名称默认为Queue的名称。异步发送消息。
1.配置文件
- #============== rabbitmq config ====================
- rabbit.hosts=192.168.36.102
- rabbit.username=admin
- rabbit.password=admin
- rabbit.virtualHost=/
- rabbit.queue=spring-queue-async
- rabbit.routingKey=spring-queue-async#<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.2000007629395px;">routingkey的名称默认为Queue的名称</span>
2.生产者配置applicationContext-rabbitmq-async-send.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
- <property name="ignoreResourceNotFound" value="true" />
- <property name="locations">
- <list>
- <!-- 标准配置 -->
- <value>classpath*:/application.properties</value>
- </list>
- </property>
- </bean>
- <!-- 创建connectionFactory -->
- <bean id="rabbitConnectionFactory"
- class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
- <constructor-arg value="${rabbit.hosts}"/>
- <property name="username" value="${rabbit.username}"/>
- <property name="password" value="${rabbit.password}"/>
- <property name="virtualHost" value="${rabbit.virtualHost}"/>
- <property name="channelCacheSize" value="5"/>
- </bean>
- <!-- 创建rabbitAdmin 代理类 -->
- <bean id="rabbitAdmin"
- class="org.springframework.amqp.rabbit.core.RabbitAdmin">
- <constructor-arg ref="rabbitConnectionFactory" />
- </bean>
- <!-- 创建rabbitTemplate 消息模板类
- -->
- <bean id="rabbitTemplate"
- class="org.springframework.amqp.rabbit.core.RabbitTemplate">
- <constructor-arg ref="rabbitConnectionFactory"></constructor-arg>
- <property name="routingKey" value="${rabbit.routingKey}"></property>
- </bean>
- </beans>
3.生产者发送消息代码Send.java
- package cn.slimsmart.rabbitmq.demo.spring.async;
- import org.springframework.amqp.core.AmqpTemplate;
- import org.springframework.amqp.rabbit.core.RabbitTemplate;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class Send {
- public static void main(String[] args) throws InterruptedException {
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-rabbitmq-async-send.xml");
- AmqpTemplate amqpTemplate = context.getBean(RabbitTemplate.class);
- for(int i=0;i<1000;i++){
- amqpTemplate.convertAndSend("test spring async=>"+i);
- Thread.sleep(3000);
- }
- }
- }
4.处理消息类ReceiveMsgHandler.Java
- package cn.slimsmart.rabbitmq.demo.spring.async;
- public class ReceiveMsgHandler {
- public void handleMessage(String text) {
- System.out.println("Received: " + text);
- }
- }
5.配置applicationContext-rabbitmq-async-receive.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
- <property name="ignoreResourceNotFound" value="true" />
- <property name="locations">
- <list>
- <!-- 标准配置 -->
- <value>classpath*:/application.properties</value>
- </list>
- </property>
- </bean>
- <!-- 创建connectionFactory -->
- <bean id="rabbitConnectionFactory"
- class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
- <constructor-arg value="${rabbit.hosts}"/>
- <property name="username" value="${rabbit.username}"/>
- <property name="password" value="${rabbit.password}"/>
- <property name="virtualHost" value="${rabbit.virtualHost}"/>
- <property name="channelCacheSize" value="5"/>
- </bean>
- <!-- 声明消息转换器为SimpleMessageConverter -->
- <bean id="messageConverter"
- class="org.springframework.amqp.support.converter.SimpleMessageConverter">
- </bean>
- <!-- 监听生产者发送的消息开始 -->
- <!-- 用于接收消息的处理类 -->
- <bean id="receiveHandler"
- class="cn.slimsmart.rabbitmq.demo.spring.async.ReceiveMsgHandler">
- </bean>
- <!-- 用于消息的监听的代理类MessageListenerAdapter -->
- <bean id="receiveListenerAdapter"
- class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter">
- <constructor-arg ref="receiveHandler" />
- <property name="defaultListenerMethod" value="handleMessage"></property>
- <property name="messageConverter" ref="messageConverter"></property>
- </bean>
- <!-- 用于消息的监听的容器类SimpleMessageListenerContainer,对于queueName的值一定要与定义的Queue的值相同 -->
- <bean id="listenerContainer"
- class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">
- <property name="queueNames" value="${rabbit.queue}"></property>
- <property name="connectionFactory" ref="rabbitConnectionFactory"></property>
- <property name="messageListener" ref="receiveListenerAdapter"></property>
- </bean>
- <!-- 监听生产者发送的消息结束 -->
- </beans>
5.接收消息启动类Receive.java
- package cn.slimsmart.rabbitmq.demo.spring.async;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class Receive {
- public static void main(String[] args) {
- new ClassPathXmlApplicationContext("applicationContext-rabbitmq-async-receive.xml");
- }
- }
启动接收消息,再发送消息
- Received: test spring async=>0
- Received: test spring async=>1
- Received: test spring async=>2
- Received: test spring async=>3
- Received: test spring async=>4
- Received: test spring async=>5
- Received: test spring async=>6
- Received: test spring async=>7
- ......
若报如下错误,说明消息队列不存在,请在控制台添加消息队列。
- log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
- log4j:WARN Please initialize the log4j system properly.
- Exception in thread "main" org.springframework.context.ApplicationContextException: Failed to start bean 'listenerContainer'; nested exception is org.springframework.amqp.AmqpIllegalStateException: Fatal exception on listener startup
- at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:170)
- at org.springframework.context.support.DefaultLifecycleProcessor.access$1(DefaultLifecycleProcessor.java:154)
- at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:339)
- at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:143)
- at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:108)
- at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:931)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
- at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:73)
- at cn.slimsmart.rabbitmq.demo.spring.async.Consumer.main(Consumer.java:7)
- Caused by: org.springframework.amqp.AmqpIllegalStateException: Fatal exception on listener startup
- at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doStart(SimpleMessageListenerContainer.java:333)
- at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:360)
- at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:167)
- ... 8 more
- Caused by: org.springframework.amqp.rabbit.listener.FatalListenerStartupException: Cannot prepare queue for listener. Either the queue doesn't exist or the broker will not allow us to use it.
- at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:228)
- at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:516)
- at java.lang.Thread.run(Unknown Source)
- Caused by: java.io.IOException
- at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106)
- at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102)
- at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:124)
- at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:788)
- at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:61)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
- at java.lang.reflect.Method.invoke(Unknown Source)
- at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:348)
- at com.sun.proxy.$Proxy8.queueDeclarePassive(Unknown Source)
- at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:213)
- ... 2 more
- Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; reason: {#method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'spring-queue-async' in vhost '/', class-id=50, method-id=10), null, ""}
- at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67)
- at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:33)
- at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:343)
- at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:216)
- at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:118)
- ... 11 more
- Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; reason: {#method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'spring-queue-async' in vhost '/', class-id=50, method-id=10), null, ""}
- at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:473)
- at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:313)
- at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:144)
- at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:91)
- at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:533)
控制台添加队列。

(转) RabbitMQ学习之spring整合发送异步消息的更多相关文章
- (转)RabbitMQ学习之spring整合发送异步消息(注解实现)
http://blog.csdn.net/zhu_tianwei/article/details/40919249 实现使用Exchange类型为DirectExchange. routingkey的 ...
- (转) RabbitMQ学习之spring整合发送同步消息(注解实现)
http://blog.csdn.net/zhu_tianwei/article/details/40918477 上一篇文章通过xml配置rabbitmq的rabbitTemplate,本节将使用注 ...
- (转)RabbitMQ学习之spring整合发送同步消息
http://blog.csdn.net/zhu_tianwei/article/details/40890543 以下实现使用Exchange类型为DirectExchange. routingke ...
- 【RocketMQ源码学习】- 3. Client 发送同步消息
本文较长,代码后面给了方法简图,希望给你帮助 发送的方式 同步发送 异步发送 消息的类型 普通消息 顺序消息 事务消息 发送同步消息的时序图 为了防止读者朋友嫌烦,可以看下时序图,后面我也会给出方法的 ...
- ActiveMQ学习总结------Spring整合ActiveMQ 04
通过前几篇的学习,相信大家已经对我们的ActiveMQ的原生操作已经有了个深刻的概念, 那么这篇文章就来带领大家一步一步学习下ActiveMQ结合Spring的实战操作 注:本文将省略一部分与Acti ...
- RabbitMQ学习笔记之五种模式及消息确认机制
本文详细介绍简单模式Simple.工作模式Work.发布订阅模式Publish/Subscribe.Topic.Routing. Maven依赖引用 <dependencies> < ...
- Spring整合ActiveMQ实现消息延迟投递和定时投递
linux(centos)系统安装activemq参考:https://www.cnblogs.com/pxblog/p/12222231.html 首先在ActiveMQ的安装路径 /conf/ac ...
- RabbitMQ走过的坑,发送的消息是乱码
发送的消息在可视化界面中是乱码,如图: 看见这个content_tpye没有,是不是很奇怪,就是这个坑,设置下就行,看代码: @Bean Jackson2JsonMessageConverter me ...
- RabbitMQ学习之spring配置文件rabbit标签的使用
下面我们通过一个实例看一下rabbit的使用. 1.实现一个消息监听器ReceiveMessageListener.Java package org.springframework.amqp.core ...
随机推荐
- 基于分布式框架 Jepsen 的 X-Cluster 正确性测试
转自:https://mp.weixin.qq.com/s/iOe1VjG1CrHalr_I1PKdKw 原创 2017-08-27 严祥光(祥光) 阿里巴巴数据库技术 1 概述 AliSQL X-C ...
- Google HTML/CSS Style Guide
转自: http://google.github.io/styleguide/htmlcssguide.xml Google HTML/CSS Style Guide Revision 2.23 Ea ...
- @dalao help!!!
- Python学习笔记之函数
这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...
- Git 基础教程 之 从远程库克隆
③ 克隆一个本地仓库 a, 在合适的地方,在Git Bash下执行命令: git clone git@github.com:hardy9sap/gittutorial.git
- 南洋理工大学 ACM 在线评测系统 矩形嵌套
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...
- Spring Boot 配置Oracle数据库
1.添加oralce 依赖包,仓库没有则通过maven装载到本地仓库: 2.application.properties 中添加配置,特别是第一个配置项要严重注意! spring.jpa.databa ...
- Anaconda安装第三方模块
Anaconda安装第三方模块 普通安装: 进去\Anaconda\Scripts目录,conda install 模块名 源码安装: 进去第三方模块目录,python install setup.p ...
- wpf Listbox 设置ItemContainerStyle后,ItemTemplateSelector不能触发
解决方案: 将Listbox 的ItemTemplateSelector 改为 ItemContainerStyle中ContentPresenter ContentTemplateSelector ...
- js实现原生Ajax的封装及ajax原理详解
原理及概念 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指可以通过服务器语言结合数 ...