SpringBoot 에서 RabbitMq 정시 퀘 스 트 실현

본 논문 의 사례 는 SpringBoot 에서 RabbitMq 가 정시 임 무 를 실현 하 는 것 을 공유 하 였 으 며,여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
정시 퀘 스 트 필드:주문서 아래 15 분 미 지불 자동 종료
지연 작업 실현 원리 도 는 다음 과 같다.

위의 그림 에서 보 듯 이 우 리 는 두 개의 대기 열(하 나 는 수신 대기 열,메 시 지 는 안에서 TLL 시간 을 보 내 는 것,다른 하 나 는 처리 대기 열,메 시 지 는 TLL 시간 을 보 낸 후에 이 대기 열 에 들 어 가 는 것)이 필요 하 다.두 개의 교환기 와 경로(하 나 는 메 시 지 를 수신 대기 열 에 보 내 는 것,다른 하 나 는 메 시 지 를 수신 대기 열 에서 처리 대기 열 로 보 내 는 것)가 필요 하지만 교환 기 는 같은 것 을 사용 할 수 있다.즉,하나의 교환기 가 두 개의 길 을 조합 하 는 방식 이다.
다음은 코드 구현 과정 입 니 다.

//  rabbitAdmin   
 @Bean
 public RabbitAdmin rabbitAdmin(CachingConnectionFactory cachingConnectionFactory){
 RabbitAdmin rabbitAdmin = new RabbitAdmin(cachingConnectionFactory);
 rabbitAdmin.setIgnoreDeclarationExceptions(true);
 return rabbitAdmin;
 }

그 다음 대기 열 교환기 및 바 인 딩 성명(Queue,Exchange,Binding)

@Autowired
 RabbitAdmin rabbitAdmin;

 /**
 *       ,          ,TLL      
 * @param queueName
 * @param delayExchange
 */
 public void createDelayQueue(String queueName,String delayExchange,String delayRoutingKey){
 Map<String, Object> map = new HashMap<>();
 /**           **/
 map.put("x-dead-letter-exchange", delayExchange);
 map.put("x-dead-letter-routing-key", delayRoutingKey);
 rabbitAdmin.declareQueue(new Queue(queueName,true,false,false,map));
 }

 /**
 *       
 * @param queueName
 */
 public void createQueue(String queueName){
 rabbitAdmin.declareQueue(new Queue(queueName,true,false,false,new HashMap<>()));
 }
 /**
 *           ,          
 * @param name
 */
 public void createExchange(String name){
 rabbitAdmin.declareExchange(new DirectExchange(name,true,false));
 }

 /**
 *     
 * @param queueName
 * @param delayExchange
 * @param routeKey
 */
 public void bindQueue(String queueName,String delayExchange,String routeKey){
 rabbitAdmin.declareBinding(new Binding(queueName,Binding.DestinationType.QUEUE,delayExchange,routeKey,new HashMap<>()));
 }

 /**
 *     
 * @param message
 * @param exchange
 * @param routeKey
 * @param tll        
 */
 public void sendMessageWithTll(String message,String exchange,String routeKey,String tll){
 rabbitAdmin.getRabbitTemplate().convertAndSend(exchange, routeKey, message, new MessagePostProcessor() {
  @Override
  public Message postProcessMessage(Message message) throws AmqpException {
  message.getMessageProperties().setExpiration(tll);
  return message;
  }
 });
 }

 @Override
 public void sendMessage(String message, String exchange, String routeKey) {
 rabbitAdmin.getRabbitTemplate().convertAndSend(exchange, routeKey, message, new MessagePostProcessor() {
  @Override
  public Message postProcessMessage(Message message) throws AmqpException {
  return message;
  }
 });
 }
테스트 를 진행 하 다

/**
 *     
 * @param message
 * @return
 */
 @RabbitListener(queues = "consumerQueue")
 public void getMessage(String message){
 System.out.println("    getMessage:"+message +",time="+MyUtil.FormatDate(new Date()));
 }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기