相关依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>2.1.6.RELEASE</version> </dependency>
常见工作模式示例
简单模式/工作队列模式
生产者
rabbitmq.properties
rabbitmq.host=127.0.0.1 rabbitmq.port=5672 rabbitmq.username=heoller rabbitmq.password=heoller rabbitmq.virtual.host=spring-study
spring-rabbitmq-producer.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" 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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"> <!-- 引入属性文件 --> <context:property-placeholder location="classpath:rabbitmq.properties" /> <!-- 连接工厂 --> <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}" virtual-host="${rabbitmq.virtual.host}" /> <!-- 用于管理声明的队列和交换机 --> <rabbit:admin id="admin" connection-factory="connectionFactory" /> <!-- 简单模式/工作队列模式下的queue信息 --> <rabbit:queue id="spring-simple-queue" name="spring-simple-queue" auto-declare="true" /> <!-- 广播(pub/sub)模式 --> <rabbit:queue id="spring-fanout-queue-a" name="spring-fanout-queue-a" auto-declare="true" /> <rabbit:queue id="spring-fanout-queue-b" name="spring-fanout-queue-b" auto-declare="true" /> <rabbit:fanout-exchange id="spring-fanout-exchange" name="spring-fanout-exchange"> <rabbit:bindings> <rabbit:binding queue="spring-fanout-queue-a" /> <rabbit:binding queue="spring-fanout-queue-b" /> </rabbit:bindings> </rabbit:fanout-exchange> <!-- 路由(routing)模式 --> <rabbit:queue id="spring-direct-queue-a" name="spring-direct-queue-a" auto-declare="true" /> <rabbit:queue id="spring-direct-queue-b" name="spring-direct-queue-b" auto-declare="true" /> <rabbit:direct-exchange id="spring-direct-exchange" name="spring-direct-exchange"> <rabbit:bindings> <rabbit:binding queue="spring-direct-queue-a" key="com.heoller" /> <rabbit:binding queue="spring-direct-queue-b" key="cn.heoller" /> </rabbit:bindings> </rabbit:direct-exchange> <!-- 主题(topic)模式 --> <rabbit:queue id="spring-topic-queue-a" name="spring-topic-queue-a" auto-declare="true" /> <rabbit:queue id="spring-topic-queue-b" name="spring-topic-queue-b" auto-declare="true" /> <rabbit:topic-exchange id="spring-topic-exchange" name="spring-topic-exchange"> <rabbit:bindings> <rabbit:binding pattern="*.heoller" queue="spring-topic-queue-a" /> <rabbit:binding pattern="cn.#" queue="spring-topic-queue-b" /> </rabbit:bindings> </rabbit:topic-exchange> <!-- 使用template对象发布消息 --> <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" /> </beans>
Producer.java
public class Producer { public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( "classpath:spring-rabbitmq-producer.xml"); RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class); // 生产消息 rabbitTemplate.convertAndSend("spring-simple-queue", "hello world"); } }
消费者
spring-rabbitmq-simple-consumer.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" 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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"> <!-- 引入属性文件 --> <context:property-placeholder location="classpath:rabbitmq.properties" /> <!-- 连接工厂 --> <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}" virtual-host="${rabbitmq.virtual.host}" /> <bean id="simpleListener" name="simpleListener" class="com.heoller.simple.SimpleListener" /> <rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener ref="simpleListener" queue-names="spring-simple-queue" /> </rabbit:listener-container> </beans>
SimpleListener.java
public class SimpleListener implements MessageListener { @Override public void onMessage(Message message) { System.out.println("简单模式:" + message); } }
Consumer.java
public class Consumer { public static void main(String[] args) { new ClassPathXmlApplicationContext("classpath:spring-rabbitmq-simple-consumer.xml"); } }
广播(发布订阅)模式
生产者
相关配置同简单模式
Producer.java
public class Producer { public static void main(String[] args) { RabbitTemplate rabbitTemplate = AutowiredRabbitTemplate.getRabbitTemplate(); for (int i = 0; i < 10; i++) { rabbitTemplate.convertAndSend("spring-fanout-exchange", "", "this is fanout message " + i); } } }
消费者
spring-rabbitmq-fanout-consumer.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" 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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"> <!-- 引入属性文件 --> <context:property-placeholder location="classpath:rabbitmq.properties" /> <!-- 连接工厂 --> <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}" virtual-host="${rabbitmq.virtual.host}" /> <bean id="fanoutListenerA" name="fanoutListenerA" class="com.heoller.fanout.FanoutListenerA" /> <bean id="fanoutListenerB" name="fanoutListenerB" class="com.heoller.fanout.FanoutListenerB" /> <rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener ref="fanoutListenerA" queue-names="spring-fanout-queue-a" /> <rabbit:listener ref="fanoutListenerB" queue-names="spring-fanout-queue-b" /> </rabbit:listener-container> </beans>
FanoutListenerA.java
public class FanoutListenerA implements MessageListener { @Override public void onMessage(Message message) { System.out.println("广播模式(A):" + message); } }
FanoutListenerB.java
public class FanoutListenerB implements MessageListener { @Override public void onMessage(Message message) { System.out.println("广播模式(B):" + message); } }
Consumer.java
public class Consumer { public static void main(String[] args) { new ClassPathXmlApplicationContext("classpath:spring-rabbitmq-fanout-consumer.xml"); } }
路由模式
生产者
同上面的两种模式的区别点
rabbitTemplate.convertAndSend("spring-direct-exchange", "com.heoller", "this is direct message");
消费者
同上,配置相关Listener即可
主题模式
生产者
同上面的两种模式的区别点
rabbitTemplate.convertAndSend("spring-topic-exchange", "#.heoller", "this is topic message"); rabbitTemplate.convertAndSend("spring-topic-exchange", "cn.*", "this is topic message");
消费者
同上,配置相关Listener即可