JMS(Jboss Messaging)的一點使用心得(十五)Spring擴展應用—延遲發送Message

正常情況下,我們調用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消息的延遲發送了!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章