【问题标题】:How can I set expire time of queue message using ActiveMQ by Java Programming?如何通过 Java 编程使用 ActiveMQ 设置队列消息的过期时间?
【发布时间】:2020-09-04 17:40:59
【问题描述】:

在此代码中,我使用 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();
            }
        }

【问题讨论】:

    标签: java activemq


    【解决方案1】:

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

    void setJMSExpiration(long expires) 抛出 JMSException

    设置消息的过期值。

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

    【讨论】:

    • 我使用“void setJMSExpiration(long expires) throws JMSException”扩展 org.apache.activemq.command.Message 并实现 javax.jsm.Message 但它不适用于过期消息。我使用的方法如下: public void setJMSExpiration(long arg0) throws JMSException { // TODO 自动生成的方法存根 this.setExpiration(arg0);// TTL 在这里不起作用,setExpiration(arg0) 也不起作用 }跨度>
    • 阅读答案和 JMS API。您不能调用 setJMSExpiration 并期望发生任何事情,只是不起作用。
    • 我根据文档阅读并实现了“setJMSExpration、setTimeToLive 和 setExpiration”等所有内容。但它不起作用。
    • 您问题中的代码仍然不正确,因此在纠正之前很难说还有什么问题
    【解决方案2】:

    我最初还认为可以在后处理器中直接在消息上设置过期时间,但正如 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));
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多