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

时间:2017-10-30 05:38:20

标签: java activemq

  

在这段代码中,我使用setJMSExpiration(1000)来发布者端队列中的一秒过期消息。但是从消费者方面来说,它在1秒后正确返回消息而不是null。

        public class RegistrationPublisher extends Thread{
            public void run() {
                publisherQueue("Registration.Main.*");
            }

            public void publisherQueue(String server){
                try {
                    String url="tcp://192.168.20.49:61616";
                    // Create a ConnectionFactory
                    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

                    Connection connection = connectionFactory.createConnection();
                    connection.start();

                    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

                    Destination destination = session.createQueue(server);

                    MessageProducer producer = session.createProducer(destination);
                    producer.setDeliveryMode(DeliveryMode.PERSISTENT);

                    String text = "Test";
                    TextMessage message = session.createTextMessage(text);

                    message.setJMSExpiration(1000);// For Expire message in one second


        producer.send(message);


                    producer.close();
                    session.close();
                    connection.close();

                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }

            public static void main(String args[]) throws IOException{

                RegistrationPublisher registrationPublisher=new RegistrationPublisher();
                registrationPublisher.start();
            }
        }

2 个答案:

答案 0 :(得分:0)

您可以通过配置JMS MessageProducer来为您执行此操作,方法是通过接受TTL的send方法或通过在生产者上调用setTimeToLive来为所有已发送的消息添加相同的TTL。消息版本的JMS API很清楚,调用消息上的setter无效。

  

void setJMSExpiration(long expiration)抛出JMSException

     

设置邮件的到期值。

     

此方法仅供JMS提供程序在发送消息时设置此字段。客户端无法使用此消息来配置消息的到期时间。此方法是公共的,允许JMS提供程序在发送其实现不是自己的消息时设置此字段。

答案 1 :(得分:0)

我首先还认为可以在后处理器中直接在消息上设置到期时间,但是正如Tim Bish所说,这不是预期的处理方式,此后该值将重置为0 。我无法直接访问生产者,也没有设置生存时间,因为该对象位于库org.springframework.jms中(我正在关注this documentation)。

我可以做的一件事是设置时间以使用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));
    }

}