本人rabbitMQ版本是3.6.5,此处省略rabbitMQ的安装方式。
windows的安装方式(十分详细):http://blog.csdn.net/chwshuang/article/details/50543878
linux的安装方式(本人整理的):http://blog.csdn.net/fuck487/article/details/77869039
rabbitMQ命令操作:http://www.cnblogs.com/ericli-ericli/p/5902270.html
一、maven依赖
<!-- rabbitmq start -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.7.3.RELEASE</version>
</dependency>
<!-- rabbitmq end -->
二、mq的spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit.xsd" >
<description>rabbitmq 连接服务配置</description>
<!-- 连接配置 -->
<rabbit:connection-factory id="mqConnectionFactory" host="${mq.host}" username="${mq.username}" password="${mq.password}" port="${mq.port}" virtual-host="${mq.vhost}"/>
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成-->
<rabbit:admin connection-factory="mqConnectionFactory"/>
<!-- 声明消息队列 -->
<!-- durable:是否持久化,宕机恢复后会重持久化日志恢复消息队列 -->
<!-- exclusive: 仅创建者可以使用的私有队列,断开后自动删除 -->
<!-- auto_delete: 当所有消费客户端连接断开后,是否自动删除队列 -->
<!-- 若已经声明消息队列,并且设置跟以下设置不一致,会报错,必须先去管理中心删除该消息队列,再重新创建消息队列 -->
<rabbit:queue id="myQueue" name="myQueue" durable="true" auto-delete="false" exclusive="false" />
<!-- 定义交换机 -->
<rabbit:direct-exchange id="myExchange" name="myExchange" durable="true" auto-delete="false" >
<!-- 可以绑定多个消息队列 -->
<rabbit:bindings>
<rabbit:binding queue="myQueue" key="myQueueKey"/>
</rabbit:bindings>
</rabbit:direct-exchange>
<!-- 消息对象json转换类 -->
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />
<!-- spring template声明-->
<rabbit:template id="amqpTemplate" exchange="myExchange" connection-factory="mqConnectionFactory" message-converter="jsonMessageConverter"/>
<!-- 定义监听器 -->
<rabbit:listener-container connection-factory="mqConnectionFactory" acknowledge="auto">
<rabbit:listener queues="myQueue" ref="queueListenter"/>
</rabbit:listener-container>
<!-- 定义监听队列的处理类 -->
<bean id="queueListenter" class="com.bluedon.useradmin.datainteraction.mq.QueueListener" />
</beans>
如果是集群连接,rabbit:connection-factory要改成如下,主要是addresses属性,格式为ip1:port,ip2:port
<rabbit:connection-factory id="mqConnectionFactory" addresses="${mq.addresses}" username="${mq.username}" password="${mq.password}" virtual-host="${mq.vhost}" />
另外如果报错提示"addresses"不存在,则就是xsd文件问题,应该用最新的xsd
http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
rabbitMQ的连接配置
#rabbitmq-config
mq.host=127.0.0.1
mq.username=guest
mq.password=guest
mq.port=5672
mq.vhost=/
集群的连接配置
mq.host=127.0.0.1
mq.username=admin
mq.password=123456
mq.port=5672
mq.addresses=192.168.153.129:5672,192.168.153.130:5672
mq.vhost=/
注:rabbitMQ连接时,我定义了新的管理员用户和虚拟主机。但是程序运行移植报错没权限。用默认的用户名密码和虚拟主机才行。暂时也没找到原因
三、定义消息队列监听类
public class QueueListener implements MessageListener {
@Override
public void onMessage(Message msg) {
try{
System.out.println(new String(msg.getBody()));
}catch(Exception e){
e.printStackTrace();
}
}
}
实现rabbitMQ的消息监听器,重写onMessage方法
四、定义消息发送类
@Service
public class MessageBuilder {
@Resource
private AmqpTemplate amqpTemplate;
public void sendDataToQueue(String queueKey, Object object){
amqpTemplate.convertAndSend(queueKey,object);
}
}
MessageBuilder实例化时也要通过spring来实例化,不然amqpTemplate是没办法spring注入的。或者amqpTemplate直接通过查找bean的方式初始化,如下
@Service
public class MessageBuilder {
/*@Resource(name="amqpTemplate")
private AmqpTemplate amqpTemplate;*/
public void sendDataToQueue(String queueKey, Object object){
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
AmqpTemplate amqpTemplate = (AmqpTemplate) context.getBean("amqpTemplate");
amqpTemplate.convertAndSend(queueKey,object);
}
}
@Controller
@RequestMapping("/test")
public class TestController {
@Resource
private TestService testService;
@Resource
private MessageBuilder builder;
@RequestMapping(value = "test", method = RequestMethod.GET)
@ResponseBody
public Object insert(String userName,String pwd,String mobileMachineCode) throws Exception{
//testService.addUser();
builder.sendDataToQueue("myQueueKey", "dadfadf");
return "ddddd";
}
}
指定rabbit交换机的消息队列的key为“myQueueKey”