243장. Netty4 HTTP 구성 요소
Camel 버전 2.14에서 사용 가능
netty4-http 구성 요소는 Netty4 를 사용하여 HTTP 전송을 연결하기 위한 Netty4 구성 요소 확장입니다.
이 camel 구성 요소는 생산자 및 소비자 끝점을 모두 지원합니다.
Netty는 스트림 기반이므로 수신하는 입력이 스트림으로 Camel에 제출됩니다. 즉, 스트림의 내용을 한 번만 읽을 수 있습니다.
Netty4 HTTP는 전체 http 메시지를 빌드하기 위해 io.netty.handler.codec.http.HttpObjectAggregator
를 사용하여 전체 스트림을 메모리에 읽습니다. 그러나 결과 메시지는 한 번 읽을 수 있는 스트림 기반 메시지입니다.
메시지 본문이 비어 있거나 데이터에 여러 번 액세스해야 하는 경우(예: 멀티 캐스트 작업 또는 오류 처리) 스트림 캐싱을 사용하거나 메시지 본문을 여러 번 다시 읽을 수 있는 문자열로 변환합니다.
Maven 사용자는 이 구성 요소에 대해 pom.xml
에 다음 종속성을 추가해야 합니다.
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-netty4-http</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
InputStream
을 메시지 본문으로 사용하고 대용량 데이터 스트림(예: > 2GB)을 쓰거나 읽으려면 disableStreamCache
매개변수를 true
로 설정하여 스트리밍 지원을 사용해야 합니다.
예 1: 서버에 대용량 데이터 스트림 업로드
// Upload a large data stream to the server from("direct:upstream-call") .bean(Helper.class, "prepareStream") .to("netty-http:http://localhost:{{port}}/upstream?disableStreamCache=true") .log("get ${body}"); // Read a large data stream from the client from("netty-http:http://0.0.0.0:{{port}}/upstream?disableStreamCache=true") .bean(Helper.class, "processStream") .to("mock:stream-size");
예 2: 서버에서 대용량 데이터 스트림 다운로드
// Download a large data stream from the server from("direct:download-call") .to("netty-http:http://localhost:{{port}}/downstream?disableStreamCache=true") .bean(Helper.class, "asyncProcessStream") .log("get ${body}"); // Write a large data stream to the client from("netty-http:http://0.0.0.0:{{port}}/downstream?disableStreamCache=true") .bean(Helper.class, "prepareStream");
다운로드 예제에서는 기본 스트림 처리기를 차단하지 않도록 다른 스레드의 InputStream
에서 읽어야 합니다( asyncProcessStream
참조).
public static void processStream(Exchange exchange) throws Exception { InputStream is = exchange.getIn().getBody(InputStream.class); byte[] buffer = new byte[1024]; long read = 0; long total = 0; while ((read = is.read(buffer, 0, buffer.length)) != -1) { total += read; } exchange.getIn().setBody(new Long(total)); } public static CompletableFuture<Void> asyncProcessStream(Exchange exchange) { return CompletableFuture.runAsync(() -> { try { processStream(exchange); } catch (Exception e) { exchange.setException(e); } }); }
243.1. URI 형식
netty 구성 요소의 URI 스키마는 다음과 같습니다.
netty4-http:http://0.0.0.0:8080[?options]
URI에 쿼리 옵션을 추가할 수 있습니다. ?option=value&option=value&…
쿼리 매개변수 vs 엔드 포인트 옵션. Camel이 URI 쿼리 매개변수 및 엔드포인트 옵션을 인식하는 방법에 대해 확신할 수 있습니다. 예를 들어 다음과 같이 엔드포인트 URI를 생성할 수 있습니다. netty4-http:http//example.com?myParam=myValue&compression=true
. 이 예제에서 myParam
은 HTTP 매개변수이고 압축
은 Camel 끝점 옵션입니다. 이러한 상황에서 Camel에서 사용하는 전략은 사용 가능한 엔드포인트 옵션을 해결하고 URI에서 제거하는 것입니다. 이 예제에서는 Netty HTTP 생산자가 끝점으로 보낸 HTTP 요청이 대상 URL에서 해결 및 제거되므로 http//example.com?myParam=myValue
임을 의미합니다. 또한 동적 헤더(예:
CamelHttpQuery
)를 사용하여 끝점 옵션을 지정할 수 없습니다. 엔드포인트 옵션은 endpoint URI 정의 수준(예: DSL 요소)에서만 지정할 수 있습니다.