如何通过Java编程使用ActiveMQ设置队列消息的过期时间?

如何通过Java编程使用ActiveMQ设置队列消息的过期时间?,java,activemq,Java,Activemq,在这段代码中,我使用setjmsexbiration(1000)处理来自发布服务器端的队列中1秒的过期消息。但从用户端来看,它在1秒后正确返回消息,而不是null 通过配置JMS MessageProducer,通过接受TTL的send方法为您执行此操作,或者在producer上调用setTimeToLive,将相同的TTL添加到所有发送的消息中。消息版本的JMS API清楚地表明,在消息上调用setter没有任何效果 void setjmsecurition(长过期)抛出jmseception

在这段代码中,我使用setjmsexbiration(1000)处理来自发布服务器端的队列中1秒的过期消息。但从用户端来看,它在1秒后正确返回消息,而不是null


通过配置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));
    }

}