ActiveMQ入门 (六) 消息的投递方式
文章目录
一、消息投递方式
1.同步发送:
消息生产者使用持久(Persistent)传递模式发送消息的时候,Producer.send() 方法会被阻塞,直到broker 发送一个确认消息给生产者(ProducerAck),这个确认消息暗示broker已经成功接收到消息并把消息保存到二级存储中。
2.异步发送:
如果应用程序能够容忍一些消息的丢失,那么可以使用异步发送。异步发送不会在受到broker的确认之前一直阻塞 Producer.send方法。
2.1.如何实现异步:
想要使用异步,在brokerURL中增jms.alwaysSyncSend=false&jms.useAsyncSend=true属性
1)如果设置了alwaysSyncSend=true系统将会忽略useAsyncSend设置的值都采用同步
2)当alwaysSyncSend=false时,“NON_PERSISTENT”(非持久化)、事务中的消息将使用“异步发送”
3)当alwaysSyncSend=false时,如果指定了useAsyncSend=true,“PERSISTENT”类型的消息使用异步发送。
如果useAsyncSend=false,“PERSISTENT”类型的消息使用同步发送。
总结: 默认情况(alwaysSyncSend=false,useAsyncSend=false),非持久化消息、事务内的消息均采用
异步发送;对于持久化消息采用同步发送!
2.2.异步投递配置:
@Configuration
public class ActiveConfig {
/**
* 配置用于异步发送的非持久化JmsTemplate
*/
@Autowired
@Bean
public JmsTemplate asynJmsTemplate(PooledConnectionFactory
pooledConnectionFactory) {
JmsTemplate template = new JmsTemplate(pooledConnectionFactory);
template.setExplicitQosEnabled(true);
template.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
return template;
}
/**
* 配置用于同步发送的持久化JmsTemplate
*/
@Autowired
@Bean
public JmsTemplate synJmsTemplate(PooledConnectionFactory
pooledConnectionFactory) {
JmsTemplate template = new JmsTemplate(pooledConnectionFactory);
return template;
}
2.3.异步投递如何确认发送成功: 采用异步回调接口
采用方法回调
回调方法就是一个参数,将一个A方法作为参数传到B方法里面,当B方法执行完之后,再执行传进去的这个A方法.
3.延迟投递:
*activeMQ默认不支持延迟投递
1.修改activemq.xml:
<broker xmlns="http://activemq.apache.org/schema/core" ...
schedulerSupport="true" >
......
</broker>
2.在代码中设置延迟时长:
4.定时投递:
1.启动类添注解:
@SpringBootApplication
@EnableScheduling // 开启定时功能
public class MyActiveMQApplication {
public static void main(String[] args) {
SpringApplication.run(MyActiveMQApplication.class,args);
}
}
2.在生产者添加@Scheduled设置定时:
/**
* 消息生产者
*/
@Component
public class ProducerController3 {
@Value("${activemq.name}")
private String name;
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
/**
* 延时投递
*
* @return
*/
//每隔3秒定投
@Scheduled(fixedDelay = 3000)
public void sendQueue() {
jmsMessagingTemplate.convertAndSend(name, "消息ID:" +
UUID.randomUUID().toString().substring(0,6));
System.out.println("消息发送成功...");
}
}