34.2. 메시지

34.2.1. 개요

메시지 오브젝트는 다음 추상 모델을 사용하여 메시지를 나타냅니다.

  • 메시지 본문
  • 메시지 헤더
  • 메시지 첨부 파일

메시지 본문과 메시지 헤더는 임의의 유형( 개체형식으로 선언됨)일 수 있으며 메시지 첨부 파일은 임의의 MIME 유형을 포함할 수 있는 javax.activation.DataHandler 유형으로 선언됩니다. 메시지 내용을 구체적으로 표현해야 하는 경우 형식 변환기 메커니즘을 사용하여 본문과 헤더를 다른 유형으로 변환할 수 있으며 마샬링 및 비마일링 메커니즘을 사용할 수 있습니다.If you need to obtain a specific representation of the message contents, you can convert the body and headers to another type using the type converter mechanism and, possibly, using the marshalling and unmarshalling mechanism.

Apache Camel 메시지의 한 가지 중요한 기능은 메시지 본문 및 헤더의 지연 생성 을 지원하는 것입니다. 경우에 따라 메시지를 전혀 구문 분석할 필요 없이 경로를 통과할 수 있습니다.

34.2.2. 메시지 인터페이스

org.apache.camel.Message 인터페이스는 예 34.2. “메시지 인터페이스” 와 같이 메시지 본문, 메시지 헤더 및 메시지 첨부 파일에 액세스하는 방법을 정의합니다.

예 34.2. 메시지 인터페이스

// Access the message body
Object getBody();
<T> T  getBody(Class<T> type);
void   setBody(Object body);
<T> void setBody(Object body, Class<T> type);

// Access message headers
Object getHeader(String name);
<T> T  getHeader(String name, Class<T> type);
void   setHeader(String name, Object value);
Object removeHeader(String name);
Map<String, Object> getHeaders();
void setHeaders(Map<String, Object> headers);

// Access message attachments
javax.activation.DataHandler getAttachment(String id);
java.util.Map<String, javax.activation.DataHandler> getAttachments();
java.util.Set<String> getAttachmentNames();
void addAttachment(String id, javax.activation.DataHandler content)

// Access the message ID
String getMessageId();
void   setMessageId(String messageId);

메시지 인터페이스의 방법에 대한 자세한 내용은 44.1절. “메시지 인터페이스” 을 참조하십시오.

34.2.3. 본문, 헤더 및 첨부 파일의 지연 생성

Apache Camel은 본문, 헤더 및 첨부 파일의 지연 생성을 지원합니다. 즉, 메시지 본문, 메시지 헤더 또는 메시지 첨부를 나타내는 개체는 필요할 때까지 생성되지 않습니다.

예를 들어 In 메시지에서 foo 메시지 헤더에 액세스하는 다음 경로를 고려하십시오.

from("SourceURL")
    .filter(header("foo")
    .isEqualTo("bar"))
    .to("TargetURL");

이 경로에서 SourceURL 에서 참조하는 구성 요소가 지연 생성을 지원한다고 가정하면 header("foo") 호출이 실행될 때까지 In 메시지 헤더가 실제로 구문 분석되지 않습니다. 이 시점에서 기본 메시지 구현은 헤더를 구문 분석하고 헤더 맵을 채웁니다. 메시지 본문 은 경로 끝에 도달할 때까지 to("TargetURL") 호출에서 구문 분석되지 않습니다. 이 시점에서 본문은 대상 끝점인 TargetURL 에 작성하는 데 필요한 형식으로 변환됩니다.

본문, 헤더 및 첨부 파일을 채우기 전에 가능한 마지막 순간까지 기다리면 불필요한 유형 변환을 피할 수 있습니다. 경우에 따라 구문 분석을 완전히 방지할 수 있습니다. 예를 들어 경로에 메시지 헤더에 대한 명시적 참조가 없는 경우 메시지는 헤더를 구문 분석하지 않고 경로를 통과할 수 있습니다.

지연 생성이 실제로 구현되었는지 여부는 기본 구성 요소 구현에 따라 다릅니다. 일반적으로 지연 생성은 메시지 본문, 메시지 헤더 또는 메시지 첨부 파일을 생성하는 경우 비용이 많이 듭니다. 지연 생성을 지원하는 메시지 유형을 구현하는 방법에 대한 자세한 내용은 44.2절. “메시지 인터페이스 구현” 을 참조하십시오.

34.2.4. 메시지 ID 생성 지연

Apache Camel은 메시지 ID의 지연 생성을 지원합니다. 즉, 메시지 ID는 실제로 getMessageId() 메서드를 호출할 때만 생성됩니다. 이 메서드의 DefaultExchange.getExchangeId() 구현은 ID 생성을 CamelContext 에 등록된 UUID 생성기에 위임합니다.

일부 엔드포인트 구현에서는 엔드포인트가 고유한 메시지 ID가 필요한 프로토콜을 구현하는 경우 getMessageId() 메서드를 암시적으로 호출합니다. 특히 JMS 메시지에는 일반적으로 고유한 메시지 ID가 포함된 헤더가 포함되어 있으므로 JMS 구성 요소는 getMessageId() 를 자동으로 호출하여 메시지 ID를 가져옵니다(JMS 엔드포인트에서 messageIdEnabled 옵션에 의해 제어됨).

CamelContext 에 UUID 생성기를 등록하는 방법에 대한 자세한 내용은 34.4절. “내장된 UUID 생성기” 을 참조하십시오.

