正常情况下,我们调用Spring的JmsTemplate发送Jms消息的时候,消息都是立即发送的。但是在某些特殊的情况下,我们需要延迟一段时间再发送消息(比如说在网络不稳定的情况下),这个时候我们就需要重写org.springframework.jms.support.converter.SimpleMessageConverter了。
如下,我们先写一个能延时发送消息的MessageConverter
DelayMessageConverter.java
package
jms.server;

import
javax.jms.JMSException;
import
javax.jms.Message;
import
javax.jms.Session;

import
org.springframework.jms.support.converter.MessageConversionException;
import
org.springframework.jms.support.converter.SimpleMessageConverter;

public
class
DelayMessageConverter
extends
SimpleMessageConverter
{
/** deliveryType */
private String deliveryType = "JMS_JBOSS_SCHEDULED_DELIVERY";

/** schedDeliveryTime */
private long schedDeliveryTime = 30000;

public void setDeliveryType(String deliveryType) {
this.deliveryType = deliveryType;
}

public void setSchedDeliveryTime(long schedDeliveryTime) {
this.schedDeliveryTime = schedDeliveryTime;
}

@Override
public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
Message message = super.toMessage(object, session);
message.setLongProperty(this.deliveryType, System.currentTimeMillis() + this.schedDeliveryTime);
return message;
}

}
该MessageConverter把Jms消息延迟30秒发送,当然也可以重新设置延迟时间
然后再配置配置JmsTemplate的时候把这个对象配进去就可以了
<
bean
id
="queueMessageConverter"
class
="jms.server.DelayMessageConverter"
>
<
property
name
="schedDeliveryTime"
value
="30000"
/>
</
bean
>

<
bean
id
="jmsTemplate"
lazy-init
="true"
class
="org.springframework.jms.core.JmsTemplate"
>
<
property
name
="connectionFactory"
ref
="myConnectionFactory"
/>
<
property
name
="defaultDestinationName"
value
="A"
/>
<
property
name
="sessionTransacted"
value
="true"
/>
<
property
name
="messageConverter"
ref
="queueMessageConverter"
/>
</
bean
>
这样就可以实现Jms消息的延迟发送了!
如下,我们先写一个能延时发送消息的MessageConverter
DelayMessageConverter.java

































然后再配置配置JmsTemplate的时候把这个对象配进去就可以了












这样就可以实现Jms消息的延迟发送了!