2014-10-20 1 views
0

내 프로젝트에서 jms : message-driven-channel-adapter 및 jms : outbound-channel-adapter를 사용하여 메시지를 가져오고/IBM MQ에. 전과 후에 각각 타임 스탬프를 받아야합니다. 어떻게하면 이럴 수 있겠 어. 제발 조언.jms : message-driven-channel-adapter 및 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()과 항상 거래 할 수 있기 때문에 원하는 것을 분명하지 않습니다.

그러나 다른 측면 스프링 통합에서

<jms:message-driven-channel-adapter>에 메시지를 incomming의 메시지 헤더 jms_timestamp- JmsMessagejMSTimestamp 속성을 매핑합니다.

또 다른 요점은 각 스프링 통합 메시지에 고유 한 timestamp 헤더가 있다는 것입니다. 이 같은 일에 전환하는 경우

그래서 :이 채널로 전송되기 전에

<wire-tap channel="logger"/> 

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

당신은 항상, 테 로그에 각 메시지 이리저리 timestamp을 볼 수 있습니다.

UPDATE

확인을 클릭합니다. 감사. 이제는 더 분명합니다.

음, (귀하의 경우 put) 아웃 바운드 부분 난 당신의 솔루션을 사용자 정의 ChannelInterceptor에 누워있다 말할 수 있습니다 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"/> 

염두에 두십시오 statefull이므로 각 메시지에 대해 calculateput 시간을 수동으로 입력해야합니다. 이 단지 put위한

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; 
    } 
} 

:

또 다른 옵션은 사용자 정의 AbstractRequestHandlerAdvice를 구현해야 할 때, <jms:request-handler-advice-chain>입니다.

get 부분의 경우 execution timeMessageListener이며 event-driven 구성 요소이므로 파생 될 수 없습니다. 메시지가 큐에있을 때 방금 메시지를 수신하면 그게 전부입니다. 리스너가 대기열에서 메시지 검색을 시작할 때 동점이되지 않습니다.

+0

Artem, 세부 사항으로 내 질문을 업데이트했습니다. 제발 제안 해주세요. 당신의 제안을보고 다시 대답 할 것입니다. 감사. –

+0

답변이 업데이트되었습니다 –

+0

감사합니다 Artem. 나는 너의 제안을 사용하여 시간을 넣을 수있다.그리고 당신이 말했듯이, 나는 우리가 "시간을 얻을 수 없다"는 것을 이해합니다. 그러나 message-driven-channel-adapter가 메시지를 수신 한 후에 타임 스탬프를 얻는 것이 가능합니다. 이제 MQ에서 메시지를 가져온 후 호출되는 즉시 메서드에 타임 스탬프를 기록합니다. –