使用SpringJMS为每条消息设置Expiration

时间:2016-04-27 10:30:04

标签: java activemq spring-jms

我通过SpringJMS在我的项目中使用MQ,作为我使用ActiveMQ的代理。 我需要设置基于消息的到期,因此我尝试使用"UPDATE MyTable SET `param_1` = ( CASE `id` WHEN '1' THEN 'NewValueParam1' WHEN '2' THEN 'AnotherNewValueParam1' ELSE `param_1` END), `param_2` = ( CASE `id` WHEN '1' THEN 'NewValueParam2' WHEN '2' THEN 'AnotherNewValueParam2' ELSE `param_2` END) WHERE `id` IN (1,2);" 但没有成功。发往ActiveMQ的所有邮件都 expiration = 0

是否有人使用Spring设置每条消息的Expiration成功?

为了配置JmsTemplate,我使用了默认值message.setJMSExpiration,所以我希望从我的Message props中保持过期。但正如我在ActiveMQSession.class中看到的那样,这个消息属性将被覆盖:

explicitQosEnabled = false;

我做错了什么?或者用这些工具是不可能的。

2 个答案:

答案 0 :(得分:3)

我不知道为什么Spring决定排除这个,但你可以扩展JmsTemplate并重载一些方法,传递timeToLive参数。

public class MyJmsTemplate extends JmsTemplate {

    public void send(final Destination destination,
            final MessageCreator messageCreator, final long timeToLive)
            throws JmsException {
        execute(new SessionCallback<Object>() {
            public Object doInJms(Session session) throws JMSException {
                doSend(session, destination, messageCreator, timeToLive);
                return null;
            }
        }, false);
    }

    protected void doSend(Session session, Destination destination,
            MessageCreator messageCreator, long timeToLive) throws JMSException {

        Assert.notNull(messageCreator, "MessageCreator must not be null");
        MessageProducer producer = createProducer(session, destination);
        try {
            Message message = messageCreator.createMessage(session);
            if (logger.isDebugEnabled()) {
                logger.debug("Sending created message: " + message);
            }
            doSend(producer, message, timeToLive);
            // Check commit - avoid commit call within a JTA transaction.
            if (session.getTransacted() && isSessionLocallyTransacted(session)) {
                // Transacted session created by this template -> commit.
                JmsUtils.commitIfNecessary(session);
            }
        } finally {
            JmsUtils.closeMessageProducer(producer);
        }
    }

    protected void doSend(MessageProducer producer, Message message,
            long timeToLive) throws JMSException {
        if (isExplicitQosEnabled() && timeToLive > 0) {
            producer.send(message, getDeliveryMode(), getPriority(), timeToLive);
        } else {
            producer.send(message);
        }
    }

}

答案 1 :(得分:1)

JMSExpiration不是设置过期的方法。请参阅javadocs Message ...

  

JMS提供程序在发送消息时设置此字段。此方法可用于更改已接收消息的值。

换句话说,它在发送时被忽略 - 生存时间是在producer.send()方法上设置的。

将消息集explicitQosEnabled过期到truesetTimeToLive(...)