RabbitMq的java代码整合Springboot

1.引入pom.xml文件

   <!-- rabbitmq -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

2.编写spring和rabbitmq的代码

2.1 引入rabbitmq的交换机和队列的常量类

package com.thunisoft.dzsjfcg.rabbitmq;

/**
 * @Author ZhPJ
 * @Date 2019/10/8 000818:00
 * @Version 1.0
 * @Description:
 */
public interface RabbitMqConst {

    interface RabbitMqYZ{

        String QUEUE = "yz.queue";

        String EXCHANGE = "yz.direct";

        String ROUTING_KEY = "yz.*";

    }

    /**
     * 死信队列的交换机和队列
     */
    interface RabbitMqDead {

        String QUEUE_DEAD = "dlx.deadqueue";

        String EXCHANGE_DEAD = "dlx.exchange";
    }

}

2.2 编写rabbitmq的配置,主要配置为消息交换机和队列的配置

  交换机分为   消息交换机和死信交换机。      队列分为   消息队列和死信队列

package com.thunisoft.dzsjfcg.rabbitmq;

import com.google.common.collect.ImmutableMap;
import org.springframework.amqp.core.*;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.Map;

/**
 * @Author ZhPJ
 * @Date 2019/10/8 000817:58
 * @Version 1.0
 * @Description:
 */
@Configuration
public class RabbitMqConfig {

    @Autowired
    private AmqpAdmin amqpAdmin;

    /**
     * 初始化加载,初始化交换机和队列
     */
    @PostConstruct
    public void init () {
// 普通交换机和普通队列 amqpAdmin.declareExchange(
new DirectExchange(RabbitMqConst.RabbitMqYZ.EXCHANGE)); amqpAdmin.declareQueue(new Queue(RabbitMqConst.RabbitMqYZ.QUEUE)); amqpAdmin.declareBinding(new Binding(RabbitMqConst.RabbitMqYZ.QUEUE, Binding.DestinationType.QUEUE, RabbitMqConst.RabbitMqYZ.EXCHANGE, RabbitMqConst.RabbitMqYZ.ROUTING_KEY, null));      // 死信交换机和死信队列 amqpAdmin.declareExchange(new FanoutExchange(RabbitMqConst.RabbitMqDead.EXCHANGE_DEAD)); final Map<String, Object> options = ImmutableMap.<String, Object>builder() .put("x-dead-letter-exchange", RabbitMqConst.RabbitMqDead.EXCHANGE_DEAD) .put("x-dead-letter-routing-key", RabbitMqConst.RabbitMqDead.QUEUE_DEAD) .build(); amqpAdmin.declareQueue(new Queue(RabbitMqConst.RabbitMqDead.QUEUE_DEAD, true, false, false, options)); amqpAdmin.declareBinding(new Binding(RabbitMqConst.RabbitMqDead.QUEUE_DEAD, Binding.DestinationType.QUEUE, RabbitMqConst.RabbitMqDead.EXCHANGE_DEAD, "", null)); } /** * 消息格式化 主要是针对消息的格式化。主要是将对象 变成json格式 * @return */ @Bean public MessageConverter messageConverter () { return new Jackson2JsonMessageConverter(); } }

2.3  普通的消费队列

package com.thunisoft.dzsjfcg.rabbitmq;

import com.alibaba.fastjson.JSONObject;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @Author ZhPJ
 * @Date 2019/10/8 000818:11
 * @Version 1.0
 * @Description:  rabbitMqErrorHandle 是异常处理类,spring中的id
* @RabbitListener (queues = {监听的消费队列}, errorHandle = "发生异常或者错误用于处理的类")
*/ @RabbitListener(queues = {RabbitMqConst.RabbitMqYZ.QUEUE}, errorHandler = "rabbitMqErrorHandle") @Component public class RabbitMqYZListenerHandler { /** * TODO ------ 消费普通队列 * @param cz 这个参数要和发送消息的时候的参数保持一致 * @throws IOException */ @RabbitHandler public void consumerUser (JSONObject cz){ System.out.println(cz); System.out.println("rabbitmq consumer-----------------"); } }

2.4 普通消息错误处理器

package com.thunisoft.dzsjfcg.rabbitmq;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.api.RabbitListenerErrorHandler;
import org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Author ZhPJ
 * @Date 2019/9/30 003015:26
 * @Version 1.0
 * @Description: 死信队列,当发生异常的时候,会进入此类,进行异常统一处理,都放入死信队列中
 */
@Component
public class RabbitMqErrorHandle implements RabbitListenerErrorHandler {

    private Logger logger = LoggerFactory.getLogger(RabbitMqErrorHandle.class);

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public Object handleError(Message message, org.springframework.messaging.Message<?> message1, ListenerExecutionFailedException e) throws Exception {
        final String dead_message = new String(message.getBody());
        logger.error("出现死信--------->", dead_message);
        rabbitTemplate.convertAndSend(RabbitMqConst.RabbitMqDead.EXCHANGE_DEAD, "", dead_message);
        return null;
    }
}

2.5 错误处理器

package com.thunisoft.dzsjfcg.rabbitmq;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @Author ZhPJ
 * @Date 2019/10/8 000815:06
 * @Version 1.0
 * @Description: 消费死信队列
 */
@RabbitListener(queues = {RabbitMqConst.RabbitMqDead.QUEUE_DEAD}, errorHandler = "rabbitMqErrorHandle")
@Component
public class RabbitMqDeadMessageHandle {

    private Logger logger = LoggerFactory.getLogger(RabbitMqDeadMessageHandle.class);

    /**
     * 消费死信
     * @param object
     * @param message
     */
    @RabbitHandler
    public void consumerDeadMessage(Object object, Message message) {
        logger.error("消费掉一个死信:", new String(message.getBody()));
    }

}

 

posted @ 2019-10-24 08:58  MrSans  阅读(203)  评论(0)    收藏  举报