今天踩着坑把rabbit搭建完成,融入SSM项目,这里记录一下,亲测OK
首先肯定是pom依赖啦,直接贴代码
<!--rabbitMQ依赖-->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.3.6.RELEASE</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>1.7.5.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.2.2.RELEASE</version>
</dependency>
之前和我项目中的jar有个冲突,但是头疼的是没有找到具体是哪个jar冲突,所以很尴尬,先排除*
接下来就是我们的spring的配置文件,需要引入一下我们的生产者和消费者配置,通常叫application.xml
<import resource="classpath*:rabbitmq/spring-rabbitmq-producter.xml"/>
<import resource="classpath*:rabbitmq/spring-rabbitmq-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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">
<!-- 连接服务配置 -->
<rabbit:connection-factory id="connectionFactory"
host="${rabbitmq.host}" username="${rabbitmq.username}" password="${rabbitmq.password}"
port="${rabbitmq.port}" virtual-host="${rabbitmq.virtualhost}"/>
<rabbit:admin connection-factory="connectionFactory"/>
<!-- queue 队列声明 -->
<!-- durable=true,交换机持久化,rabbitmq服务重启交换机依然存在,保证不丢失; durable=false,相反 -->
<!-- auto-delete=true:无消费者时,队列自动删除; auto-delete=false:无消费者时,队列不会自动删除 -->
<!-- 排他性,exclusive=true:首次申明的connection连接下可见; exclusive=false:所有connection连接下都可见 -->
<rabbit:queue id="rabbitmq_plm7020" durable="true" auto-delete="false" exclusive="false"
name="${rabbitmq.plm7020}"/>
<!-- exchange queue binging key 绑定 -->
<!-- durable=true,交换机持久化,rabbitmq服务重启交换机依然存在,保证不丢失; durable=false,相反 -->
<!-- auto-delete=true:无消费者时,队列自动删除; auto-delete=false:无消费者时,队列不会自动删除 -->
<rabbit:direct-exchange name="${rabbitmq.exchangeName}" durable="true" auto-delete="false"
id="${rabbitmq.exchangeName}">
<rabbit:bindings>
<rabbit:binding queue="${rabbitmq.plm7020}" key="q_plm7020"/>
</rabbit:bindings>
</rabbit:direct-exchange>
<rabbit:template id="amqpTemplate" exchange="${rabbitmq.exchangeName}" connection-factory="connectionFactory"/>
</beans>
其他${}配置的就是你的rabbit设置的配置文件,如果你真的很小白,那么网上搜一下都有,不在此过多叙述。。。
可以看到有个key=“q_plm7020”,这个玩意儿后面生产者代码要用到,指定为生产到具体的队列中
接下来是我们的生产者代码
package com.zdmoney.credit.framework.mq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @Author: zhangjiachen
* @Date: 2018/10/29 16:11
* @Description: 生产者test
*/
@Service
public class ProducterTest {
private static Logger logger = LoggerFactory.getLogger(ProducterTest.class);
@Resource
private RabbitTemplate rabbitTemplate;
public void sendMessage(String message) {
logger.info("to send message:{}", message);
rabbitTemplate.convertAndSend("q_plm7020", message);
}
}
可以看到代码中的rabbitTemplate.convertAndSend(“q_plm7020”, message);里面的q_plm7020是我们生产者xml中配置的那个对应的字段,指定为生产到这个队列中
接下来是消费者的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-1.0.xsd">
<!-- 连接服务配置 -->
<rabbit:connection-factory id="connectionFactory"
host="${rabbitmq.host}" username="${rabbitmq.username}" password="${rabbitmq.password}"
port="${rabbitmq.port}" virtual-host="${rabbitmq.virtualhost}"/>
<rabbit:admin connection-factory="connectionFactory"/>
<!-- queue 队列声明 -->
<!-- durable=true,交换机持久化,rabbitmq服务重启交换机依然存在,保证不丢失; durable=false,相反 -->
<!-- auto-delete=true:无消费者时,队列自动删除; auto-delete=false:无消费者时,队列不会自动删除 -->
<!-- 排他性,exclusive=true:首次申明的connection连接下可见; exclusive=false:所有connection连接下都可见 -->
<rabbit:queue id="rabbitmq_plm7020" durable="true" auto-delete="false" exclusive="false"
name="${rabbitmq.plm7020}"/>
<!-- exchange queue binging key 绑定 -->
<!-- durable=true,交换机持久化,rabbitmq服务重启交换机依然存在,保证不丢失; durable=false,相反 -->
<!-- auto-delete=true:无消费者时,队列自动删除; auto-delete=false:无消费者时,队列不会自动删除 -->
<rabbit:direct-exchange name="${rabbitmq.exchangeName}" durable="true" auto-delete="false"
id="${rabbitmq.exchangeName}">
<rabbit:bindings>
<rabbit:binding queue="${rabbitmq.plm7020}" key="q_plm7020"/>
</rabbit:bindings>
</rabbit:direct-exchange>
<bean id="testConsumer" class="com.zdmoney.credit.framework.mq.ConsumerTest"/>
<rabbit:listener-container
connection-factory="connectionFactory" acknowledge="manual">
<rabbit:listener queues="${rabbitmq.plm7020}" ref="testConsumer"/>
</rabbit:listener-container>
</beans>
然后直接是我们的消费者java代码“:
package com.zdmoney.credit.framework.mq;
import com.rabbitmq.client.Channel;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
import org.springframework.stereotype.Service;
/**
* @Author: zhangjiachen
* @Date: 2018/10/29 16:05
* @Description: 消费者test
*/
@Service
public class ConsumerTest implements ChannelAwareMessageListener {
private static Logger logger = LoggerFactory.getLogger(ConsumerTest.class);
@Override
public void onMessage(Message message, Channel channel) throws Exception {
try {
String jsonMsg = new String(message.getBody());
if (StringUtils.isBlank(jsonMsg)) {
logger.warn("MQ接收到消息为空!");
return;
}
logger.info("收到消息为:" + jsonMsg);
} catch (Exception e) {
logger.error("MQ消息处理异常!", e);
} finally {
//告诉rabbit消费成功
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
}
}
这里需要注意一下,监听的类需要在消费的xml中配置对应
以上就是生产消费的所有配置,我没有写单元测试或者main跑,因为这样可能不是太直观贴近实际开发,我之前看网上的demo也感觉不带劲,然后自己写个controller爽一把吧
直接撸出来controller代码
package com.zdmoney.credit.framework.controller;
import com.zdmoney.credit.framework.mq.ProducterTest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: zhangjiachen
* @Date: 2018/10/29 16:24
* @Description: 测试MQ地址
*/
@RestController
@Slf4j
public class RabbitMqControllerTest {
@Autowired
private ProducterTest producter;
@RequestMapping("/testMq")
public String testMq() {
log.info("请求OK,开始生产消息");
producter.sendMessage("hello world!");
log.info("请求OK,生产结束!");
return "你的MQ发送成功!";
}
}
然后我们去访问地址 http://项目/testMq
因为我本地有nginx做个层转发,我访问的是localhost就是我的项目
发现请求成功!
然后我们瞅瞅我们的日志输出,消费者是否消费掉
哈哈,到这里就全部结束了,希望能帮助到你们,这里面其实很简单一点都不难,恶心的是我同事坑了我一把。。。哈哈,当初再三确认他告诉我只用依赖一个jar,然后我居然当真了,后面越玩越不对劲,还有就是jar冲突的问题,因为不是我写的test项目,依赖乱七八糟,你们可以试一下pom依赖的时候不再去排除
好啦 哔哔到此结束,记录一下