RabbitMQ在集成到SpringMVC的过程中,可能会遇到很多坑,网上很多配置都有问题,要么无法发消息,要么无法接收消息,LZ特将能够使用的配置发出来,分享给大家。
首先添加Maven依赖:
-
<dependency>
-
<groupId>org.springframework.amqp</groupId>
-
<artifactId>spring-rabbit</artifactId>
-
<version>1.3.6.RELEASE</version>
-
</dependency>
-
<dependency>
-
<groupId>com.rabbitmq</groupId>
-
<artifactId>amqp-client</artifactId>
-
<version>3.5.1</version>
-
</dependency>
创建配置文件,application-mq.xml
添加代码:
-
<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.0.xsd" >
-
<description>rabbitmq 连接服务配置</description>
-
<!-- 连接配置 -->
-
<bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
-
<property name="username" value="lynn"></property>
-
<property name="password" value="lynn"></property>
-
<property name="virtualHost" value="/"></property>
-
<property name="addresses" value="192.168.1.38:5672"></property>
-
<property name="publisherConfirms" value="true"></property>
-
</bean>
-
<!-- spring template声明-->
-
<bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate">
-
<constructor-arg name="connectionFactory" ref="connectionFactory"/>
-
<!--消息确认回调 -->
-
<property name="confirmCallback" ref="producer"/>
-
</bean>
-
<bean id="queue" class="org.springframework.amqp.core.Queue">
-
<constructor-arg name="name" value="spring-boot-queue"></constructor-arg>
-
<constructor-arg name="durable" value="true"></constructor-arg>
-
</bean>
-
<bean id="exchange" class="org.springframework.amqp.core.DirectExchange">
-
<constructor-arg name="name" value="spring-boot-exchange"></constructor-arg>
-
</bean>
-
<bean id="binding" class="cn.sunsharp.bigdata.mq.MyBinding" init-method="createBinding">
-
<constructor-arg index="0" ref="queue"></constructor-arg>
-
<constructor-arg index="1" ref="exchange"></constructor-arg>
-
<constructor-arg index="2" value="spring-boot-routingKey"></constructor-arg>
-
</bean>
-
<bean name="queueListenter" class="cn.sunsharp.bigdata.mq.QueueListenter"></bean>
-
<bean name="producer" class="cn.sunsharp.bigdata.mq.RmqProducer"></bean>
-
<bean id="messageContainer" class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">
-
<property name="queues" ref="queue"></property>
-
<property name="exposeListenerChannel" value="true"></property>
-
<property name="maxConcurrentConsumers" value="10"></property>
-
<property name="concurrentConsumers" value="2"></property>
-
<property name="connectionFactory" ref="connectionFactory"></property>
-
<property name="acknowledgeMode" value="MANUAL"></property>
-
<property name="messageListener" ref="queueListenter"></property>
-
</bean>
-
</beans>
添加Java代码:
生产者:
-
package cn.sunsharp.bigdata.mq;
-
import java.util.UUID;
-
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
-
import org.springframework.amqp.rabbit.core.RabbitTemplate;
-
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
-
import org.springframework.amqp.rabbit.support.CorrelationData;
-
import org.springframework.beans.factory.annotation.Autowired;
-
public class RmqProducer implements ConfirmCallback{
-
private RabbitTemplate template;
-
@Autowired
-
public RmqProducer(RabbitTemplate template){
-
this.template = template;
-
}
-
/* (non-Javadoc)
-
* @see com.stnts.tita.rm.api.mq.MQProducer#sendDataToQueue(java.lang.String, java.lang.Object)
-
*/
-
public void sendMessage(String content) {
-
try {
-
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
-
template.convertAndSend("spring-boot-exchange", "spring-boot-routingKey",content,correlationId);
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
@Override
-
public void confirm(CorrelationData correlationData, boolean ack) {
-
System.out.println(" 回调id:" + correlationData+"ack:"+ack);
-
}
-
}
消费者:
-
package cn.sunsharp.bigdata.mq;
-
import org.springframework.amqp.core.Message;
-
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
-
import com.rabbitmq.client.Channel;
-
public class QueueListenter implements ChannelAwareMessageListener{
-
@Override
-
public void onMessage(Message message, Channel channel) throws Exception {
-
byte[] body = message.getBody();
-
System.out.println("receive msg : " + new String(body));
-
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //确认消息成功消费
-
}
-
}
//必须要添加如下这个类,否者无法接收消息。
-
package cn.sunsharp.bigdata.mq;
-
import org.springframework.amqp.core.Binding;
-
import org.springframework.amqp.core.BindingBuilder;
-
import org.springframework.amqp.core.DirectExchange;
-
import org.springframework.amqp.core.Queue;
-
public class MyBinding {
-
private Queue queue;
-
private DirectExchange exchange;
-
private String routingkey;
-
private MyBinding(Queue queue,DirectExchange exchange,String routingkey){
-
this.queue = queue;
-
this.exchange = exchange;
-
this.routingkey = routingkey;
-
}
-
public Binding createBinding(){
-
return BindingBuilder.bind(queue).to(exchange).with(routingkey);
-
}
-
}
下面测试代码:
-
@Resource(name="producer")
-
private RmqProducer producer;
-
public voidtest(){
-
try {
-
//发送消息
-
producer.sendMessage("test");
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
控制台即可打印接收到的消息。
原文地址:https://blog.csdn.net/lynnlovemin/article/details/71750705