34.2.5. 초기 메시지 형식

In 메시지의 초기 형식은 소스 끝점에 의해 결정되며 Out 메시지의 초기 형식은 대상 끝점에 따라 결정됩니다. 기본 구성 요소에서 lazy 생성을 지원하는 경우 애플리케이션에서 명시적으로 액세스할 때까지 메시지는 구문 해제된 상태로 유지됩니다. 대부분의 Apache Camel 구성 요소는 비교적 원시 형식의 message 본문을 생성합니다. 예를 들어 byte[], Cryostat Buffer,InputStream 또는 OutputStream 과 같은 유형을 사용하여 나타내는 메시지 본문을 생성합니다. 이렇게 하면 초기 메시지를 생성하는 데 필요한 오버헤드가 최소화됩니다. 더 정교한 메시지 형식이 필요한 경우 일반적으로 형식 변환기 또는 마샬링 프로세서에 의존합니다.

34.2.6. 유형 변환기

메시지의 초기 형식이 무엇인지는 중요하지 않습니다. 기본 제공 유형 변환기를 사용하여 메시지를 한 형식에서 다른 형식으로 쉽게 변환할 수 있기 때문입니다( 34.3절. “붙박임 유형”참조). Apache Camel API에는 유형 변환 기능을 노출하는 다양한 방법이 있습니다. 예를 들어 convertBodyTo(Class type) 메서드를 경로에 삽입하여 다음과 같이 In 메시지의 본문을 변환할 수 있습니다.

from("SourceURL").convertBodyTo(String.class).to("TargetURL");

여기서 In 메시지의 본문은 java.lang.String 으로 변환됩니다. 다음 예제에서는 In 메시지 본문의 끝에 문자열을 추가하는 방법을 보여줍니다.

from("SourceURL").setBody(bodyAs(String.class).append("My Special Signature")).to("TargetURL");

여기서 메시지 본문은 끝에 문자열을 추가하기 전에 문자열 형식으로 변환됩니다. 이 예에서 메시지 본문을 명시적으로 변환할 필요는 없습니다. 또는 다음을 수행할 수도 있습니다.

from("SourceURL").setBody(body().append("My Special Signature")).to("TargetURL");

여기서 append() 메서드는 인수를 추가하기 전에 메시지 본문을 문자열로 자동 변환합니다.

34.2.7. 메시지에 변환 메서드를 입력합니다.Type conversion methods in Message

org.apache.camel.Message 인터페이스는 유형 변환을 명시적으로 수행하는 몇 가지 메서드를 노출합니다.

  • getBody(Class<T> 유형) 메시지 본문을 유형 T 로 반환합니다.
  • getHeader(문자열 이름, Class<T> 유형) Cryostat-ECDHE-11 choosing the named header value as type, T.

지원되는 변환 유형의 전체 목록은 34.3절. “붙박임 유형” 을 참조하십시오.

34.2.8. XML로 변환

기본 제공 형식 변환기는 XML 형식으로의 변환도 지원합니다.In addition to support conversion between simple types (such as byte[], Cryostat Buffer,string, and so on), the built-in type converter also supports conversion to XML formats. 예를 들어 메시지 본문을 org.w3c.dom.Document 유형으로 변환할 수 있습니다. 이 변환은 전체 메시지를 구문 분석한 다음 XML 문서 구조를 나타내는 노드 트리를 생성해야 하므로 단순 변환보다 비용이 많이 듭니다. 다음 XML 문서 유형으로 변환할 수 있습니다.

  • org.w3c.dom.Document
  • javax.xml.transform.sax.SAXSource

XML 유형 변환에는 단순한 변환보다 더 적은 적용 가능성이 있습니다. 모든 메시지 본문이 XML 구조를 따르는 것은 아니므로 이 형식 변환이 실패할 수 있다는 점을 명심해야 합니다. 반면 라우터가 XML 메시지 유형을 독점적으로 처리하는 많은 시나리오가 있습니다.

34.2.9. 마샬링 및 unmarshalling

마샬링 은 높은 수준의 형식을 낮은 수준의 형식으로 변환해야 하며, unmarshalling 은 하위 수준 형식을 상위 수준 형식으로 변환하는 것입니다. 다음 두 프로세서는 경로에서 마샬링 또는 unmarshalling을 수행하는 데 사용됩니다.

  • marshal()
  • unmarshal()

예를 들어 파일에서 직렬화된 Java 오브젝트를 읽고 Java 오브젝트로 요약하려면 예 34.3. “Java 오브젝트 정리” 에 표시된 경로 정의를 사용할 수 있습니다.

예 34.3. Java 오브젝트 정리

from("file://tmp/appfiles/serialized")
    .unmarshal()
    .serialization()
    .<FurtherProcessing>
    .to("TargetURL");

34.2.10. 최종 메시지 형식

In 메시지가 경로 끝에 도달하면 대상 끝점에서 메시지 본문을 물리적 엔드포인트에 쓸 수 있는 형식으로 변환할 수 있어야 합니다. 소스 엔드포인트에 다시 도달하는 Out 메시지에도 동일한 규칙이 적용됩니다. 이 변환은 일반적으로 Apache Camel 유형 변환기를 사용하여 암시적으로 수행됩니다. 일반적으로 바이트[] 배열에서 InputStream 유형으로 변환하는 등 하위 수준 형식에서 다른 하위 수준 형식으로 변환하는 작업이 포함됩니다.