1.添加mq的依赖,这里使用的是activemq
org.springframework.boot
spring-boot-starter-activemq
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-----");
}
}
每启动一个监听,会实例化三个消费者。