검색

2.6. 메시지 콘텐츠 변환

download PDF

초록

Apache Camel은 메시지 콘텐츠를 변환하는 다양한 방법을 지원합니다. Apache Camel은 메시지 콘텐츠를 수정하기 위한 간단한 기본 API 외에도 다양한 타사 라이브러리 및 변환 표준과의 통합을 지원합니다.

2.6.1. 간단한 메시지입니다.

2.6.1.1. 개요

Java DSL에는 수신 및 발신 메시지에 대해 간단한 변환을 수행할 수 있는 기본 제공 API가 있습니다. 예를 들어 예 2.1. “Incoming Messages” 에 표시된 규칙은 들어오는 메시지 본문의 끝에 텍스트 World! 를 추가합니다.

예 2.1. Incoming Messages

from("SourceURL").setBody(body().append(" World!")).to("TargetURL");

여기서 setBody() 명령은 들어오는 메시지 본문의 내용을 대체합니다.

2.6.1.2. 간단한 변환을 위한 API

다음 API 클래스를 사용하여 라우터 규칙에서 메시지 콘텐츠를 간단한 변환을 수행할 수 있습니다.

  • org.apache.camel.model.ProcessorDefinition
  • org.apache.camel.builder.Builder
  • org.apache.camel.builder.ValueBuilder

2.6.1.3. ProcessorDefinition 클래스

org.apache.camel.model.ProcessorDefinition 클래스는 예 2.1. “Incoming Messages”setBody() 명령에 직접 삽입할 수 있는 DSL 명령을 정의합니다. 표 2.5. “ProcessorDefinition 클래스의 transformation Methods” 메시지 콘텐츠 변환과 관련된 ProcessorDefinition 메서드를 표시합니다.

표 2.5. ProcessorDefinition 클래스의 transformation Methods
방법설명

type convertBodyTo(Class 유형)

IN 메시지 본문을 지정된 형식으로 변환합니다.

type removeFaultHeader(String name)

CryostatULT 메시지에서 헤더를 제거하는 프로세서를 추가합니다.

type removeHeader(문자열 이름)

IN 메시지에서 헤더를 제거하는 프로세서를 추가합니다.

type removeProperty(문자열 이름)

교환 속성을 제거하는 프로세서를 추가합니다.

ExpressionClause<ProcessorDefinition<Type>> setBody()

IN 메시지에 본문을 설정하는 프로세서를 추가합니다.

setFaultBody(Expression expression)를 입력합니다.

vmULT 메시지에 본문을 설정하는 프로세서를 추가합니다.

setFaultHeader(문자열 이름, 표현식)을 입력합니다.

CryostatULT 메시지에 헤더를 설정하는 프로세서를 추가합니다.

ExpressionClause<ProcessorDefinition<Type>> setHeader(String name)

IN 메시지에 헤더를 설정하는 프로세서를 추가합니다.

setHeader(문자열 이름, 표현식)를 입력합니다.

IN 메시지에 헤더를 설정하는 프로세서를 추가합니다.

ExpressionClause<ProcessorDefinition<Type>> setOutHeader(String name)

OUT 메시지에 헤더를 설정하는 프로세서를 추가합니다.

setOutHeader(문자열 이름, 표현식)를 입력합니다.

OUT 메시지에 헤더를 설정하는 프로세서를 추가합니다.

ExpressionClause<ProcessorDefinition<Type>> setProperty(String name)

교환 속성을 설정하는 프로세서를 추가합니다.

setProperty(문자열 이름, 표현식)를 입력합니다.

교환 속성을 설정하는 프로세서를 추가합니다.

ExpressionClause<ProcessorDefinition<Type>> transform()

OUT 메시지에 본문을 설정하는 프로세서를 추가합니다.

type transform(Expression expression)

OUT 메시지에 본문을 설정하는 프로세서를 추가합니다.

2.6.1.4. 빌더 클래스

