我在我的项目中使用jms:message-driven-channel-adapter和jms:outbound-channel-adapter来从/向IBM MQ获取和发送消息。我需要在每次put和get之前和之后获取时间戳。我怎么能实现这一点。请指教。
请参阅我的问题更新如下: 我们需要为每次投入和获取操作花费时间。所以我相信,如果我能通过以下方式获得时间戳,我将能够实现我想要的。
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 :(得分:0)
好。目前还不清楚你想拥有什么,因为你总能与System.currentTimeMillis()
达成交易。
但是从另一方面,Spring Integration将jMSTimestamp
JmsMessage
属性映射到jms_timestamp
中的incomming消息的Message标头<jms:message-driven-channel-adapter>
。
另一点是,每个Spring Integration Message都有自己的timestamp
标题。
所以,如果你打开这样的东西:
<wire-tap channel="logger"/>
<logging-channel-adapter id="logger" log-full-message="true"/>
在发送到频道之前,您始终会看到te日志中每条消息的timestamp
。
<强>更新强>
行。谢谢。现在更清楚了。
嗯,对于出站部分(在您的情况下为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
。
您无法为execution time
部分派生get
,因为它是MessageListener
,是event-driven
组件。当消息在队列中时,您只需收到消息即可。当侦听器开始从队列中检索消息时,没有可以绑定的钩子。