登录jms:message-driven-channel-adapter和jms:outbound-channel-adapter

时间:2014-10-20 08:41:42

标签: spring-integration spring-jms

我在我的项目中使用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 

请告知。

感谢。

1 个答案:

答案 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组件。当消息在队列中时,您只需收到消息即可。当侦听器开始从队列中检索消息时,没有可以绑定的钩子。

相关问题