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를 함께 표시합니다.이 예에서는 가짜로 설정합니다.
참고 자료
  • Message History(공식 사이트)
  • 좋은 웹페이지 즐겨찾기