RabbitMQ学习之spring整合发送异步消息
来源:互联网 发布:linux mysql 性能优化 编辑:程序博客网 时间:2024/06/06 01:27
实现使用Exchange类型为DirectExchange. routingkey的名称默认为Queue的名称。异步发送消息。
1.配置文件
#============== rabbitmq config ====================rabbit.hosts=192.168.36.102rabbit.username=adminrabbit.password=adminrabbit.virtualHost=/rabbit.queue=spring-queue-asyncrabbit.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.xsdhttp://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.xsdhttp://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=>0Received: test spring async=>1Received: test spring async=>2Received: test spring async=>3Received: test spring async=>4Received: test spring async=>5Received: test spring async=>6Received: 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 startupat 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 startupat 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 moreCaused 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.IOExceptionat 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 moreCaused 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 moreCaused 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)控制台添加队列。
0 0
- RabbitMQ学习之spring整合发送异步消息
- RabbitMQ学习之spring整合发送异步消息(注解实现)
- RabbitMQ学习(十一)之spring整合发送异步消息
- RabbitMQ学习之基于spring-rabbitmq的消息异步发送
- RabbitMQ学习(十二)之spring整合发送异步消息(注解实现)
- RabbitMQ学习之spring整合发送同步消息
- RabbitMQ学习(九)之spring整合发送同步消息
- RabbitMQ入门-10(整合spring-发送异步消息)
- RabbitMQ学习之spring整合发送同步消息(注解实现)
- RabbitMQ学习(十)之spring整合发送同步消息(注解实现)
- RabbitMQ入门-10-3(整合spring-发送异步消息注解实现)
- rabbitmq学习10:使用spring-ampq发送消息及异步接受消息
- rabbitmq学习10:使用spring-amqp发送消息及异步接收消息
- RabbitMQ入门-10-1(整合spring-发送同步消息)
- spring整合消息队列rabbitmq
- spring整合消息队列rabbitmq
- spring整合消息队列rabbitmq
- spring整合消息队列rabbitmq
- Android 开发中使用回调执行网络请求
- Android实现翻页功能原理
- 修饰符extern修饰变量或者函数(转)
- 程矢Axure夜话:Axure手机原型视频教程之侧滑菜单(抽屉导航)
- 以前的博客
- RabbitMQ学习之spring整合发送异步消息
- Ubuntu下crontab命令的用法
- 程矢Axure夜话: Axure手机原型视频教程汇总贴
- #define 后面跟 \
- 使用LaTex/Ctex遇到的几个问题--内存不足、pgfplots安装等
- JAVA那点儿事之查询SQL Sever结果集为空
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - Linux常见信号及处理
- 程矢Axure夜话:Axure手机原型视频教程之微信公众ETC添加公众号
- mysql desc asc基本命令总结