ActiveMQ入门 (六) 消息的投递方式

本文介绍了ActiveMQ的消息投递方式,包括同步发送、异步发送及其配置、延迟投递和定时投递。同步发送在消息保存到二级存储后才返回确认。异步发送允许在未收到确认时继续,可通过配置实现。延迟投递和定时投递则涉及到消息的延迟和定时发送策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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("消息发送成功...");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值