장면
지불하지 않을 경우 단일 사용자, 30 분 후, 다음, 당신은 대기열을 지연시킬 수있는이 시간 순서를 삭제
준비된
rabbitmq_delayed_message_exchange 플러그를 사용;
첫째, 플러그인 다운로드 https://www.rabbitmq.com/community-plugins.html을
플러그는 다음 디렉토리 rabbitmq 플러그인으로 설치되며,
sbin에 디렉토리에 "rabbitmq-plugins.bat이 rabbitmq_delayed_message_exchange 수 있도록"실행;
닫기 RabbitMQ 서비스, 다음 (적용되지 않을 수도 있습니다 플러그인의 즉시 다시 시작)를 시작합니다.
SpringBoot RabbitMQ 코드
application.properties 프로필
spring.application.name = 스프링 부팅이 rabbitmq spring.rabbitmq.host = 로컬 호스트 spring.rabbitmq.port = 5672 spring.rabbitmq.username = 너트 spring.rabbitmq.password = 너트
구성 클래스
그 "참고 X를 - 지연의 유형 "과 " 는 X - 지연 메시지를 "
/ ** *延迟队列配置교환 * / @Configuration 공공 클래스 DelayQueueConfig { 공공 정적 최종 문자열 DELAY_EXCHANGE = "DELAY_EXCHANGE" ; 공공 정적 최종 문자열 DELAY_QUEUE = "DELAY_QUEUE" ; 공공 정적 최종 문자열 DELAY_ROUTING_KEY = "DELAY_ROUTING_KEY" ; @Bean ( "delayExchange" ) 공공 교환 delayExchange () { 지도 <문자열, 개체> 인수 = 새로운 HashMap의 <> (1 ); // 큐 교환의 X-지연 형 지연 선언 된 유형 args.put ( " X-지연 형 ", "직접" ); 반환 새 새 (DELAY_EXCHANGE, CustomExchange "X-지연 메시지" , true로 , false로 , 인수); } @Bean ( "의 DelayQueue" ) 공중 큐의 DelayQueue () { 반환 QueueBuilder.durable (DELAY_QUEUE) .build () } / ** * 지연 스위치 routingKey 의해 큐 지연 바인딩 * * @return * / @Bean 공개 바인딩 () {delayQueueBindExchange 수익을 새로운 바인딩 (DELAY_QUEUE, Binding.DestinationType.QUEUE, DELAY_EXCHANGE, DELAY_ROUTING_KEY, 널 (null) ); } }
생산자
메시지를 보낼 때, 밀리 초 단위의 지연 시간을 지정합니다
/ ** * 보낸 사람 지연 큐 * / @Component @ SLF4J 공공 클래스 DelayQueueSender { @Autowired 개인 RabbitTemplate rabbitTemplate; 공공 무효 sendDelayQueue ( INT의 수) { log.warn ( "전송 지연 대기열 : {} 밀리 초" , 수) / / 환 본원 명세서 직접 Exchange 메시지 BADMAIL 전달 된 테스트 용이하게하기 위해, 교환 서비스 일 수있다 rabbitTemplate.convertAndSend ( DelayQueueConfig.DELAY_EXCHANGE, DelayQueueConfig.DELAY_ROUTING_KEY, 번호, (메시지) -> { // 밀리 초 지연을 설정 message.getMessageProperties () setDelay (번호).; ( "이제 {}", ZonedDateTime.now ()) log.info; 반환 메시지를; } ); } }
소비자
/ ** *延迟队列消费者 * / @Component @ SLF4J @RabbitListener (큐 = DelayQueueConfig.DELAY_QUEUE) 공공 클래스 DelayQueueConsumer { @RabbitHandler 공공 무효 receiveDelayMessage (정수 밀리 초) { log.warn ( "DelayQueueConsumer 시간 : {}, 그리고 밀리 : {} " , ZonedDateTime.now는 ()) 밀리 초; } }
테스트
먼저 프로젝트를 시작;
그런 다음 테스트 클래스에 메시지가 전송;
@RunWith (SpringRunner. 클래스 ) @SpringBootTest 공공 클래스 RabbitmqApplicationTests { @Autowired 개인 DelayQueueSender delayQueueSender을; @Test 공개 공극 testDelayQueueSender () { (delayQueueSender.sendDelayQueue 5000 ); } }
메시지 창을 보내기 :
소비자는 메시지가 나타납니다
지연 간격 송신 완성 대기열 보여주는!
참조 :
https://blog.csdn.net/linsongbin1/article/details/80178122
https://blog.csdn.net/youjin/article/details/82586888
https://docs.spring.io/spring-amqp/docs/2.0.0.M2/reference/htmlsingle/#delayed-message-exchange
https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/