v一、安装Rabbit MQ
Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang。通过下面两个连接下载安装3.2.3 版本:
- 下载并安装 Eralng OTP For Windows (vR16B03)
- 运行安装 Rabbit MQ Server Windows Installer (v3.2.3)
- 具体操作步骤参考:在 Windows 上安装Rabbit MQ 指南
- 本人遇到的问题
当安装RabbitMQ后,使用rabbitmqctl,rabbitmq-plugins等相应的命令,出现如下错误:
* connected to epmd (port 4369) on mqmaster
* epmd reports node 'rabbit' running on port 25672
* TCP connection succeeded but Erlang distribution failed
* suggestion: hostname mismatch?
* suggestion: is the cookie set correctly?
* suggestion: is the Erlang distribution using TLS?
原因是,安装 Rabbit MQ的过程中没有使用默认的安装路径。重新安装并使用默认的安装路径就没有问题了。如果使用自定义路径,需要同步 Erlang Cookies。具体解释请参考官网中的解释:http://www.rabbitmq.com/install-windows-manual.html (在Finding Command Scripts and App Data 标题下)。
v二、Spring集成Rabbit MQ示例1
1.创建一个新的maven工程demo1。
2.pom文件依赖如下。
3.创建application.properties文件。
#mq
mq.username=guest
mq.password=guest
mq.addresses=127.0.0.1:5672
4.创建spring公共配置文件applicationContext.xml。
5.创建Rabbit MQ的配置文件。
6.新建MQ消息实体类(MqMessage.java)。
7.新建MQ消息发送接口 (MQSender.java)。
import com.hjz.rabbit.common.MqMessage; public interface MQSender { /** * 发送消息到指定队列 * @param message * @param queueName */ void sendMessage(MqMessage message, String queueName); }
8.新建MQ消息发送实现类 MQSenderImpl.java。
import java.util.UUID; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.hjz.rabbit.api.MQSender; import com.hjz.rabbit.common.MqMessage; @Component public class MQSenderImpl implements MQSender { @Autowired private AmqpTemplate amqpTemplate; @Override public void sendMessage(MqMessage message, String queueName) { if(message==null){ System.out.println("消息发送失败:消息为null"); return; } if(message.getId()==null){ message.setId(UUID.randomUUID().toString()); } amqpTemplate.convertAndSend(queueName, message); } } /* convertAndSend:将Java对象转换为消息发送到匹配Key的交换机中Exchange,由于配置了JSON转换,这里是将Java对象转换成JSON字符串的形式。
原文:Convert a Java object to an Amqp Message and send it to a default exchange with a specific routing key. */
9.创建消息监听器QueueListenter.java。
import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageListener; import org.springframework.stereotype.Component; @Component("queueListenter") public class QueueListenter implements MessageListener { @Override public void onMessage(Message msg) { try{ System.out.print(msg.toString()); }catch(Exception e){ e.printStackTrace(); } } }
10.终于到最后一步了,新建测试类。
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.hjz.rabbit.api.MQSender; import com.hjz.rabbit.common.MqMessage; @RunWith(value = SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath*:applicationContext.xml", "classpath*:applicationContext-mq.xml"}) public class TestQueue{ @Autowired private MQSender mqSender; final String queueName = "test_queue_routing_key"; @Test public void send(){ MqMessage message = new MqMessage(); message.setBody("大家好,我是hjzgg!!!"); mqSender.sendMessage(message, queueName); } }
11.最终结果,消息监听器中的输出如下。
(Body:'{"id":"723db571-1b0e-4ea5-aad4-dbfed01d158a","type":null,"params":null,"body":"大家好,我是hjzgg!!!"}' MessageProperties [headers={__TypeId__=com.hjz.rabbit.common.MqMessage}, timestamp=null, messageId=null, userId=null, receivedUserId=null, appId=null, clusterId=null, type=null, correlationId=null, correlationIdString=null, replyTo=null, contentType=application/json, contentEncoding=UTF-8, contentLength=0, deliveryMode=null, receivedDeliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=test-mq-exchange, receivedRoutingKey=test_queue_routing_key, receivedDelay=null, deliveryTag=1, messageCount=0, consumerTag=amq.ctag-PSySAf57jb5fU99UgoG2kA, consumerQueue=test_queue_name])
12.浏览器中输入“http://localhost:15672/”,进入 Rabbit MQ的管理系统,查看 queue和exchange对应的相关信息如下。
v三、Spring集成Rabbit MQ示例2
1.对MQ的生产者和消费者做了一些简单的封装,同一放到了一个工程下面里。无论是生产者还是消费者,只需要依赖上这个工程对应的jar就可以了。另外就是依赖上这个工程中MQ对应的XML文件。工程的基本结构如下所示。
2.XML文件如下。
3.消费者。
4.生产者。
示例中去掉了 Exchange,可以在完整项目中查看关于Exchange的配置。
5.消费者web2工程
继承封装过的MQ消费者抽象类,实现为实现的方法,将消息放入全局application对象中。
从全局application对象中获取消息并返回。
spring公共配置文件中<beans/>属相中加入如下配置。
default-lazy-init="false"
6.生产者web1工程
7.简单模拟MQ消息发送和接收web工程
8.tomcat下启动demo2中的web,web1,web2三个工程。浏览器中输入:http://127.0.0.1:port/web,参看 MQ 模拟示例。