使用spring-amqp发送消息及异步接收消息

前面我们已经学习了发送消息及同步接收消息的例子了。下面我们来看看如何通过Spring配置来实现异步接收消息。

   现在我们建立两个WEB项目。发送消息的项目命名为”rabbitmq-demo-producer“ ,异步接受的消息项目名称”rabbitmq-demo-consumer“。

  下面来看看rabbitmq-demo-producer项目中发送信息的程序及配置。

 MessageProducer类是用于发送消息的类。实现如下

Java代码 复制代码  收藏代码
  1. package com.abin.rabbitmq;   
  2.   
  3. import org.springframework.amqp.rabbit.core.RabbitTemplate;   
  4.   
  5. public class MessageProducer {   
  6.     private RabbitTemplate rabbitTemplate;   
  7.   
  8.     public void sendMessage(Integer i) {   
  9.         String message = "Hello World wubin " + "#" + i;   
  10.         //Exchange的名称为"hello.topic",routingkey的名称为"hello.world.q123ueue"   
  11.         rabbitTemplate.convertAndSend("hello.topic""hello.world.q123ueue",   
  12.                 message);   
  13.         System.out.println("发送第" + i + "个消息成功!内容为:" + message);   
  14.   
  15. //      String messages = "Hello World direct " + "#" + i;   
  16. //      rabbitTemplate.convertAndSend("hello.direct", "hello.world.queue",   
  17. //              messages);   
  18. //      System.out.println("发送第" + i + "个消息成功!内容为:" + messages);   
  19.     }   
  20.   
  21.     public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {   
  22.         this.rabbitTemplate = rabbitTemplate;   
  23.     }   
  24.   
  25. }  
package com.abin.rabbitmq;

import org.springframework.amqp.rabbit.core.RabbitTemplate;

public class MessageProducer {
	private RabbitTemplate rabbitTemplate;

	public void sendMessage(Integer i) {
		String message = "Hello World wubin " + "#" + i;
		//Exchange的名称为"hello.topic",routingkey的名称为"hello.world.q123ueue"
		rabbitTemplate.convertAndSend("hello.topic", "hello.world.q123ueue",
				message);
		System.out.println("发送第" + i + "个消息成功!内容为:" + message);

//		String messages = "Hello World direct " + "#" + i;
//		rabbitTemplate.convertAndSend("hello.direct", "hello.world.queue",
//				messages);
//		System.out.println("发送第" + i + "个消息成功!内容为:" + messages);
	}

	public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {
		this.rabbitTemplate = rabbitTemplate;
	}

}

 

spring的配置文件如下:applicationContext-rabbitmq.xml

Java代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">   
  5.     <bean id="connectionFactory"  
  6.         class="org.springframework.amqp.rabbit.connection.SingleConnectionFactory">   
  7.         <constructor-arg value="localhost" />   
  8.         <property name="username" value="guest" />   
  9.         <property name="password" value="guest" />   
  10.     </bean>   
  11.     <bean id="amqpAdmin"  
  12.         class="org.springframework.amqp.rabbit.core.RabbitAdmin">   
  13.         <constructor-arg ref="connectionFactory" />   
  14.     </bean>   
  15.     <bean id="rabbitTemplate"  
  16.         class="org.springframework.amqp.rabbit.core.RabbitTemplate">   
  17.         <constructor-arg ref="connectionFactory"></constructor-arg>   
  18.     </bean>   
  19.     <bean id="messageProducer"  
  20.         class="com.abin.rabbitmq.MessageProducer">   
  21.         <property name="rabbitTemplate">   
  22.             <ref bean="rabbitTemplate" />   
  23.         </property>   
  24.     </bean>   
  25. </beans>  
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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-3.0.xsd">
	<bean id="connectionFactory"
		class="org.springframework.amqp.rabbit.connection.SingleConnectionFactory">
		<constructor-arg value="localhost" />
		<property name="username" value="guest" />
		<property name="password" value="guest" />
	</bean>
	<bean id="amqpAdmin"
		class="org.springframework.amqp.rabbit.core.RabbitAdmin">
		<constructor-arg ref="connectionFactory" />
	</bean>
	<bean id="rabbitTemplate"
		class="org.springframework.amqp.rabbit.core.RabbitTemplate">
		<constructor-arg ref="connectionFactory"></constructor-arg>
	</bean>
	<bean id="messageProducer"
		class="com.abin.rabbitmq.MessageProducer">
		<property name="rabbitTemplate">
			<ref bean="rabbitTemplate" />
		</property>
	</bean>
</beans>

 

对于发送消息的程序自己可以实现,我是通过Struts2来实现的,例如

Java代码 复制代码  收藏代码
  1. package com.abin.action;   
  2.   
  3. import java.util.Date;   
  4.   
  5. import com.abin.rabbitmq.MessageProducer;   
  6. import com.opensymphony.xwork2.ActionSupport;   
  7.   
  8. public class SendAction extends ActionSupport {   
  9.     private MessageProducer messageProducer;   
  10.   
  11.     public String execute() throws Exception {   
  12.         Date a = new Date();   
  13.         long b = System.currentTimeMillis();   
  14.         for (int i = 0; i <= 10000; i++) {   
  15.             messageProducer.sendMessage(i);   
  16.         }   
  17.         System.out.println(a);   
  18.         System.out.println(new Date());   
  19.         System.out.println("共花了" + (System.currentTimeMillis() - b) + "ms");   
  20.         return null;   
  21.     }   
  22.   
  23.     public void setMessageProducer(MessageProducer messageProducer) {   
  24.         this.messageProducer = messageProducer;   
  25.     }   
  26.   
  27. }  
