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