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())); } }

浙公网安备 33010602011771号