今天踩着坑把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就是我的项目
java SSM整合rabbitMQ
发现请求成功!
然后我们瞅瞅我们的日志输出,消费者是否消费掉
java SSM整合rabbitMQ

哈哈,到这里就全部结束了,希望能帮助到你们,这里面其实很简单一点都不难,恶心的是我同事坑了我一把。。。哈哈,当初再三确认他告诉我只用依赖一个jar,然后我居然当真了,后面越玩越不对劲,还有就是jar冲突的问题,因为不是我写的test项目,依赖乱七八糟,你们可以试一下pom依赖的时候不再去排除

好啦 哔哔到此结束,记录一下

相关文章: