242.6. 예


242.6.1. 요청-Reply 및 직렬화된 오브젝트 페이로드를 사용하는 UDP Netty 끝점

RouteBuilder builder = new RouteBuilder() {
  public void configure() {
    from("netty4:udp://0.0.0.0:5155?sync=true")
      .process(new Processor() {
         public void process(Exchange exchange) throws Exception {
           Poetry poetry = (Poetry) exchange.getIn().getBody();
           poetry.setPoet("Dr. Sarojini Naidu");
           exchange.getOut().setBody(poetry);
         }
       }
    }
};

242.6.2. 단방향 통신을 사용하는 TCP 기반 Netty 소비자 끝점

RouteBuilder builder = new RouteBuilder() {
  public void configure() {
       from("netty4:tcp://0.0.0.0:5150")
           .to("mock:result");
  }
};

242.6.3. 요청-Reply 통신을 사용하는 SSL/TCP 기반 Netty 소비자 끝점

JSSE 구성 유틸리티 사용

Camel 2.9부터 Netty 구성 요소는 Camel JSSE 구성 유틸리티를 통한 SSL/TLS 구성 을 지원합니다. 이 유틸리티는 작성해야 하는 구성 요소 특정 코드의 양을 크게 줄이고 끝점 및 구성 요소 수준에서 구성할 수 있습니다. 다음 예제에서는 Netty 구성 요소와 함께 유틸리티를 사용하는 방법을 보여줍니다.

구성 요소의 프로그래밍 방식 구성

KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");

KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");

SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);

NettyComponent nettyComponent = getContext().getComponent("netty4", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);

끝점의 Spring DSL 기반 구성

...
  <camel:sslContextParameters
      id="sslContextParameters">
    <camel:keyManagers
        keyPassword="keyPassword">
      <camel:keyStore
          resource="/users/home/server/keystore.jks"
          password="keystorePassword"/>
    </camel:keyManagers>
  </camel:sslContextParameters>...
...
  <to uri="netty4:tcp://0.0.0.0:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...

[Netty4-UsingBasicSSL/TLSconfigurationontheJettyComponent]]]* Use Basic SSL/TLS configuration on the component

JndiRegistry registry = new JndiRegistry(createJndiContext());
registry.bind("password", "changeit");
registry.bind("ksf", new File("src/test/resources/keystore.jks"));
registry.bind("tsf", new File("src/test/resources/keystore.jks"));

context.createRegistry(registry);
context.addRoutes(new RouteBuilder() {
  public void configure() {
      String netty_ssl_endpoint =
         "netty4:tcp://0.0.0.0:5150?sync=true&ssl=true&passphrase=#password"
         + "&keyStoreFile=#ksf&trustStoreFile=#tsf";
      String return_string =
         "When You Go Home, Tell Them Of Us And Say,"
         + "For Your Tomorrow, We Gave Our Today.";

      from(netty_ssl_endpoint)
       .process(new Processor() {
          public void process(Exchange exchange) throws Exception {
            exchange.getOut().setBody(return_string);
          }
       }
  }
});

SSLSession 및 클라이언트 인증서에 대한 액세스 가져오기

클라이언트 인증서에 대한 세부 정보가 필요한 경우 javax.net.ssl.SSLSession 에 액세스할 수 있습니다. ssl=true 인 경우 Netty4 구성 요소는 다음과 같이 Camel Message에 SSLSession 을 헤더로 저장합니다.

SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class);
// get the first certificate which is client certificate
javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0];
Principal principal = cert.getSubjectDN();

needClientAuth=true 를 설정하여 클라이언트를 인증해야 합니다. 그렇지 않으면 SSLSession 에서 클라이언트 인증서에 대한 정보에 액세스할 수 없으며 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated. 클라이언트 인증서가 만료되었거나 유효하지 않은 경우 이 예외를 가져올 수도 있습니다.

작은 정보

sslClientCertHeaders 옵션을 true 로 설정하면 클라이언트 인증서에 대한 세부 정보가 포함된 Camel Message를 헤더로 보강할 수 있습니다. 예를 들어, 제목 이름은 CamelNettySSLClientCertSubjectName 헤더에서 쉽게 사용할 수 있습니다.

