spring 整合 rabbitmq
(rabbitmq的简单认识)
Rabbitmq 是一种消息队列 消息队列都会包含 producer(生产者),consumer(消费者)及broker(代理)
RabbitMQ 是信息传输的中间者。本质上,他从生产者(producers)接收消息,转发这些消息给消费者(consumers).换句话说,他能够按根据你指定的规则进行消息转发、缓冲、和持久化。
(spring+rabbitmq)
首先需要启动rabbitmq 可查看http://blog.youkuaiyun.com/raccoon_hzy/article/details/53893379 这个地址进行rabbitmq的安装与启动,接下来就开始入门案例
一个producer发送消息,一个接收者(consumer)接收消息,并在控制台打印出来。
1,消息生产者(producer)
1.1 创建一个maven项目
1.2 在maven项目的pom文件中添加入约束
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<!-- amqp队列服务 -->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.4.1.RELEASE</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
1.3 编写spring核心配置文件 applicationContext.properties
<?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:context="http://www.springframework.org/schema/context"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.chainhu" />
<!-- 加载properties文件 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:application.properties</value>
</list>
</property>
</bean>
<import resource="classpath:rabbit-config.xml"/>
</beans>
1.4 编写参数配置文件 application.properties
1.5 编写rabbitmq的配置文件rabbit-config.xml
<!-- RabbitMq 配置 开始 -->
<!-- 创建connectionFactory -->
<rabbit:connection-factory id="rabbitConnectionFactory"
host="${host}" port="${port}" username="${username}" password="${password}"
virtual-host="${virtualhost}" />
<rabbit:admin connection-factory="rabbitConnectionFactory" />
<!-- 队列生产者 -->
<rabbit:template id="rabbitAmqpTemplate"
connection-factory="rabbitConnectionFactory" exchange="${exchange}"
routing-key="30000" />
<bean id="rabbitQueueManager" class="com.chainhu.rabbitmq.common.RabbitQueueManager">
<property name="rabbitAmqpTemplate" ref="rabbitAmqpTemplate" />
</bean>
1.6 编写测试类 test.class
@Test
public void queueSend(){
while(true){
QueueMessage qm = new QueueMessage();
qm.setCode("0");
qm.setOrderId("123456");
qm.setDesc("操作成功!");
try {
Thread.sleep(5000);
boolean b = RabbitQueueManager.queueSend(qm);
System.out.println(b);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.7 控制台打印出 true时表示消息发送成功!
2 队列消费者(consumer)
2.1 建立队列消费者 配置文件 rabbit-config-consumer.xml
<!-- RabbitMq 配置 开始 -->
<!-- 创建connectionFactory -->
<rabbit:connection-factory id="rabbitConnectionFactory"
host="${host}" port="${port}" username="${username}" password="${password}"
virtual-host="${virtualhost}" />
<rabbit:admin connection-factory="rabbitConnectionFactory" />
<!-- 队列消费者 -->
<!-- durable="true"队列是否持久化 exclusive="false"当连接不存在时队列是否自动删除 auto-declare="true" -->
<!-- auto-delete="true" direct交换器 当声明的exchange连接断开时,exchange是否删除 -->
<rabbit:queue durable="true" exclusive="false"
auto-declare="true" name="${queue}"></rabbit:queue>
<!-- consumer 队列消费者监听 -->
<bean name="rabbitConsumer" class="com.chainhu.rabbitmq.comsumer.RabbitConsumer"
lazy-init="false" />
<rabbit:listener-container
connection-factory="rabbitConnectionFactory" acknowledge="manual">
<!-- acknowledge="manual" 响应反馈为手动响应 -->
<rabbit:listener ref="rabbitConsumer" method="onMessage"
queue-names="${queue}" />
</rabbit:listener-container>
2.2 建立队列监听类 RabbitConsumer.class
public class RabbitConsumer implements ChannelAwareMessageListener {
public void onMessage(Message message, Channel channel) throws Exception {
try{
String respMessage = new String(message.getBody(), "UTF-8");
System.out.println("消费者接收到消息:"+respMessage);
// 确认返回状态
channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
}catch(Exception e){
e.printStackTrace();
channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
}
}
}
2.3 运行项目 当控制台打印出
{"code":"0","desc":"操作成功!","orderId":"123456"} |
此时队列消费者建立成功!
spring 整合rabbitmq 简单案例结束!