org.apache.camel.builder.Builder 클래스는 표현식 또는 서술자가 예상되는 컨텍스트의 메시지 콘텐츠에 대한 액세스를 제공합니다. 즉, 빌더 메서드는 일반적으로 DSL 명령의 인수 에서 호출됩니다(예: 예 2.1. “Incoming Messages”body() 명령). 표 2.6. “빌더 클래스의 메서드” Builder 클래스에서 사용할 수 있는 정적 메서드를 요약합니다.

표 2.6. 빌더 클래스의 메서드
방법설명

static <E extends Exchange> ValueBuilder<E> body()

교환에서 인바운드 본문에 대한 서술자 및 값 빌더를 반환합니다.

static <E extends Exchange,T> ValueBuilder<E> bodyAs(Class<T> 유형)

인바운드 메시지 본문에 대한 서술자 및 값 빌더를 특정 유형으로 반환합니다.

static <E extends Exchange> ValueBuilder<E> constant(Object value)

상수 표현식을 반환합니다.

static <E extends Exchange> ValueBuilder<E> faultBody()

교환에서 fault 본문에 대한 서술자 및 값 빌더를 반환합니다.

static <E extends Exchange,T> ValueBuilder<E> faultBodyAs(Class<T> 유형)

fault 메시지 본문에 대한 서술자 및 값 빌더를 특정 유형으로 반환합니다.

static <E extends Exchange> ValueBuilder<E> header(String name)

교환의 헤더에 대한 서술자 및 값 빌더를 반환합니다.

static <E extends Exchange> ValueBuilder<E> outBody()

교환에서 아웃바운드 본문에 대한 서술자 및 값 빌더를 반환합니다.

static <E extends Exchange> ValueBuilder<E> outBodyAs(Class<T> 유형)

아웃바운드 메시지 본문의 서술자 및 값 빌더를 특정 유형으로 반환합니다.

정적 ValueBuilder 속성(문자열 이름)

교환의 속성에 대한 서술자 및 값 빌더를 반환합니다.

static ValueBuilder regexReplaceAll(Expression 콘텐츠, 문자열 regex, Expression 대체)

정규식을 모두 지정된 교체로 대체하는 표현식을 반환합니다.

static ValueBuilder regexReplaceAll(Expression 콘텐츠, 문자열 regex, 문자열 대체)

정규식을 모두 지정된 교체로 대체하는 표현식을 반환합니다.

static ValueBuilder sendTo(String uri)

지정된 엔드포인트 uri로 교환을 처리하는 표현식을 반환합니다.

static <E extends Exchange> ValueBuilder<E> systemProperty(String name)

지정된 시스템 속성에 대한 표현식을 반환합니다.

static <E extends Exchange> ValueBuilder<E> systemProperty(String name, String defaultValue)

지정된 시스템 속성에 대한 표현식을 반환합니다.

2.6.1.5. ValueBuilder 클래스

org.apache.camel.builder.ValueBuilder 클래스를 사용하면 Builder 메서드에서 반환된 값을 수정할 수 있습니다. 즉 ValueBuilder의 메서드는 메시지 내용을 수정하는 간단한 방법을 제공합니다.In other words, the methods in ValueBuilder provide a simple way of modifying message content. 표 2.7. “ValueBuilder 클래스의 한정자 메서드” ValueBuilder 클래스에서 사용할 수 있는 메서드를 요약합니다. 즉, 테이블에 호출되는 값을 수정하는 데 사용되는 메서드만 표시됩니다(자세한 내용은 API 참조 문서 참조 참조 ).

표 2.7. ValueBuilder 클래스의 한정자 메서드
방법설명

ValueBuilder<E> append(Object value)

지정된 값으로 이 표현식의 문자열 평가를 추가합니다.

서술자는(Object value)를 포함합니다.

왼쪽 표현식에 오른쪽 표현식의 값이 포함된 서술자를 생성합니다.

