如何通过Java编程使用ActiveMQ设置队列消息的过期时间?
在这段代码中,我使用setjmsexbiration(1000)处理来自发布服务器端的队列中1秒的过期消息。但从用户端来看,它在1秒后正确返回消息,而不是null如何通过Java编程使用ActiveMQ设置队列消息的过期时间?,java,activemq,Java,Activemq,在这段代码中,我使用setjmsexbiration(1000)处理来自发布服务器端的队列中1秒的过期消息。但从用户端来看,它在1秒后正确返回消息,而不是null 通过配置JMS MessageProducer,通过接受TTL的send方法为您执行此操作,或者在producer上调用setTimeToLive,将相同的TTL添加到所有发送的消息中。消息版本的JMS API清楚地表明,在消息上调用setter没有任何效果 void setjmsecurition(长过期)抛出jmseception
通过配置JMS MessageProducer,通过接受TTL的send方法为您执行此操作,或者在producer上调用setTimeToLive,将相同的TTL添加到所有发送的消息中。消息版本的JMS API清楚地表明,在消息上调用setter没有任何效果 void setjmsecurition(长过期)抛出jmseception 设置消息的过期值 此方法仅供JMS提供程序在发送消息时用于设置此字段。客户端无法使用此消息配置消息的过期时间。此方法是公共的,允许JMS提供程序在发送非其自身实现的消息时设置此字段
我首先还认为可以在后处理器中直接在消息上设置过期时间,但正如Tim Bish在上面所说的,这不是预期的方式,之后该值将重置为0。我无法直接访问producer,也无法设置生存时间,因为该对象位于库org.springframework.jms中(我正在跟踪) 我能做的一件事是设定时间,在jmsTemplate上生活:
import org.springframework.jms.core.JmsTemplate;
@Service
public class MyJmsServiceImpl implements MyJmsService {
@Inject
private JmsTemplate jmsTemplate;
private void convertAndSendToResponseQueue(String targetQueueName, String correlationid, Object message) {
// Set time to live
jmsTemplate.setExplicitQosEnabled(true);
jmsTemplate.setTimeToLive(5000);
jmsTemplate.convertAndSend(targetQueueName, message, new JmsResponsePostProcessor(correlationid));
}
}
我在extends org.apache.activemq.command.Message中使用了“void setJMSExpiration(long expiration)throws jmsception”,并实现了javax.jsm.Message,但它不适用于expire消息。我使用的方法如下:public void setJMSExpiration(long arg0)抛出jmsception{//TODO自动生成的方法存根this.setExpiration(arg0);//TTL在这里不起作用,setExpiration(arg0)也不起作用}读取答案,然后使用jmsapi。您不能调用setjmsexprivation并期望任何事情发生,只是不起作用。根据文档,我阅读并实现了“setjmsexprivation、setTimeToLive和setExpiration”之类的所有内容。但它不起作用。你问题中的代码仍然不正确,所以在更正之前,很难说还有什么可能是错误的
import org.springframework.jms.core.JmsTemplate;
@Service
public class MyJmsServiceImpl implements MyJmsService {
@Inject
private JmsTemplate jmsTemplate;
private void convertAndSendToResponseQueue(String targetQueueName, String correlationid, Object message) {
// Set time to live
jmsTemplate.setExplicitQosEnabled(true);
jmsTemplate.setTimeToLive(5000);
jmsTemplate.convertAndSend(targetQueueName, message, new JmsResponsePostProcessor(correlationid));
}
}