SpringBoot整合RabbitMQ

SpringBoot整合Rabbitmq并实现可靠性投递方案一
首先建立两个SpringBoot项目工程

生产段

添加pom依赖



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

配置yml文件

  rabbitmq:
      addresses: localhost
      username: guest
      password: guest
      connection-timeout: 15000

核心代码:

消息发送以及回调代码

   import java.util.Date;
     import com.example.rabbitmq.constant.Constants;
     import com.example.rabbitmq.entity.Order;
     import com.example.rabbitmq.mapper.BrokerMessageLogMapper;
     import org.springframework.amqp.rabbit.connection.CorrelationData;
     import org.springframework.amqp.rabbit.core.RabbitTemplate;
     import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
     
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.stereotype.Component;
     @Component
     public class RabbitOrderSender {
     
     	//自动注入RabbitTemplate模板类
     	@Autowired
     	private RabbitTemplate rabbitTemplate;  
     	
     	@Autowired
     	private BrokerMessageLogMapper brokerMessageLogMapper;
     	
     	//回调函数: confirm确认
     	final ConfirmCallback confirmCallback = new ConfirmCallback() {
     		@Override
     		public void confirm(CorrelationData correlationData, boolean ack, String cause) {
     			System.err.println("correlationData: " + correlationData);
     			String messageId = correlationData.getId();
     			if(ack){
     				//如果confirm返回成功 则进行更新
     				brokerMessageLogMapper.changeBrokerMessageLogStatus(messageId, Constants.ORDER_SEND_SUCCESS, new Date());
     			} else {
     				//失败则进行具体的后续操作:重试 或者补偿等手段
     				System.err.println("异常处理...");
     			}
     		}
     	};
     	
     	//发送消息方法调用: 构建自定义对象消息
     	public void sendOrder(Order order) throws Exception {
     		rabbitTemplate.setConfirmCallback(confirmCallback);
     		//消息唯一ID
     		CorrelationData correlationData = new CorrelationData(order.getMessageId());
     		rabbitTemplate.convertAndSend("order-exchange", "order.ABC", order, correlationData);
     	}
     	
     }

定时任务代码

import java.util.Date;
import java.util.List;

import com.example.rabbitmq.constant.Constants;
import com.example.rabbitmq.entity.BrokerMessageLog;
import com.example.rabbitmq.entity.Order;
import com.example.rabbitmq.mapper.BrokerMessageLogMapper;
import com.example.rabbitmq.producer.RabbitOrderSender;
import com.example.rabbitmq.utils.FastJsonConvertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class RetryMessageTasker {
   @Autowired
   private RabbitOrderSender rabbitOrderSender;
   
   @Autowired
   private BrokerMessageLogMapper brokerMessageLogMapper;
   
   @Scheduled(initialDelay = 3000, fixedDelay = 10000)
   public void reSend(){
   	System.err.println("---------------定时任务开始---------------");
   	//pull status = 0 and timeout message 
   	List<BrokerMessageLog> list = brokerMessageLogMapper.query4StatusAndTimeoutMessage();
   	list.forEach(messageLog -> {
   		if(messageLog.getTryCount() >= 3){
   			//update fail message 
   			brokerMessageLogMapper.changeBrokerMessageLogStatus(messageLog.getMessageId(), Constants.ORDER_SEND_FAILURE, new Date());
   		} else {
   			// resend 
   			brokerMessageLogMapper.update4ReSend(messageLog.getMessageId(),  new Date());
   			Order reSendOrder = FastJsonConvertUtil.convertJSONToObject(messageLog.getMessage(), Order.class);
   			try {
   				rabbitOrderSender.sendOrder(reSendOrder);
   			} catch (Exception e) {
   				e.printStackTrace();
   				System.err.println("-----------异常处理-----------");
   			}
   		}			
   	});
   	
   }
   
   
}

消费端

添加pom依赖

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

配置 application.properties文件


 spring.rabbitmq.addresses=127.0.0.1:5672
 spring.rabbitmq.username=guest
 spring.rabbitmq.password=guest
 spring.rabbitmq.connection-timeout=15000
 
 spring.rabbitmq.listener.simple.concurrency=5
 spring.rabbitmq.listener.simple.max-concurrency=10
 #spring.rabbitmq.listener.direct.acknowledge-mode=manual
 spring.rabbitmq.listener.simple.acknowledge-mode=manual
 spring.rabbitmq.listener.simple.prefetch=1
 server.port=8088

核心代码

import com.rabbitmq.client.Channel;
import com.example.rabbitmq.entity.Order;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Map;
@Component
public class OrderConsumer {

   @RabbitHandler
   @RabbitListener(bindings = @QueueBinding(
                      value = @Queue(value = "hello",durable = "true"),
                      exchange = @Exchange(name = "order-exchange",durable = "true",type = "topic"),
                      key = "order.*"))
   public void onOrderMessage(@Payload Order order, @Headers Map<String,Object> headers, Channel channel ){

       System.out.println("接收消息~~~~~~~~~~~~`");
       System.out.println("接收消息id:"+order.getId());
       long deliveryTag = (long) headers.get(AmqpHeaders.DELIVERY_TAG);
       try {
           channel.basicAck(deliveryTag,false);
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}
posted @ 2019-08-06 16:26  BingoJ  阅读(166)  评论(0编辑  收藏  举报