ValueBuilder<E> convertTo(Class 유형)

등록된 형식 변환기를 사용하여 현재 값을 지정된 형식으로 변환합니다.Converts the current value to the given type using the registered type converters.

ValueBuilder<E> convertToString()

등록된 형식 변환기를 사용하여 문자열을 변환합니다.Converts a string using the registered type converters.

서술자 endWith(Object 값)

 

<t> T evaluate (Exchange exchange, Class<T> type)

 

서술자(Object…​ 값)

 

서술자(Predicate…​ 서술자)

 

predicate isEqualTo(Object value)

현재 값이 지정된 value 인수와 같은 경우 true를 반환합니다.

predicate isGreaterThan(Object value)

현재 값이 지정된 value 인수보다 큰 경우 true를 반환합니다.

predicate isGreaterThanOrEqualTo(Object 값)

현재 값이 지정된 value 인수보다 크거나 같은 경우 true를 반환합니다.

서술자 isInstanceOf(Class 유형)

현재 값이 지정된 형식의 인스턴스인 경우 true를 반환합니다.

predicate isLessThan(Object value)

현재 값이 지정된 value 인수보다 작은 경우 true를 반환합니다.

predicate isLessThanOrEqualTo(Object value)

현재 값이 지정된 value 인수보다 작거나 같은 경우 true를 반환합니다.

predicate isNotEqualTo(Object value)

현재 값이 지정된 value 인수와 같지 않은 경우 true를 반환합니다.

Predicate isNotNull()

현재 값이 null 이 아닌 경우 true를 반환합니다.

Predicate isNull()

현재 값이 null 인 경우 true를 반환합니다.

서술자 일치(Expression 표현식)

 

서술자 not(Predicate 서술자)

서술자 인수를 부정합니다.

ValueBuilder prepend(Object value)

이 표현식의 문자열 평가 앞에 지정된 값에 추가합니다.

predicate regex(문자열 regex)

 

ValueBuilder<E> regexReplaceAll(String regex, Expression<E> replacement)

정규 표현식의 모든 occurrencies를 지정된 교체로 대체합니다.

ValueBuilder<E> regexReplaceAll(String regex, String replacement)

정규 표현식의 모든 occurrencies를 지정된 교체로 대체합니다.

ValueBuilder<E> regexTokenize(String regex)

지정된 정규식을 사용하여 이 표현식의 문자열 변환을 토큰화합니다.

ValueBuilder sort(Comparator 비교자)

지정된 비교기를 사용하여 현재 값을 정렬합니다.

서술자 startsWith(Object 값)

현재 값이 value 인수의 문자열 값과 일치하는 경우 true를 반환합니다.

ValueBuilder<E> tokenize()

쉼표 토큰 구분자를 사용하여 이 표현식의 문자열 변환을 토큰화합니다.

ValueBuilder<E> 토큰화(문자열 토큰)

지정된 토큰 구분자를 사용하여 이 표현식의 문자열 변환을 토큰화합니다.

2.6.2. 마샬링 및 Unmarshalling

2.6.2.1. Java DSL 명령

다음 명령을 사용하여 하위 수준 및 높은 수준의 메시지 형식을 변환할 수 있습니다.

  • Marshal() Cryostat- Cryostat 높은 수준의 데이터 형식을 낮은 수준의 데이터 형식으로 변환합니다.
  • unmarshal()) 낮은 수준의 데이터 형식을 높은 수준의 데이터 형식으로 변환합니다.

2.6.2.2. 데이터 형식

Apache Camel은 다음 데이터 형식을 마샬링 및 unmarshalling하도록 지원합니다.

  • Java serialization
  • JAXB
  • XMLBeans
  • XStream

2.6.2.3. Java serialization

