RabbitMQ 与 Spring 集成
一、XML核心对象
<!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory />
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:admin />
<!--定义queue -->
<rabbit:queue />
<!-- 定义direct exchange(fanout exchange/Topic exchange),绑定rabbit:queue -->
<rabbit:direct-exchange>
<!-- 定义binding key:与queue进行绑定 -->
<rabbit:bindings>
</rabbit:bindings>
</rabbit:direct-exchange>
<!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template />
<!-- 消息接收者 -->
<bean id="messageReceiver" class="xxx.xxx.xxx.MessageConsumer"></bean>
<!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container>
<rabbit:listener queues="queue" ref="messageReceiver"/>
</rabbit:listener-container>
二、RabbitMQ 与 Spring 集成
1. 引入依赖
Spring 5 + jdk8
1.1 Spring相关依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
1.2 RabbitMQ相关依赖
<!-- https://mvnrepository.com/artifact/org.springframework.amqp/spring-rabbit -->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
2. 编写配置文件
2.1 Spring配置文件-application.xml
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<import resource="classpath*:rabbitMQ.xml" />
<!-- 扫描指定package下所有带有如@controller,@services,@resource,@ods并把所注释的注册为Spring Beans -->
<context:component-scan base-package="com.lizq.rabbit" />
<!-- 激活annotation功能 -->
<context:annotation-config />
<!-- 激活annotation功能 -->
<context:spring-configured />
</beans>
2.2 RabbitMQ配置文件-rabbitMQ.xml
<?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-1.2.xsd">
<!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory id="connectionFactory" virtual-host="/" username="admin" password="admin"
host="127.0.0.1" port="5672"/>
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:admin id="connectAdmin" connection-factory="connectionFactory"/>
<!--定义queue -->
<rabbit:queue name="spring_rabbitmq_test_queue" durable="true" auto-delete="false" exclusive="false"
declared-by="connectAdmin"/>
<!-- 定义direct exchange,绑定spring_rabbitmq_test_queue -->
<rabbit:direct-exchange name="spring_rabbitmq_test_exchange" durable="true" auto-delete="false"
declared-by="connectAdmin">
<rabbit:bindings>
<rabbit:binding queue="spring_rabbitmq_test_queue" key="kiss"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
<!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="spring_rabbitmq_test_exchange"/>
<!-- 消息接收者 -->
<bean id="messageReceiver" class="com.lizq.rabbit.MessageConsumer"></bean>
<!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener queues="spring_rabbitmq_test_queue" ref="messageReceiver"/>
</rabbit:listener-container>
</beans>
3. 生产者
package com.lizq.rabbit;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class MessageProvider {
@Resource(name = "amqpTemplate")
private AmqpTemplate amqpTemplate;
public void sendMessage(Object msg) {
// 发送消息
amqpTemplate.convertAndSend("kiss", msg);
}
}
4. 消费者
package com.lizq.rabbit;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import java.nio.charset.StandardCharsets;
public class MessageConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
System.out.println("message:" + new String(message.getBody(), StandardCharsets.UTF_8));
}
}
5. 测试类
package com.lizq.rabbit;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:application.xml");
MessageProvider bean = applicationContext.getBean(MessageProvider.class);
bean.sendMessage("阁下可是常山赵子龙");
}
}