Apach Camel의 메시지 Hissage History 모드로 메시지 흐름 확인
11095 단어 apache-camel
이번에 소개된 Message History 모드는 Enterprise Integration Pattern의 일종이다.
Camel에서는 구성 요소와 프로세서 간에 정보를 통해 드문드문 결합됩니다.
그래서 구체적인 정보가 어떤 절차로 통과되었는지 모르겠다.
메시지 히스토리 모드에서는 정보에 이력서(발자국 같은 것)를 추가하면 디버깅과 분석에 도움을 줄 수 있다.
그림 출처: Enterprise Integration Patterns - Message History
예외 발생 시 메시지 History
Camel에서 개발한 메시지히스토리를 볼 기회의 대표적 예는 예외가 발생했을 때다.
Camel에서는 Message History 모드가 자동으로 적용되며 예외가 발생하면 기본적으로 Message History가 표시됩니다.
다음 XML은 경로 도중에 런타임 Exception을 적용합니다.
<route>
<from uri="timer:trigges?repeatCount=1" />
<to uri="direct:a" />
<to uri="direct:b" />
<log message="body: ${body}" />
</route>
<route>
<from uri="direct:a" />
<log message="route a" />
</route>
<route>
<from uri="direct:b" />
<throwException exceptionType="java.lang.RuntimeException" message="test exception" />
<log message="route b" />
</route>
이 노선을 실행하면 다음 로그를 출력합니다."Message History"문자열은 다음과 같이 Message History를 나타냅니다.
정보는 Route Id, Processor Id, Processor 및 실행 시간(Elaptsed) 순으로 표시됩니다.또 이번에는 예외인 만큼 Exchange의 StackTrace 정보도 표시됩니다.
[2019-02-14 22:15:52.294], [ERROR], o.a.c.p.DefaultErrorHandler, Camel (camel-1) thread #1 - timer://trigges, org.apache.camel.processor.DefaultErrorHandler, Failed delivery for (MessageId: ID-mky-PC-1550150150431-0-2 on ExchangeId: ID-mky-PC-1550150150431-0-1). Exhausted after delivery attempt: 1 caught: java.lang.RuntimeException: test exception
Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[route1 ] [route1 ] [timer://trigges?repeatCount=1 ] [ 16]
[route1 ] [to1 ] [direct:a ] [ 8]
[route2 ] [log2 ] [log ] [ 5]
[route1 ] [to2 ] [direct:b ] [ 0]
[route3 ] [throwException1 ] [throwException[ref:null] ] [ 1]
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
java.lang.RuntimeException: test exception
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_172]
~省略~
Message History를 XML DSL로 표시애초 예에서는 예외가 발생했을 때 메시지 히스토리를 표시하는 것을 확인했는데, 메시지 히스토리를 명확하게 표시하는 방법을 살펴봤다.
Message History를 XML DSL에 명시적으로 표시하려면 메시지 History 속성을 사용합니다.
메시지 History 속성의 루트를 사용한 예는 다음과 같습니다.
<route>
<from uri="timer:trigges?repeatCount=1" />
<to uri="direct:a" />
<to uri="direct:b" />
<log message="body: ${body}" />
</route>
<route>
<from uri="direct:a" />
<log message="route a" />
</route>
<route>
<from uri="direct:b" />
<log message="${messageHistory}" />
<log message="route b" />
</route>
이 경로를 실행하면 다음과 같은 Message History가 표시됩니다.예외가 발생했을 때의 메시지 히스토리와는 거의 같은 내용이지만 이번에는 예외가 아니어서 StackTrace가 표시되지 않는다.
Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[route1 ] [route1 ] [timer://trigges?repeatCount=1 ] [ 14]
[route1 ] [to1 ] [direct:a ] [ 7]
[route2 ] [log2 ] [log ] [ 4]
[route1 ] [to2 ] [direct:b ] [ 0]
[route3 ] [log3 ] [log ] [ 0]
Exchange
---------------------------------------------------------------------------------------------------------------------------------------
Exchange[
Id ID-mky-PC-1550150269136-0-1
ExchangePattern InOnly
Headers {breadcrumbId=ID-mky-PC-1550150269136-0-1, firedTime=Thu Feb 14 22:17:50 JST 2019}
BodyType null
Body [Body is null]
Java DSL로 Message History 표시Java DSL에는 Message History가 명시적으로 표시됩니다.
이것도 메시지 History 속성만 사용합니다.내보낸 Message History는 XML DSL과 같기 때문에 생략됩니다.
from("timer:trigger?repeatCount=1")
.to("direct:a")
.to("direct:b")
.log("Body-before: ${body}")
.log("Body-after: ${body}");
from("direct:a")
.log("route a");
from("direct:b")
.log("${messageHistory}")
.log("route b");
프로세서에 Message History 표시프로세서에서 Message History를 출력하려면 Message Helper 클래스의 d u m pMessage History Stacktrace 메서드를 사용합니다.du pMessage History Stacktrace 방법을 사용하면 성형 문자열에서 Message History를 얻을 수 있습니다.
다음은 프로세서의 프로세스 방법에서 d u m pMessage History Stacktrace 방법을 사용하여 표준 출력에 Message History를 표시하는 예입니다.
public void process(Exchange exchange) {
String msgHist = MessageHelper.dumpMessageHistoryStacktrace(exchange, new DefaultExchangeFormatter(), false);
System.out.println(msgHist);
}
메서드의 세 번째 매개변수는 StackTrace 플래그를 표시할지 여부입니다.만약 사실이라면 예외가 발생할 때 StackTrace를 함께 표시합니다.이 예에서는 가짜로 설정합니다.
참고 자료
Reference
이 문제에 관하여(Apach Camel의 메시지 Hissage History 모드로 메시지 흐름 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mkyz08/items/f9199156ffb84524a5f1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)