package com.abin.action;

import java.util.Date;

import com.abin.rabbitmq.MessageProducer;
import com.opensymphony.xwork2.ActionSupport;

public class SendAction extends ActionSupport {
	private MessageProducer messageProducer;

	public String execute() throws Exception {
		Date a = new Date();
		long b = System.currentTimeMillis();
		for (int i = 0; i <= 10000; i++) {
			messageProducer.sendMessage(i);
		}
		System.out.println(a);
		System.out.println(new Date());
		System.out.println("共花了" + (System.currentTimeMillis() - b) + "ms");
		return null;
	}

	public void setMessageProducer(MessageProducer messageProducer) {
		this.messageProducer = messageProducer;
	}

}

 

发送消息项目的程序差不多就这些了

下面来看看接受消息的程序如下

HelloWorldHandler类用于接收消息的处理类,如下

 

Java代码 复制代码  收藏代码
  1. package com.abin.rabbitmq;   
  2.   
  3. import java.util.Date;   
  4.   
  5. public class HelloWorldHandler {   
  6.     public void handleMessage(String text) {   
  7.         System.out.println("Received: " + text);   
  8.   
  9.         System.out.println(new Date());   
  10.     }   
  11. }  
package com.abin.rabbitmq;

import java.util.Date;

public class HelloWorldHandler {
	public void handleMessage(String text) {
		System.out.println("Received: " + text);

		System.out.println(new Date());
	}
}

 

spring的配置文件如下:applicationContext-rabbitmq.xml

 

 

Java代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">   
  5.     <!-- 创建connectionFactory -->   
  6.     <bean id="connectionFactory"  
  7.         class="org.springframework.amqp.rabbit.connection.SingleConnectionFactory">   
  8.         <constructor-arg value="localhost" />   
  9.         <property name="username" value="guest" />   
  10.         <property name="password" value="guest" />   
  11.     </bean>   
  12.     <!-- 创建rabbitAdmin 代理类 -->   
  13.     <bean id="rabbitAdmin"  
  14.         class="org.springframework.amqp.rabbit.core.RabbitAdmin">   
  15.         <constructor-arg ref="connectionFactory" />   
  16.     </bean>   
  17.     <!-- 创建rabbitTemplate 消息模板类 -->   
  18.     <bean id="rabbitTemplate"  
  19.         class="org.springframework.amqp.rabbit.core.RabbitTemplate">   
  20.         <constructor-arg ref="connectionFactory"></constructor-arg>   
  21.     </bean>   
  22.     <!-- 声明Queue并设定Queue的名称 -->   
  23.     <bean id="helloWorldQueue"  
  24.         class="org.springframework.amqp.core.Queue">   
  25.         <constructor-arg value="hello.world.queue"></constructor-arg>   
  26.     </bean>   
  27.     <!-- 声明消息转换器为SimpleMessageConverter -->   
  28.     <bean id="messageConverter"  
  29.         class="org.springframework.amqp.support.converter.SimpleMessageConverter">   
  30.     </bean>   
  31.     <!-- 声明Exchange的类型为topic并设定Exchange的名称 -->   
  32.     <bean id="hellotopic"  
  33.         class="org.springframework.amqp.core.TopicExchange">   
  34.         <constructor-arg value="hello.topic"></constructor-arg>   
  35.     </bean>   
  36.   
  37.     <!-- 声明Exchange的类型为direct并设定Exchange的名称 -->   
  38.     <bean id="hellodirect"  
  39.         class="org.springframework.amqp.core.DirectExchange">   
  40.         <constructor-arg value="hello.direct"></constructor-arg>   
  41.     </bean>   
  42.     <!-- 通过Binding来判定Queue、Exchange、routingKey -->   
  43.     <!-- 其中构建Binding的参数1是Queue,参数2是Exchange,参数3是routingKey -->   
  44.     <bean id="queuebling"  
  45.         class="org.springframework.amqp.core.Binding">   
  46.         <constructor-arg index="0" ref="helloWorldQueue"></constructor-arg>   
  47.         <constructor-arg index="1" ref="hellotopic"></constructor-arg>   
  48.         <constructor-arg index="2" value="hello.world.#"></constructor-arg>   
  49.     </bean>   
  50.     <!-- 监听生产者发送的消息开始 -->   
  51.     <!-- 用于接收消息的处理类 -->   
  52.     <bean id="helloWorldHandler"  
  53.         class="com.abin.rabbitmq.HelloWorldHandler">   
  54.     </bean>   
  55.     <!-- 用于消息的监听的代理类MessageListenerAdapter -->   
  56.     <bean id="helloListenerAdapter"  
  57.         class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter">   
  58.         <constructor-arg ref="helloWorldHandler" />   
  59.         <property name="defaultListenerMethod" value="handleMessage"></property>   
  60.         <property name="messageConverter" ref="messageConverter"></property>   
  61.     </bean>   
  62.     <!-- 用于消息的监听的容器类SimpleMessageListenerContainer,对于queueName的值一定要与定义的Queue的值相同 -->   
  63.     <bean id="listenerContainer"  
  64.         class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">   
  65.         <property name="queueName" value="hello.world.queue"></property>   
  66.         <property name="connectionFactory" ref="connectionFactory"></property>   
  67.         <property name="messageListener" ref="helloListenerAdapter"></property>   
  68.     </bean>   
  69.     <!-- 监听生产者发送的消息结束 -->   
  70. </beans>  

参考:http://wubin850219.iteye.com/blog/1050328

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值