1,Producer pom起步依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
rabbitmq.properties配置文件:
rabbitmq.host=139.196.37.163
rabbitmq.port=5672
rabbitmq.username=admin
rabbitmq.password=admin
rabbitmq.virtual-host=my_vhost
spring-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: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.xsd">
<!--加载配置文件-->
<context:property-placeholder location="classpath:properties/rabbitmq.properties"></context:property-placeholder>
<!-- 定义rabbitmq connectionFactory -->
<rabbit:connection-factory id="connectionFactory"
host="${rabbitmq.host}"
port="${rabbitmq.port}"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
virtual-host="${rabbitmq.virtual-host}"
></rabbit:connection-factory>
<!--定义管理交换机、队列-->
<rabbit:admin connection-factory="connectionFactory"></rabbit:admin>
<!--定义持久化队列,不存在则自动创建;不绑定到交换机则绑定到默认交换机
默认交换机类型为direct,名字为:"",路由键为队列的名称
-->
<rabbit:queue id="spring_queue" name="spring_queue" auto-declare="true"></rabbit:queue>
<!-- <!– ~~~~~~~~~~~~~~~~~~~~~~~~~~~~广播;所有队列都能收到消息~~~~~~~~~~~~~~~~~~~~~~~~~~~~ –>-->
<!-- <rabbit:queue id="spring_fanout_queue1" name="spring_fanout_queue1" auto-declare="true"></rabbit:queue>-->
<!-- <rabbit:queue id="spring_fanout_queue2" name="spring_fanout_queue2" auto-declare="true"></rabbit:queue>-->
<!-- <!–定义广播类型交换机;并绑定上述两个队列–>-->
<!-- <rabbit:fanout-exchange name="spring_fanout_exchange" id="spring_fanout_exchange" auto-declare="true">-->
<!-- <rabbit:bindings>-->
<!-- <rabbit:binding queue="spring_fanout_queue1"></rabbit:binding>-->
<!-- <rabbit:binding queue="spring_fanout_queue2"></rabbit:binding>-->
<!-- </rabbit:bindings>-->
<!-- </rabbit:fanout-exchange>-->
<!--~~~~~~~~~~~~~~~~~~~~路由:指定队列能接收到消息~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
<!-- <rabbit:queue id="spring_direct_queue1" name="spring_direct_queue1" auto-declare="true"></rabbit:queue>-->
<!-- <rabbit:queue id="spring_direct_queue2" name="spring_direct_queue2" auto-declare="true"></rabbit:queue>-->
<!-- <!–定义路由类型交换机:并绑定连个队列–>-->
<!-- <rabbit:direct-exchange name="spring_direct_exchange" id="spring_direct_exchange" auto-declare="true">-->
<!-- <rabbit:bindings>-->
<!-- <rabbit:binding queue="spring_direct_queue1" key="error"></rabbit:binding>-->
<!-- <rabbit:binding queue="spring_direct_queue2" key="error"></rabbit:binding>-->
<!-- <rabbit:binding queue="spring_direct_queue2" key="exchange"></rabbit:binding>-->
<!-- <rabbit:binding queue="spring_direct_queue2" key="show"></rabbit:binding>-->
<!-- </rabbit:bindings>-->
<!-- </rabbit:direct-exchange>-->
<!--~~~~~~~~~~~~~~~~~~~~通配符:*匹配一个单词,#匹配多个单词~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
<rabbit:queue id="spring_topic_queue1" name="spring_topic_queue1" auto-declare="true"></rabbit:queue>
<rabbit:queue id="spring_topic_queue2" name="spring_topic_queue2" auto-declare="true"></rabbit:queue>
<!--~~~~~~~~~~~~~~~~~~~~~定义交换机类型~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
<rabbit:topic-exchange name="spring_topic_exchange" auto-declare="true">
<rabbit:bindings>
<rabbit:binding pattern="atguigu.*" queue="spring_topic_queue1"></rabbit:binding>
<rabbit:binding pattern="#.*" queue="spring_topic_queue1"></rabbit:binding>
<rabbit:binding pattern="*.*" queue="spring_topic_queue2"></rabbit:binding>
<rabbit:binding pattern="*.atguigu" queue="spring_topic_queue2"></rabbit:binding>
</rabbit:bindings>
</rabbit:topic-exchange>
<!--定义rabbitTemplate对象操作可以在代码中方便发送消息-->
<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"></rabbit:template>
</beans>
编写测试类:
ProducerTest
@RunWith(SpringRunner.class)
@ContextConfiguration(locations = "classpath:spring/spring-rabbitmq.xml")
public class ProducerTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void test1(){
//路由键与队列同名
rabbitTemplate.convertAndSend("spring_queue","只发队列spring_queue的消息。");
}
@Test
public void test2(){
//广播队列
rabbitTemplate.convertAndSend("spring_fanout_exchange","","鸟好");
}
@Test
public void test3(){
//路由队列
rabbitTemplate.convertAndSend("spring_direct_exchange","error","鸟假假假假");
}
@Test
public void test4(){
//路由队列
rabbitTemplate.convertAndSend("spring_topic_exchange","error.Ahaha.atguigu","康康我");
}
}
2,Consumer pom配置文件:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
spring-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: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.xsd">
<!--加载配置文件-->
<context:property-placeholder location="classpath:properties/rabbitmq.properties"></context:property-placeholder>
<!-- 定义rabbitmq connectionFactory -->
<rabbit:connection-factory id="connectionFactory"
host="${rabbitmq.host}"
port="${rabbitmq.port}"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
virtual-host="${rabbitmq.virtual-host}"
></rabbit:connection-factory>
<!--队列监听器-->
<bean id="springQueueListener" class="com.atguigu.rabbitmq.listener.SpringQueueListener"></bean>
<!--~~~~~~~~~~~~~~~~~~~监听普通队列~~~~~~~~~~~~~~~~~~~~~~-->
<!-- <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">-->
<!-- <rabbit:listener ref="springQueueListener" queue-names="spring_queue"></rabbit:listener>-->
<!-- </rabbit:listener-container>-->
<!--~~~~~~~~~~~~~~~~~~~监听广播队列~~~~~~~~~~~~~~~~~~~~~~-->
<!-- <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">-->
<!-- <rabbit:listener ref="springQueueListener" queue-names="spring_fanout_queue1"></rabbit:listener>-->
<!-- <rabbit:listener ref="springQueueListener" queue-names="spring_fanout_queue2"></rabbit:listener>-->
<!-- </rabbit:listener-container>-->
<!--~~~~~~~~~~~~~~~~~~~监听路由队列~~~~~~~~~~~~~~~~~~~~~~-->
<!-- <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">-->
<!-- <rabbit:listener ref="springQueueListener" queue-names="spring_direct_queue1"></rabbit:listener>-->
<!-- <rabbit:listener ref="springQueueListener" queue-names="spring_direct_queue2"></rabbit:listener>-->
<!-- </rabbit:listener-container>-->
<!--~~~~~~~~~~~~~~~~~~~监听路由队列~~~~~~~~~~~~~~~~~~~~~~-->
<rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
<rabbit:listener ref="springQueueListener" queue-names="spring_topic_queue1"></rabbit:listener>
<rabbit:listener ref="springQueueListener" queue-names="spring_topic_queue2"></rabbit:listener>
</rabbit:listener-container>
</beans>
编写ConsumerTest测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/spring-rabbitmq.xml")
public class ConsumerTest {
@Test
public void test1() {
boolean flag = true;
while (true) {
}
}
}
队列监听器:SpringQueueListener类
public class SpringQueueListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
String msg = new String(message.getBody(), "utf-8");
System.out.printf("接收路由名称为:%s,路由键为:%s,队列名为:%s的消息:%s \n",
message.getMessageProperties().getReceivedExchange(),
message.getMessageProperties().getReceivedRoutingKey(),
message.getMessageProperties().getConsumerQueue(),
new String(message.getBody()));
} catch (Exception e) {
e.printStackTrace();
}
}
}