RabbitMQ学习之spring整合发送异步消息

实现使用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#routingkey的名称默认为Queue的名称
2.生产者配置applicationContext-rabbitmq-async-send.xml:




	
		
		
		
			
				
				classpath*:/application.properties
			
		
	
	
    
    
	    
	    
	    
	    
	    
	
	
	
	
		
	
	
	
	
		
		
	
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:



   
   	
		
		
		
			
				
				classpath*:/application.properties
			
		
	
	
    
    
	    
	    
	    
	    
	    
	
	
	  
      
      
      
      
      
      
      
      
          
          
          
      
      
      
         
          
          
      
      
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.(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(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(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整合发送异步消息_第1张图片

你可能感兴趣的:(RabbitMQ,RabbitMQ学习教程)