Java 개체를 바이너리 데이터의 Blob으로 변환할 수 있습니다. 이 데이터 형식의 경우 unmarshalling은 바이너리 Blob을 Java 개체로 변환하고 마샬링은 Java 개체를 바이너리 Blob으로 변환합니다. 예를 들어 끝점인 SourceURL 에서 직렬화된 Java 오브젝트를 읽고 Java 오브젝트로 변환하려면 다음과 같은 규칙을 사용합니다.

from("SourceURL").unmarshal().serialization()
.<FurtherProcessing>.to("TargetURL");

또는 Spring XML:

<camelContext id="serialization" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="SourceURL"/>
    <unmarshal>
      <serialization/>
    </unmarshal>
    <to uri="TargetURL"/>
  </route>
</camelContext>

2.6.2.4. JAXB

XML 스키마 유형과 Java 유형 간의 매핑을 제공합니다( https://jaxb.dev.java.net/참조). CryostatB의 경우 unmarshalling은 XML 데이터 형식을 Java 개체로 변환하고 마샬링은 Java 개체를 XML 데이터 형식으로 변환합니다. CryostatB 데이터 형식을 사용하려면 먼저 schema의 XML 데이터 형식을 나타내는 Java 클래스를 생성하려면 XML 스키마를 컴파일해야 합니다. 이를 스키마 바인딩 이라고 합니다. 스키마가 바인딩된 후 다음과 같은 코드를 사용하여 Java 오브젝트에 XML 데이터를 unmarshal하는 규칙을 정의합니다.

org.apache.camel.spi.DataFormat jaxb = new org.apache.camel.model.dataformat.JaxbDataFormat("GeneratedPackageName");

from("SourceURL").unmarshal(jaxb)
.<FurtherProcessing>.to("TargetURL");

여기서 GeneratedPackagename 은 XML 스키마를 나타내는 Java 클래스를 포함하는 CryostatB 컴파일러에서 생성한 Java 패키지의 이름입니다.

또는 Spring XML:

<camelContext id="jaxb" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="SourceURL"/>
    <unmarshal>
      <jaxb prettyPrint="true" contextPath="GeneratedPackageName"/>
    </unmarshal>
    <to uri="TargetURL"/>
  </route>
</camelContext>

2.6.2.5. XMLBeans

XML 스키마 유형과 Java 유형 간의 대체 매핑을 제공합니다( http://xmlbeans.apache.org/참조). XMLBeans의 경우 unmarshalling은 XML 데이터 형식을 Java 개체로 변환하고 마샬링은 Java 개체를 XML 데이터 형식으로 변환합니다. 예를 들어 XMLBeans를 사용하여 Java 오브젝트에 XML 데이터를 unmarshal하려면 다음과 같은 코드를 사용합니다.

from("SourceURL").unmarshal().xmlBeans()
.<FurtherProcessing>.to("TargetURL");

또는 Spring XML:

<camelContext id="xmlBeans" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="SourceURL"/>
    <unmarshal>
      <xmlBeans prettyPrint="true"/>
    </unmarshal>
    <to uri="TargetURL"/>
  </route>
</camelContext>

2.6.2.6. XStream

XML 유형과 Java 유형 간의 다른 매핑을 제공합니다( http://www.xml.com/pub/a/2004/08/18/xstream.html참조). XStream은 Java 직렬화와 같은 직렬화 라이브러리이므로 Java 개체를 XML로 변환할 수 있습니다. XStream의 경우 unmarshalling은 XML 데이터 형식을 Java 개체로 변환하고 마샬링은 Java 개체를 XML 데이터 형식으로 변환합니다.

from("SourceURL").unmarshal().xstream()
.<FurtherProcessing>.to("TargetURL");
참고

XStream 데이터 형식은 현재 Spring XML에서 지원되지 않습니다.

2.6.3. 끝점 바인딩

2.6.3.1. 바인딩이란 무엇입니까?

Apache Camel에서 바인딩 은 데이터 형식, 콘텐츠 Enricher 또는 검증 단계를 적용하여 계약 내 엔드포인트를 래핑하는 방법입니다. 상태 또는 변환은 들어오는 메시지에 적용되며 보완적인 조건 또는 변환이 표시되는 메시지에 적용됩니다.

2.6.3.2. DataFormatBinding

DataFormatBinding 클래스는 특정 데이터 형식을 마샬링하고 unmarshalshal하는 바인딩을 정의하려는 특정 사례에 유용합니다( 2.6.2절. “마샬링 및 Unmarshalling”참조). 이 경우 바인딩을 생성하는 데 필요한 모든 작업은 DataFormatBinding 인스턴스를 생성하고 생성자에서 관련 데이터 형식에 참조를 전달하는 것입니다.

예를 들어 예 2.2. “CryostatB 바인딩” 의 XML DSL 스니펫에는 Apache Camel 끝점과 연결된 경우 CryostatB 데이터 형식을 마샬링하고 분리할 수 있는 바인딩(ID, jaxb)이 표시됩니다.

예 2.2. CryostatB 바인딩

<beans ... >
    ...
    <bean id="jaxb" class="org.apache.camel.processor.binding.DataFormatBinding">
        <constructor-arg ref="jaxbformat"/>
    </bean>

    <bean id="jaxbformat" class="org.apache.camel.model.dataformat.JaxbDataFormat">
        <property name="prettyPrint" value="true"/>
        <property name="contextPath" value="org.apache.camel.example"/>
    </bean>

</beans>

2.6.3.3. 바인딩과 끝점 연결

다음 대안은 바인딩을 끝점과 연결하는 데 사용할 수 있습니다.

2.6.3.4. 바인딩 URI

바인딩을 끝점과 연결하려면 엔드포인트 URI를 바인딩:NameOfBinding 로 접두사로 지정할 수 있습니다. 여기서 NameOfBinding 은 바인딩의 빈 ID입니다(예: Spring XML에서 생성된 바인딩 빈의 ID).

예를 들어 다음 예제에서는 ActiveMQ 끝점을 예 2.2. “CryostatB 바인딩” 에 정의된 CryostatB 바인딩과 연결하는 방법을 보여줍니다.

<beans ...>
    ...
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="binding:jaxb:activemq:orderQueue"/>
            <to uri="binding:jaxb:activemq:otherQueue"/>
        </route>
    </camelContext>
    ...
</beans>

2.6.3.5. BindingComponent

접두사를 사용하여 엔드포인트와 바인딩을 연결하는 대신, 바인딩을 URI에 표시할 필요가 없도록 연결을 암시적으로 만들 수 있습니다. 암시적 바인딩이 없는 기존 끝점의 경우 가장 쉬운 방법은 BindingComponent 클래스를 사용하여 끝점을 래핑하는 것입니다.

예를 들어 jaxb 바인딩을 activemq 엔드포인트와 연결하려면 다음과 같이 새 BindingComponent 인스턴스를 정의할 수 있습니다.

<beans ... >
    ...
    <bean id="jaxbmq" class="org.apache.camel.component.binding.BindingComponent">
        <constructor-arg ref="jaxb"/>
        <constructor-arg value="activemq:foo."/>
    </bean>

    <bean id="jaxb" class="org.apache.camel.processor.binding.DataFormatBinding">
        <constructor-arg ref="jaxbformat"/>
    </bean>

    <bean id="jaxbformat" class="org.apache.camel.model.dataformat.JaxbDataFormat">
        <property name="prettyPrint" value="true"/>
        <property name="contextPath" value="org.apache.camel.example"/>
    </bean>

</beans>

여기서 (선택 사항) jaxbmq 의 두 번째 생성자 인수는 URI 접두사를 정의합니다. 이제 엔드포인트 URI의 스키마로 jaxbmq ID를 사용할 수 있습니다. 예를 들어 이 바인딩 구성 요소를 사용하여 다음 경로를 정의할 수 있습니다.

<beans ...>
    ...
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="jaxbmq:firstQueue"/>
            <to uri="jaxbmq:otherQueue"/>
        </route>
    </camelContext>
    ...
</beans>

이전 경로는 바인딩 URI 접근 방식을 사용하는 다음 경로와 동일합니다.

<beans ...>
    ...
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="binding:jaxb:activemq:foo.firstQueue"/>
            <to uri="binding:jaxb:activemq:foo.otherQueue"/>
        </route>
    </camelContext>
    ...
</beans>
참고

사용자 지정 Apache Camel 구성 요소를 구현하는 개발자의 경우 org.apache.camel.spi.HasBinding 인터페이스에서 상속하는 엔드포인트 클래스를 구현하여 이 작업을 수행할 수 있습니다.

2.6.3.6. BindingComponent 생성자

BindingComponent 클래스는 다음 생성자를 지원합니다.

public BindingComponent()
인수 양식이 없습니다. 속성 주입을 사용하여 바인딩 구성 요소 인스턴스를 구성합니다.
public BindingComponent(Binding binding)
이 바인딩 구성 요소를 지정된 Binding 개체, 바인딩 과 연결합니다.
public BindingComponent(Binding binding, String uriPrefix)
이 바인딩 구성 요소를 지정된 Binding 오브젝트, 바인딩 및 URI 접두사인 uriPrefix 와 연결합니다. 가장 일반적으로 사용되는 생성자입니다.
public BindingComponent(Binding binding, String uriPrefix, String uriPostfix)
이 생성자는 이 바인딩 구성 요소를 사용하여 정의된 모든 URI에 자동으로 추가되는 uriPostfix, 인수 등 추가 URI를 지원합니다.

2.6.3.7. 사용자 정의 바인딩 구현

데이터 형식을 마샬링 및 unmarshalling하는 데 사용되는 DataFormatBinding 외에도 자체 사용자 지정 바인딩을 구현할 수 있습니다.In addition to the DataFormatBinding , which is used for marshalling and unmarshalling data formats, you can implement your own custom bindings. 다음과 같이 사용자 정의 바인딩을 정의합니다.

  1. org.apache.camel.Processor 클래스를 구현하여 소비자 엔드포인트에 들어오는 메시지에서 변환을 수행합니다( from 요소에서 표시).
  2. 상호 보완적인 org.apache.camel.Processor 클래스를 구현하여 생산자 엔드포인트에서 나가는 메시지(에 대한 요소)에서 역방향 변환을 수행합니다.
  3. 프로세서 인스턴스의 팩토리 역할을 하는 org.apache.camel.spi.Binding 인터페이스를 구현합니다.

2.6.3.8. 바인딩 인터페이스

예 2.3. “org.apache.camel.spi.Binding 인터페이스” 사용자 지정 바인딩을 정의하기 위해 구현해야 하는 org.apache.camel.spi.Binding 인터페이스의 정의를 표시합니다.

예 2.3. org.apache.camel.spi.Binding 인터페이스

// Java
package org.apache.camel.spi;

import org.apache.camel.Processor;

/**
 * Represents a <a href="http://camel.apache.org/binding.html">Binding</a> or contract
 * which can be applied to an Endpoint; such as ensuring that a particular
 * <a href="http://camel.apache.org/data-format.html">Data Format</a> is used on messages in and out of an endpoint.
 */
public interface Binding {

    /**
     * Returns a new {@link Processor} which is used by a producer on an endpoint to implement
     * the producer side binding before the message is sent to the underlying endpoint.
     */
    Processor createProduceProcessor();

    /**
     * Returns a new {@link Processor} which is used by a consumer on an endpoint to process the
     * message with the binding before its passed to the endpoint consumer producer.
     */
    Processor createConsumeProcessor();
}

2.6.3.9. 바인딩을 사용해야 하는 경우

바인딩은 동일한 종류의 변환을 여러 종류의 엔드포인트에 적용해야 하는 경우에 유용합니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.