我通过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;
我做错了什么?或者用这些工具是不可能的。
答案 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
过期到true
和setTimeToLive(...)
。