1.添加mq的依赖,这里使用的是activemq
<!--mq--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency>
2.配置yml
spring.activemq.broker-url=tcp://172.16.154.27:61616 spring.activemq.user=admin spring.activemq.password=123456 spring.activemq.in-memory=true spring.activemq.pooled=false
3.添加配置文件整合mq
@Configuration public class ActiveMQConfig { @Bean public JmsListenerContainerFactory<?> queueListenerFactory(@Qualifier("activeMQConnectionFactory") ActiveMQConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); SimpleMessageListenerContainer container=new SimpleMessageListenerContainer(); container.setConcurrentConsumers(3); container.setConnectionFactory(connectionFactory); factory.setPubSubDomain(false); factory.setConnectionFactory(connectionFactory); factory.setConcurrency("3-15"); //连接数 factory.setRecoveryInterval(1000L); //重连间隔时间 factory.setSessionAcknowledgeMode(4); return factory; } @Bean public ActiveMQConnectionFactory activeMQConnectionFactory(){ ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setTrustAllPackages(true); connectionFactory.setRedeliveryPolicy(redeliveryPolicy()); return connectionFactory; } @Bean public RedeliveryPolicy redeliveryPolicy(){ RedeliveryPolicy redeliveryPolicy=new RedeliveryPolicy(); //是否在每次尝试重新发送失败后,增长这个等待时间 redeliveryPolicy.setUseExponentialBackOff(true); //重发次数,默认为6次 redeliveryPolicy.setMaximumRedeliveries(5); //重发时间间隔,默认为1秒 redeliveryPolicy.setInitialRedeliveryDelay(1); //第一次失败后重新发送之前等待500毫秒,第二次失败再等待500 * 2毫秒,这里的2就是value redeliveryPolicy.setBackOffMultiplier(2); //是否避免消息碰撞 redeliveryPolicy.setUseCollisionAvoidance(false); //设置重发最大拖延时间-1 表示没有拖延只有UseExponentialBackOff(true)为true时生效 redeliveryPolicy.setMaximumRedeliveryDelay(-1); return redeliveryPolicy; } @Bean public JmsTemplate jmsTemplate(ActiveMQConnectionFactory activeMQConnectionFactory){ JmsTemplate jmsTemplate=new JmsTemplate(); jmsTemplate.setDeliveryMode(1);//进行持久化配置 1表示非持久化,2表示持久化 jmsTemplate.setConnectionFactory(activeMQConnectionFactory); jmsTemplate.setSessionAcknowledgeMode(4);//客户端签收模式 return jmsTemplate; } }
4.定义queue
@Configuration public class QueueConfig { @Bean(name="telQueue") public Queue telQueue() { return new ActiveMQQueue(MESSAGE_TEL); } @Bean(name = "emailQueue") public Queue emailQueue() { return new ActiveMQQueue(MESSAGE_EMAIL); } }
5.定义生成者和消费者
@Slf4j @Component public class QueueSender { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Resource(name = "telQueue") private Queue telQueue; @Resource(name = "emailQueue") private Queue emailQueue; public void sendTel(final MessageTel message){ log.info("发送短信message={}",message); this.jmsMessagingTemplate.convertAndSend(telQueue,message); } public void sendEmail(final MessageEMail message){ log.info("发送email message={}",message); this.jmsMessagingTemplate.convertAndSend(emailQueue,message); } }
@Slf4j @Component public class QueueReceiver { @Autowired private MailUtil mailUtil; @Autowired private SendSMSUtil sendSMSUtil; /** * 发送短信 * * @param messageTel */ @JmsListener(destination = QueueConfig.MESSAGE_TEL, containerFactory = "queueListenerFactory") public void receiveTel1(MessageTel messageTel) { log.info("-----receive tel message-----"); } /** * 发送邮件 * * @param messageEMail */ @JmsListener(destination = QueueConfig.MESSAGE_EMAIL, containerFactory = "queueListenerFactory") public void receiveEmail(MessageEMail messageEMail) { log.info("-----receive email message-----"); } }
每启动一个监听,会实例化三个消费者。