好吧。目前尚不清楚你想擁有什麼,因爲你總是可以得到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
不有狀態,所以你應該手動爲每個消息calculate
put
時間。
另一種選擇是<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
零件。當郵件在隊列中時,您只需收到郵件即可。當偵聽器開始從隊列中檢索消息時,沒有掛鉤。
Artem,我已經更新了我的問題的細節。請建議。也會看你的建議並回復。謝謝。 – 2014-10-20 09:17:48
已更新一個回答 – 2014-10-20 10:57:51
謝謝阿爾喬姆。我能夠根據您的建議獲得放置時間。正如你所說,我明白我們無法得到「得到時間」。但是,是否有可能在消息驅動通道適配器接收消息之後獲取時間戳。現在我將時間戳記記錄在從MQ中拾取消息之後調用的直接方法中。 – 2014-10-24 11:37:10