242.6.4. 여러 Codecs 사용

어떤 경우에는 인코더 및 디코더 체인을 netty 파이프라인에 추가해야 할 수도 있습니다. camel netty 엔드포인트에 여러 codecs를 추가하려면 'encoders' 및 'decoders' uri 매개변수를 사용해야 합니다. 'encoder' 및 'decoder' 매개변수와 마찬가지로 파이프라인에 추가해야 하는 참조( ChannelUpstreamHandler 및 ChannelDownstreamHandlers 목록)를 제공하는 데 사용됩니다. 인코더가 지정되면 디코더 및 디코더 매개 변수에 대해 유사하게 인코더 매개변수가 무시됩니다.

참고

공유 가능한 인코더/디코더/디코더 사용에 대해 자세히 알아보십시오.

엔드포인트를 생성할 때 문제를 해결할 수 있도록 Camel의 레지스트리에 Ccs 목록을 추가해야 합니다.

ChannelHandlerFactory lengthDecoder = ChannelHandlerFactories.newLengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4);

StringDecoder stringDecoder = new StringDecoder();
registry.bind("length-decoder", lengthDecoder);
registry.bind("string-decoder", stringDecoder);

LengthFieldPrepender lengthEncoder = new LengthFieldPrepender(4);
StringEncoder stringEncoder = new StringEncoder();
registry.bind("length-encoder", lengthEncoder);
registry.bind("string-encoder", stringEncoder);

List<ChannelHandler> decoders = new ArrayList<ChannelHandler>();
decoders.add(lengthDecoder);
decoders.add(stringDecoder);

List<ChannelHandler> encoders = new ArrayList<ChannelHandler>();
encoders.add(lengthEncoder);
encoders.add(stringEncoder);

registry.bind("encoders", encoders);
registry.bind("decoders", decoders);

Spring의 네이티브 컬렉션 지원을 사용하여 애플리케이션 컨텍스트에서 codec 목록을 지정할 수 있습니다.

<util:list id="decoders" list-class="java.util.LinkedList">
        <bean class="org.apache.camel.component.netty4.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
            <constructor-arg value="1048576"/>
            <constructor-arg value="0"/>
            <constructor-arg value="4"/>
            <constructor-arg value="0"/>
            <constructor-arg value="4"/>
        </bean>
        <bean class="io.netty.handler.codec.string.StringDecoder"/>
    </util:list>

    <util:list id="encoders" list-class="java.util.LinkedList">
        <bean class="io.netty.handler.codec.LengthFieldPrepender">
            <constructor-arg value="4"/>
        </bean>
        <bean class="io.netty.handler.codec.string.StringEncoder"/>
    </util:list>

    <bean id="length-encoder" class="io.netty.handler.codec.LengthFieldPrepender">
        <constructor-arg value="4"/>
    </bean>
    <bean id="string-encoder" class="io.netty.handler.codec.string.StringEncoder"/>

    <bean id="length-decoder" class="org.apache.camel.component.netty4.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
        <constructor-arg value="1048576"/>
        <constructor-arg value="0"/>
        <constructor-arg value="4"/>
        <constructor-arg value="0"/>
        <constructor-arg value="4"/>
    </bean>
    <bean id="string-decoder" class="io.netty.handler.codec.string.StringDecoder"/>

그런 다음, 8080 이름은 netty 엔드포인트 정의에서 쉼표로 구분된 목록으로 사용하거나 목록(예:)에 포함될 수 있습니다.

 from("direct:multiple-codec").to("netty4:tcp://0.0.0.0:{{port}}?encoders=#encoders&sync=false");

 from("netty4:tcp://0.0.0.0:{{port}}?decoders=#length-decoder,#string-decoder&sync=false").to("mock:multiple-codec");

또는 XML을 통해

<camelContext id="multiple-netty-codecs-context" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:multiple-codec"/>
        <to uri="netty4:tcp://0.0.0.0:5150?encoders=#encoders&amp;sync=false"/>
    </route>
    <route>
        <from uri="netty4:tcp://0.0.0.0:5150?decoders=#length-decoder,#string-decoder&amp;sync=false"/>
        <to uri="mock:multiple-codec"/>
    </route>
</camelContext>
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.