正常情况下,我们调用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消息的延迟发送了!