2014-10-20 105 views
0

我在我的項目中使用jms:消息驅動通道適配器和jms:出站通道適配器來獲取和放置消息/到IBM MQ。我需要在每次投入前後得到時間戳。我怎麼能做到這一點。請指教。登錄jms:消息驅動通道適配器和jms:出站通道適配器

請參閱我的問題更新如下: 我們需要時間爲每個投入和獲得操作。所以我相信的是,如果我能以下面的方式獲得時間戳,我將能夠實現我想要的。

1)At jms:message-driven-channel-adapter: Note timestamp before and after each get -> derive time taken for each get 

2)At jms:outbound-channel-adapter: Note timestamp before and after each put -> derive time taken for each put 

請指教。

謝謝。

回答

0

好吧。目前尚不清楚你想擁有什麼,因爲你總是可以得到System.currentTimeMillis()的處理。

但是從另一側Spring集成映射的JmsMessage<jms:message-driven-channel-adapter>進來的消息的消息頭jms_timestamp一個jMSTimestamp屬性。

另一點,每個Spring集成消息都有自己的timestamp頭。

所以,如果你的東西切換這樣的:

<wire-tap channel="logger"/> 

<logging-channel-adapter id="logger" log-full-message="true"/> 

你總是會看到timestamp來回每個消息中TE日誌,然後再發送到信道。

UPDATE

確定。謝謝。現在更清楚了。

嗯,(在你的情況put)出站部分,我可以說,你的解決方案與自定義ChannelInterceptor鋪設:

public class PutTimeInterceptor extends ChannelInterceptorAdapter { 

    private final Log logger = LogFactory.getLog(this.getClass()); 

    @Override 
    public Message<?> preSend(Message<?> message, MessageChannel channel) { 
     logger.info("preSend time [" + System.currentTimeMillis() + "] for: " + message); 
     return message; 
    } 

    @Override 
    public void postSend(Message<?> message, MessageChannel channel, boolean sent) { 
     logger.info("postSend time [" + System.currentTimeMillis() + "] for: " + message); 
    } 

} 

<channel id="putToJmsChannel"> 
    <interceptors> 
     <bean class="com.my.proj.int.PutTimeInterceptor"/> 
    </interceptors> 
</channel> 

<jms:outbound-channel-adapter channel="putToJmsChannel"/> 

記住ChannelInterceptor不有狀態,所以你應該手動爲每個消息calculateput時間。

另一種選擇是<jms:request-handler-advice-chain>,當你要實現自定義AbstractRequestHandlerAdvice

public class PutTimeRequestHandlerAdvice extends AbstractRequestHandlerAdvice { 

    private final Log logger = LogFactory.getLog(this.getClass()); 

    @Override 
    protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception { 
     long before = System.currentTimeMillis(); 
     Object result = callback.execute(); 
     logger.info("Put time: [" + System.currentTimeMillis() - before + "] for: " + message); 
     return result; 
    } 
} 

這些是隻有put

對於get零件,您不能派生execution time零件,因爲它是MessageListener,它是event-driven零件。當郵件在隊列中時,您只需收到郵件即可。當偵聽器開始從隊列中檢索消息時,沒有掛鉤。

+0

Artem,我已經更新了我的問題的細節。請建議。也會看你的建議並回復。謝謝。 – 2014-10-20 09:17:48

+0

已更新一個回答 – 2014-10-20 10:57:51

+0

謝謝阿爾喬姆。我能夠根據您的建議獲得放置時間。正如你所說,我明白我們無法得到「得到時間」。但是,是否有可能在消息驅動通道適配器接收消息之後獲取時間戳。現在我將時間戳記記錄在從MQ中拾取消息之後調用的直接方法中。 – 2014-10-24 11:37:10

相關問題