rabbitmq topic模式
配置文件
1 #rabbitmq 2 spring.rabbitmq.virtual-host=/ 3 spring.rabbitmq.host=127.0.0.1 4 spring.rabbitmq.port=5672 5 spring.rabbitmq.username=admin 6 spring.rabbitmq.password=admin 7 8 spring.rabbitmq.listener.simple.concurrency=6 9 spring.rabbitmq.listener.simple.max-concurrency=15 10 spring.rabbitmq.listener.simple.prefetch=10 11 #消息确认机制开启 12 spring.rabbitmq.publisher-confirms=true 13 #消息失败返回机制 14 spring.rabbitmq.publisher-returns=true 15 16 17 #\u5F02\u6B65\u53D1\u9001\u7684\u6D88\u606F\u6A21\u578B 18 stock.item.exchange=stock.item.exchange 19 20 stock.item.queue=stock.item.queue 21 stock.item.routing.key=stock.item.routing.key 22 23 daily.item.queue=daily.item.queue 24 daily.item.routing.key=daily.item.routing.key 25 26 five.item.queue=five.item.queue 27 five.item.routing.key=five.item.routing.key
producer
1 @Autowired 2 private RabbitTemplate rabbitTemplate; 3 4 @Value("${stock.item.exchange}") 5 private String exchange; 6 7 @Value("${stock.item.routing.key}") 8 private String stockRoutingKey; 9 10 @Value("${daily.item.routing.key}") 11 private String dailyRoutingKey; 12 13 @Value("${five.item.routing.key}") 14 private String fiveRoutingKey; 15 16 public void run(){ 17 SubInitEle sie = new SubInitEle(); 18 rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); 19 rabbitTemplate.convertAndSend(exchange, stockRoutingKey, sie); 20 rabbitTemplate.convertAndSend(exchange, dailyRoutingKey, sie); 21 rabbitTemplate.convertAndSend(exchange, fiveRoutingKey, sie); 22 }
consumer
1 @Component 2 public class StockRabbitComsumer { 3 private Logger log = LoggerFactory.getLogger(StockRabbitComsumer.class); 4 5 @Autowired 6 private RedisManager redisManager; 7 8 @RabbitListener(queues = "${stock.item.queue}") 9 public void consumeStock(SubInitEle sie){ 10 try { 11 log.info("接收消息:{}",sie.getStockCode()); 12 //整合发送消息的逻辑 13 14 }catch (Exception e){ 15 log.error("接收消息-发生异常:",e.fillInStackTrace()); 16 } 17 } 18 19 @RabbitListener(queues = "${stock.item.queue}") 20 public void consumeStock2(SubInitEle sie){ 21 try { 22 log.info("接收消息:{}",sie.getStockCode()); 23 //整合发送消息的逻辑 24 25 }catch (Exception e){ 26 log.error("接收消息-发生异常:",e.fillInStackTrace()); 27 } 28 } 29 30 @RabbitListener(queues = "${stock.item.queue}") 31 public void consumeStock3(SubInitEle sie){ 32 try { 33 log.info("接收消息:{}",sie.getStockCode()); 34 //整合发送消息的逻辑 35 36 }catch (Exception e){ 37 log.error("接收消息-发生异常:",e.fillInStackTrace()); 38 } 39 } 40 41 @RabbitListener(queues = "${five.item.queue}") 42 public void consumeFive(SubInitEle sie){ 43 try { 44 log.info("接收消息:{}",sie.getStockCode()); 45 //整合发送消息的逻辑 46 47 }catch (Exception e){ 48 log.error("接收消息-发生异常:",e.fillInStackTrace()); 49 } 50 } 51 52 @RabbitListener(queues = "${five.item.queue}") 53 public void consumeFive2(SubInitEle sie){ 54 try { 55 log.info("接收消息:{}",sie.getStockCode()); 56 //整合发送消息的逻辑 57 58 }catch (Exception e){ 59 log.error("接收消息-发生异常:",e.fillInStackTrace()); 60 } 61 } 62 63 @RabbitListener(queues = "${five.item.queue}") 64 public void consumeFive3(SubInitEle sie){ 65 try { 66 log.info("接收消息:{}",sie.getStockCode()); 67 //整合发送消息的逻辑 68 69 }catch (Exception e){ 70 log.error("接收消息-发生异常:",e.fillInStackTrace()); 71 } 72 } 73 74 @RabbitListener(queues = "${daily.item.queue}") 75 public void consumeDaily(SubInitEle sie){ 76 try { 77 log.info("接收消息:{}",sie.getStockCode()); 78 //整合发送消息的逻辑 79 80 }catch (Exception e){ 81 log.error("接收消息-发生异常:",e.fillInStackTrace()); 82 } 83 } 84 85 @RabbitListener(queues = "${daily.item.queue}") 86 public void consumeDaily2(SubInitEle sie){ 87 try { 88 log.info("接收消息:{}",sie.getStockCode()); 89 //整合发送消息的逻辑 90 91 }catch (Exception e){ 92 log.error("接收消息-发生异常:",e.fillInStackTrace()); 93 } 94 } 95 96 @RabbitListener(queues = "${daily.item.queue}") 97 public void consumeDaily3(SubInitEle sie){ 98 try { 99 log.info("接收消息:{}",sie.getStockCode()); 100 //整合发送消息的逻辑 101 102 }catch (Exception e){ 103 log.error("接收消息-发生异常:",e.fillInStackTrace()); 104 } 105 } 106 }
配置类
1 @Configuration 2 public class RabbitConfig { 3 private final static Logger log = LoggerFactory.getLogger(RabbitConfig.class); 4 5 @Value("${spring.rabbitmq.listener.simple.concurrency}") 6 private int concurrentConsumers; 7 @Value("${spring.rabbitmq.listener.simple.max-concurrency}") 8 private int maxConcurrentConsumers; 9 @Value("${spring.rabbitmq.listener.simple.prefetch}") 10 private int prefetchCount; 11 12 @Value("${stock.item.queue}") 13 private String stockQueue; 14 @Value("${daily.item.queue}") 15 private String dailyQueue; 16 @Value("${five.item.queue}") 17 private String fiveQueue; 18 19 @Value("${stock.item.exchange}") 20 private String exchange; 21 22 @Value("${stock.item.routing.key}") 23 private String stockRoutingKey; 24 @Value("${daily.item.routing.key}") 25 private String dailyRoutingKey; 26 @Value("${five.item.routing.key}") 27 private String fiveRoutingKey; 28 29 @Autowired 30 private CachingConnectionFactory connectionFactory; 31 32 @Autowired 33 private SimpleRabbitListenerContainerFactoryConfigurer factoryConfigurer; 34 35 //单一消费者 36 @Bean(name = "singleListenerContainer") 37 public SimpleRabbitListenerContainerFactory listenerContainer(){ 38 SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 39 factory.setConnectionFactory(connectionFactory); 40 factory.setMessageConverter(new Jackson2JsonMessageConverter()); 41 factory.setConcurrentConsumers(1); 42 factory.setMaxConcurrentConsumers(1); 43 factory.setPrefetchCount(1); 44 factory.setTxSize(1); 45 return factory; 46 } 47 48 //多个消费者 49 @Bean(name = "stockMultiListenerContainer") 50 public SimpleRabbitListenerContainerFactory multiListenerContainer(){ 51 SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 52 factoryConfigurer.configure(factory,connectionFactory); 53 factory.setMessageConverter(new Jackson2JsonMessageConverter()); 54 //确认消费模式-NONE 55 factory.setAcknowledgeMode(AcknowledgeMode.AUTO); 56 factory.setDefaultRequeueRejected(false); 57 factory.setConcurrentConsumers(concurrentConsumers); 58 factory.setMaxConcurrentConsumers(maxConcurrentConsumers); 59 factory.setPrefetchCount(prefetchCount); 60 return factory; 61 } 62 63 @Bean 64 public RabbitTemplate rabbitTemplate(){ 65 connectionFactory.setPublisherConfirms(true); 66 connectionFactory.setPublisherReturns(true); 67 RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 68 rabbitTemplate.setMandatory(true); 69 rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { 70 @Override 71 public void confirm(CorrelationData correlationData, boolean ack, String cause) { 72 log.info("消息发送成功:correlationData({}),ack({}),cause({})",correlationData,ack,cause); 73 } 74 }); 75 rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() { 76 @Override 77 public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { 78 log.warn("消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}",exchange,routingKey,replyCode,replyText,message); 79 } 80 }); 81 return rabbitTemplate; 82 } 83 84 //构建异步发送通知的消息模型 85 @Bean 86 public Queue successStockQueue(){ 87 return new Queue(stockQueue,true); 88 } 89 90 @Bean 91 public Queue successDailyQueue(){ 92 return new Queue(dailyQueue,true); 93 } 94 95 @Bean 96 public Queue successFiveQueue(){ 97 return new Queue(fiveQueue,true); 98 } 99 100 @Bean 101 public TopicExchange successExchange(){ 102 return new TopicExchange(exchange,true,false); 103 } 104 105 @Bean 106 public Binding successStockBinding(){ 107 return BindingBuilder.bind(successStockQueue()).to(successExchange()).with(stockRoutingKey); 108 } 109 110 @Bean 111 public Binding successDailyBinding(){ 112 return BindingBuilder.bind(successDailyQueue()).to(successExchange()).with(dailyRoutingKey); 113 } 114 115 @Bean 116 public Binding successFiveBinding(){ 117 return BindingBuilder.bind(successFiveQueue()).to(successExchange()).with(fiveRoutingKey); 118 } 119 120 @Bean 121 public MessageConverter jsonMessageConverter(ObjectMapper objectMapper) { 122 return new Jackson2JsonMessageConverter(objectMapper); 123 }
浙公网安备 33010602011771号