2.4. Cryostat 통합
2.4.1. 개요
Quarkus 통합은 임의의 Java 오브젝트를 사용하여 메시지를 처리하기 위한 일반적인 용도 메커니즘을 제공합니다. Quarkus 참조를 경로에 삽입하면 Java 오브젝트에서 임의의 메서드를 호출하여 들어오는 교환에 액세스하고 수정할 수 있습니다. exchange의 내용을 매개 변수에 매핑하고, 8080 메서드의 반환 값을 매개 변수 바인딩 이라고 합니다. 매개변수 바인딩은 메서드의 매개변수를 초기화하기 위해 다음 접근 방식의 조합을 사용할 수 있습니다.
- 기존 메서드 서명 에서 메서드 시그니처가 특정 규칙을 준수하는 경우 매개 변수 바인딩은 Java 리플렉션을 사용하여 전달할 매개변수를 결정할 수 있습니다.
- 더 유연한 바인딩 메커니즘의 경우 Java 주석을 사용하여 메서드의 인수에 삽입할 항목을 지정합니다. 이 종속성 주입 메커니즘은 Spring 2.5 구성 요소 검사에 의존합니다. 일반적으로 Apache Camel 애플리케이션을 Spring 컨테이너에 배포하는 경우 종속성 주입 메커니즘이 자동으로 작동합니다.
- 명시적으로 지정된 매개 변수 Cryostat- Cryostat는 빈이 호출되는 시점에서 매개 변수를 상수 또는 Simple 언어를 사용하여 명시적으로 지정할 수 있습니다.
2.4.2. Cryostat 레지스트리
빈은 클래스 이름 또는 빈 ID를 키로 사용하여 빈을 조회할 수 있는 서비스인 8080 레지스트리 를 통해 액세스할 수 있습니다. 8080 레지스트리에서 항목을 생성하는 방법은 기본 프레임워크의 경우 일반 Java, Spring, Guice 또는 블루프린트에 따라 다릅니다. 레지스트리 항목은 일반적으로 암시적으로 생성됩니다(예: Spring XML 파일에서 Spring 8080을 인스턴스화할 때).
2.4.3. 레지스트리 플러그인 전략
Apache Camel은 8080 레지스트리에 대한 플러그인 전략을 구현하여 기본 레지스트리 구현을 투명하게 만드는 빈에 액세스하기 위한 통합 계층을 정의합니다. 따라서 표 2.2. “레지스트리 플러그인” 에 표시된 대로 다양한 다른 8080 레지스트리와 Apache Camel 애플리케이션을 통합할 수 있습니다.
레지스트리 구현 | 레지스트리 플러그인이 포함된 Camel 구성 요소 |
---|---|
Spring 8080 레지스트리 |
|
Guice metrics 레지스트리 |
|
블루프린트 8080 레지스트리 |
|
OSGi 서비스 레지스트리 | OSGi 컨테이너에배포 |
JNDI 레지스트리 |
일반적으로 관련 8080 레지스트리가 자동으로 설치되므로 빈 레지스트리 구성에 대해 우려할 필요가 없습니다. 예를 들어 Spring 프레임워크를 사용하여 경로를 정의하는 경우 Spring ApplicationContextRegistry
플러그인이 현재 CamelContext
인스턴스에 자동으로 설치됩니다.
OSGi 컨테이너의 배포는 특수한 사례입니다. Apache Camel 경로가 OSGi 컨테이너에 배포되면 CamelContext
에서 빈 인스턴스를 해결하기 위해 레지스트리 체인을 자동으로 설정합니다. 레지스트리 체인은 OSGi 레지스트리와 블루프린트(또는 Spring) 레지스트리로 구성됩니다.
2.4.4. Java에서 생성된 8080에 액세스
Java 8080(일반 이전 Java 오브젝트 또는 Cryostat)을 사용하여 교환 오브젝트를 처리하려면 Java 오브젝트의 메서드에 인바운드 교환을 바인딩하는 Cryostat ()
프로세서를 사용합니다. 예를 들어, 클래스 MyBeanProcessor
를 사용하여 인바운드 교환을 처리하려면 다음과 같은 경로를 정의합니다.
from("file:data/inbound") .bean(MyBeanProcessor.class, "processBody") .to("file:data/outbound");
Cryostat ()
프로세서는 MyBeanProcessor
유형의 인스턴스를 생성하고 processBody()
메서드를 호출하여 인바운드 교환을 처리합니다. 이 방법은 단일 경로에서 MyBeanProcessor
인스턴스에만 액세스하려는 경우에만 적합합니다. 그러나 여러 경로에서 동일한 MyBeanProcessor
인스턴스에 액세스하려면 Object
유형을 첫 번째 인수로 사용하는ans ()
변형을 사용합니다. 예를 들면 다음과 같습니다.
MyBeanProcessor myBean = new MyBeanProcessor(); from("file:data/inbound") .bean(myBean, "processBody") .to("file:data/outbound"); from("activemq:inboundData") .bean(myBean, "processBody") .to("activemq:outboundData");
2.4.5. 과부하된 Cryostat 메서드에 액세스
Quarkus에서 오버로드된 메서드를 정의하는 경우 해당 매개 변수 유형과 함께 메서드 이름을 지정하여 호출할 오버로드된 메서드를 선택할 수 있습니다. 예를 들어 MyBeanBrocessor
클래스에 두 개의 오버로드된 메서드인 processBody(String)
및 processBody(String,String)
가 있는 경우 다음과 같이 후자 오버로드된 메서드를 호출할 수 있습니다.
from("file:data/inbound") .bean(MyBeanProcessor.class, "processBody(String,String)") .to("file:data/outbound");
또는 각 매개변수의 유형을 명시적으로 지정하는 대신 사용하는 매개변수 수로 메서드를 식별하려면 와일드카드 문자 *
를 사용할 수 있습니다. 예를 들어 정확한 매개변수 유형에 관계없이 두 매개변수를 사용하는 processBody
라는 메서드를 호출하려면 다음과 같이 polkit ()
프로세서를 호출합니다.
from("file:data/inbound") .bean(MyBeanProcessor.class, "processBody(*,*)") .to("file:data/outbound");
메서드를 지정할 때 간단한 정규화되지 않은 유형 이름(예: processBody(Exchange)
) 또는 정규화된 유형 name(예: processBody(org.apache.camel.Exchange)
을 사용할 수 있습니다.
현재 구현에서 지정된 유형 이름은 매개 변수 유형의 정확한 일치여야 합니다. 유형 상속은 고려되지 않습니다.
2.4.6. 매개변수를 명시적으로 지정
Quarkus 메서드를 호출할 때 매개 변수 값을 명시적으로 지정할 수 있습니다. 다음과 같은 간단한 유형 값을 전달할 수 있습니다.
-
부울:
true
또는false
. -
숫자:
123
,7
등. -
문자열:
' 작은따옴표'
또는"큰따옴표로"
. -
null 개체:
null
.
다음 예제에서는 명시적 매개변수 값을 동일한 메서드 호출에서 형식 지정자와 혼합할 수 있는 방법을 보여줍니다.
from("file:data/inbound") .bean(MyBeanProcessor.class, "processBody(String, 'Sample string value', true, 7)") .to("file:data/outbound");
이전 예에서 첫 번째 매개변수의 값은 매개변수 바인딩 주석에 의해 결정될 수 있습니다( “기본 주석”참조).
간단한 유형 값 외에도 간단한 언어(30장. 간단한 언어)를 사용하여 매개변수 값을 지정할 수도 있습니다. 즉, 매개 변수 값을 지정할 때 Simple 언어의 전체 기능을 사용할 수 있습니다. 예를 들어 메시지 본문과 title
헤더의 값을 8080 메서드에 전달하려면 다음을 수행합니다.
from("file:data/inbound") .bean(MyBeanProcessor.class, "processBodyAndHeader(${body},${header.title})") .to("file:data/outbound");
전체 헤더 해시 맵을 매개변수로 전달할 수도 있습니다. 예를 들어 다음 예제에서는 두 번째 메서드 매개 변수를 java.util.Map
유형으로 선언해야 합니다.
from("file:data/inbound") .bean(MyBeanProcessor.class, "processBodyAndAllHeaders(${body},${header})") .to("file:data/outbound");
Apache Camel 2.19 릴리스에서 빈 메서드 호출에서 null을 반환하는 경우 항상 메시지 본문이 null 값으로 설정되어 있는지 확인합니다.
2.4.7. 기본 방법 서명
빈 메서드에 교환을 바인딩하려면 특정 규칙을 준수하는 메서드 서명을 정의할 수 있습니다. 특히 메서드 서명에 대한 두 가지 기본 규칙이 있습니다.
2.4.8. 메시지 본문을 처리하기 위한 메서드 서명
들어오는 메시지 본문에 액세스하거나 수정하는 measure 메서드를 구현하려면 단일 문자열 인수를 사용하고
값을 반환하는 메서드 서명을 정의해야 합니다. 예를 들면 다음과 같습니다.
문자열
// Java package com.acme; public class MyBeanProcessor { public String processBody(String body) { // Do whatever you like to 'body'... return newBody; } }
2.4.9. 교환 처리를 위한 방법 서명
유연성을 높이기 위해 들어오는 교환에 액세스하는 8080 방법을 구현할 수 있습니다. 이를 통해 모든 헤더, 본문 및 속성에 액세스하거나 수정할 수 있습니다. 교환 처리의 경우 메서드 서명은 단일 org.apache.camel.Exchange
매개 변수를 사용하고 void
를 반환합니다. 예를 들면 다음과 같습니다.
// Java package com.acme; public class MyBeanProcessor { public void processExchange(Exchange exchange) { // Do whatever you like to 'exchange'... exchange.getIn().setBody("Here is a new message body!"); } }
2.4.10. Spring XML에서 Spring 8080에 액세스
Java에서 빈 인스턴스를 생성하는 대신 Spring XML을 사용하여 인스턴스를 만들 수 있습니다. 실제로 XML로 경로를 정의하는 경우 가능한 유일한 접근 방식입니다. XML로 빈을 정의하려면 표준 Spring 8080 요소를 사용합니다. 다음 예제에서는
MyBeanProcessor
인스턴스를 만드는 방법을 보여줍니다.
<beans ...> ... <bean id="myBeanId" class="com.acme.MyBeanProcessor"/> </beans>
Spring 구문을 사용하여 blank의 생성자 인수에 데이터를 전달할 수도 있습니다. Spring 8080 요소를 사용하는 방법에 대한 자세한 내용은
Spring 참조 가이드 의 IoC 컨테이너를 참조하십시오.
8080 요소를 사용하여 오브젝트 인스턴스를 생성할 때, 8080 요소의 id
속성 값(배터리의 ID 값)을 사용하여 나중에 참조할 수 있습니다.
예를 들어,
myBeanId
와 동일한 ID가 있는 8080 요소가 있는 경우 다음과 같이 Cryostat Ref() 프로세서를 사용하여 Java DSL 경로의 빈
을 참조할 수 있습니다.
from("file:data/inbound").beanRef("myBeanId", "processBody").to("file:data/outbound");
여기서 Cryo statRef()
프로세서는 지정된 8080 인스턴스에서 MyBeanProcessor.processBody()
메서드를 호출합니다.
Camel 스키마의 8080 요소를 사용하여 Spring XML 경로 내에서 8080을 호출할 수도 있습니다. 예를 들면 다음과 같습니다.
<camelContext id="CamelContextID" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="file:data/inbound"/> <bean ref="myBeanId" method="processBody"/> <to uri="file:data/outbound"/> </route> </camelContext>
약간의 효율성 향상을 위해 cache
옵션을 true
로 설정하면 jenkins가 사용될 때마다 레지스트리를 조회하지 않도록 할 수 있습니다. 예를 들어 캐싱을 활성화하려면 다음과 같이 8080 요소에서 cache
특성을 설정할 수 있습니다.
<bean ref="myBeanId" method="processBody" cache="true"/>
2.4.11. Java에서 Spring 8080에 액세스
Spring 8080 요소를 사용하여 오브젝트 인스턴스를 생성할 때, 빈
의 ID(Must 요소의 id
속성 값)를 사용하여 Java에서 개체 인스턴스를 참조할 수 있습니다. 예를 들어,
myBeanId
와 동일한 ID가 있는 8080 요소가 있는 경우 다음과 같이 Cryostat Ref() 프로세서를 사용하여 Java DSL 경로의 빈
을 참조할 수 있습니다.
from("file:data/inbound").beanRef("myBeanId", "processBody").to("file:data/outbound");
또는 다음과 같이 @BeanInject
주석을 사용하여 삽입하여 Spring 8080을 참조할 수 있습니다.
// Java import org.apache.camel.@BeanInject; ... public class MyRouteBuilder extends RouteBuilder { @BeanInject("myBeanId") com.acme.MyBeanProcessor bean; public void configure() throws Exception { .. } }
@BeanInject
주석에서 빈 ID를 생략하면 Camel에서 레지스트리를 유형별로 조회하지만 지정된 유형의 단일ans만 있는 경우에만 작동합니다. 예를 들어 com.acme.MyBeanProcessor
유형의ans를 조회하고 삽입하려면 다음을 수행합니다.
@BeanInject com.acme.MyBeanProcessor bean;
2.4.12. Spring XML의 Cryostat 종료 순서
Camel 컨텍스트에서 사용하는 빈의 경우 일반적으로 올바른 종료 순서는 다음과 같습니다.
-
camelContext
인스턴스를 종료하고 다음을 수행합니다. - 사용된 빈을 종료합니다.
이 종료 순서가 역방향인 경우 Camel 컨텍스트가 이미 삭제되어 오류가 발생할 수 있습니다(오류로 직접 발생함). 또는 Camel 컨텍스트가 삭제되는 동안 누락된 Cryostat를 생성하려고 하면 오류도 발생할 수 있습니다. Spring XML의 기본 종료 순서는 빈과 camelContext
가 Spring XML 파일에 표시되는 순서에 따라 달라집니다. 잘못된 종료 순서로 인한 임의의 오류를 방지하기 위해 camelContext
는 Spring XML 파일의 다른 빈보다 먼저 종료되도록 구성됩니다. 이는 Apache Camel 2.13.0 이후의 기본 동작입니다.
이 동작을 변경해야 하는 경우( Camel 컨텍스트가 다른 빈보다 먼저 종료 되지 않도록 함) camelContext
요소에 shutdownEager
속성을 false
로 설정할 수 있습니다. 이 경우 Spring 종속
속성을 사용하여 종료 순서를 보다 세밀하게 제어할 수 있습니다.
2.4.13. 매개변수 바인딩 주석
“기본 방법 서명” 에 설명된 기본 매개변수 바인딩이 항상 사용하기에 편리하지는 않을 수 있습니다. 예를 들어 일부 데이터 조작을 수행하는 레거시 Java 클래스가 있는 경우 인바운드 교환에서 데이터를 추출하여 기존 메서드 서명의 인수에 매핑해야 할 수 있습니다. 이러한 종류의 매개변수 바인딩에 대해 Apache Camel은 다음과 같은 종류의 Java 주석을 제공합니다.
2.4.14. 기본 주석
표 2.3. “기본 Cryostat 주석” 메시지 데이터를 8080 메서드의 인수에 삽입하는 데 사용할 수 있는 org.apache.camel
Java 패키지의 주석을 표시합니다.
주석 | 의미 | 매개 변수? |
---|---|---|
| 첨부 파일 목록에 바인딩합니다. | |
| 인바운드 메시지 본문에 바인딩합니다. | |
| 인바운드 메시지 헤더에 바인딩합니다. | 헤더의 문자열 이름입니다. |
|
인바운드 메시지 헤더의 | |
|
아웃바운드 메시지 헤더의 | |
| 이름이 지정된 교환 속성에 바인딩합니다. | 속성의 문자열 이름입니다. |
|
교환 속성의 |
예를 들어 다음 클래스는 기본 주석을 사용하여 메시지 데이터를 processExchange()
메서드 인수에 삽입하는 방법을 보여줍니다.
// Java import org.apache.camel.*; public class MyBeanProcessor { public void processExchange( @Header(name="user") String user, @Body String body, Exchange exchange ) { // Do whatever you like to 'exchange'... exchange.getIn().setBody(body + "UserName = " + user); } }
주석을 기본 규칙과 혼합하는 방법을 확인하십시오. 주석이 달린 인수를 삽입하는 것 외에도 매개 변수 바인딩은 교환 오브젝트를 org.apache.camel.Exchange
인수에 자동으로 삽입합니다.
2.4.15. 표현식 언어 주석
표현식 언어 주석은 message 데이터를 8080 메서드의 인수에 삽입하기 위한 강력한 메커니즘을 제공합니다. 이러한 주석을 사용하면 선택한 스크립팅 언어로 작성된 임의의 스크립트를 호출하여 인바운드 교환에서 데이터를 추출하고 메서드 인수에 데이터를 삽입할 수 있습니다. 표 2.4. “표현식 언어 주석” message 데이터를 Cryostat 메서드의 인수에 삽입하는 데 사용할 수 있는 org.apache.camel.
Cryostat 패키지(및 비코어 주석의 하위 패키지)의 주석을 표시합니다.
주석 | 설명 |
---|---|
| Cryostat 표현식을 삽입합니다. |
| Constant 표현식을 삽입합니다. |
| EL 표현식을 삽입합니다. |
| Groovy 표현식을 삽입합니다. |
| 헤더 표현식을 삽입합니다. |
| JavaScript 표현식을 삽입합니다. |
| OGNL 표현식을 삽입합니다. |
| PHP 표현식을 삽입합니다. |
| Python 표현식을 삽입합니다. |
| Ruby 표현식을 삽입합니다. |
| 단순 표현식을 삽입합니다. |
| Cryostat 표현식을 삽입합니다. |
| XQuery 표현식을 삽입합니다. |
예를 들어 다음 클래스는 @XPath
주석을 사용하여 들어오는 메시지의 본문에서 사용자 이름과 암호를 XML 형식으로 추출하는 방법을 보여줍니다.
// Java import org.apache.camel.language.*; public class MyBeanProcessor { public void checkCredentials( @XPath("/credentials/username/text()") String user, @XPath("/credentials/password/text()") String pass ) { // Check the user/pass credentials... ... } }
@Bean
주석은 등록된 8080을 호출한 결과를 삽입할 수 있기 때문에 특별한 경우입니다. 예를 들어 메서드 인수에 상관 관계 ID를 삽입하려면 @Bean
주석을 사용하여 다음과 같이 ID 생성기 클래스를 호출할 수 있습니다.
// Java import org.apache.camel.language.*; public class MyBeanProcessor { public void processCorrelatedMsg( @Bean("myCorrIdGenerator") String corrId, @Body String body ) { // Check the user/pass credentials... ... } }
여기서 myCorrIdGenerator
문자열은 ID 생성기 인스턴스의 빈 ID입니다. ID 생성기 클래스는 다음과 같이 spring 8080 요소를 사용하여 인스턴스화할 수 있습니다.
<beans ...> ... <bean id="myCorrIdGenerator" class="com.acme.MyIdGenerator"/> </beans>
여기에서 MyIdGenerator
클래스를 다음과 같이 정의할 수 있습니다.
// Java package com.acme; public class MyIdGenerator { private UserManager userManager; public String generate( @Header(name = "user") String user, @Body String payload ) throws Exception { User user = userManager.lookupUser(user); String userId = user.getPrimaryId(); String id = userId + generateHashCodeForPayload(payload); return id; } }
참조된 8080 클래스 MyIdGenerator
에서 주석을 사용할 수도 있습니다. generate()
메서드 서명에 대한 유일한 제한 사항은 @Bean
에서 주석이 달린 인수에 삽입하려면 올바른 유형을 반환해야 한다는 것입니다. @Bean
주석은 메서드 이름을 지정할 수 없으므로 주입 메커니즘은 일치하는 반환 유형이 있는 참조 빈에서 첫 번째 메서드를 호출하기만 하면 됩니다.
일부 언어 주석은 코어 구성 요소(@Bean
,@Constant
,@Simple
, @XPath
)에서 사용할 수 있습니다. 그러나 코어가 아닌 구성 요소의 경우 관련 구성 요소를 로드해야 합니다. 예를 들어 OGNL 스크립트를 사용하려면 camel-ognl
구성 요소를 로드해야 합니다.
2.4.16. 상속된 주석
매개변수 바인딩 주석은 인터페이스 또는 슈퍼클래스에서 상속될 수 있습니다. 예를 들어 Header
주석과 Body
주석을 사용하여 Java 인터페이스를 정의하는 경우 다음과 같이 다음과 같습니다.
// Java import org.apache.camel.*; public interface MyBeanProcessorIntf { void processExchange( @Header(name="user") String user, @Body String body, Exchange exchange ); }
구현 클래스에 정의된 오버로드된 메서드 MyBeanProcessor
는 다음과 같이 기본 인터페이스에 정의된 주석을 상속합니다.
// Java import org.apache.camel.*; public class MyBeanProcessor implements MyBeanProcessorIntf { public void processExchange( String user, // Inherits Header annotation String body, // Inherits Body annotation Exchange exchange ) { ... } }
2.4.17. 인터페이스 구현
Java 인터페이스를 구현하는 클래스는 종종개인
또는 패키지 전용
범위로 보호됩니다
. 이러한 방식으로 제한된 구현 클래스에서 메서드를 호출하려고 하면 Quarkus 바인딩이 공개적으로 액세스할 수 있는 해당 인터페이스 메서드를 호출하는 것으로 대체됩니다.
예를 들어 다음 공용 Cryostat Intf
인터페이스를 고려해 보십시오.
// Java public interface BeanIntf { void processBodyAndHeader(String body, String title); }
여기서 Cryo statIntf
인터페이스는 다음 보호된 Cryostat IntfImpl
클래스에 의해 구현됩니다.
// Java protected class BeanIntfImpl implements BeanIntf { void processBodyAndHeader(String body, String title) { ... } }
다음 Cryostat 호출은 public Cryostat Intf.processBodyAndHeader
메서드를 호출합니다.
from("file:data/inbound") .bean(BeanIntfImpl.class, "processBodyAndHeader(${body}, ${header.title})") .to("file:data/outbound");
2.4.18. 정적 메서드 호출
Cryostat 통합에는 연결된 클래스의 인스턴스를 생성하지 않고도 정적 메서드를 호출할 수 있습니다. 예를 들어 정적 메서드를 정의하는 다음 Java 클래스를, changeSomething()
:
// Java ... public final class MyStaticClass { private MyStaticClass() { } public static String changeSomething(String s) { if ("Hello World".equals(s)) { return "Bye World"; } return null; } public void doSomething() { // noop } }
polkit 통합을 사용하여 다음과 같이 정적 변경Something
메서드를 호출할 수 있습니다.
from("direct:a") *.bean(MyStaticClass.class, "changeSomething")* .to("mock:a");
이 구문은 일반 함수의 호출과 동일하지만, 8080 통합은 Java 리플렉션을 악용하여 메서드를 정적으로 식별하고 MyStaticClass
를 인스턴스화 하지 않고 메서드를 호출합니다.
2.4.19. OSGi 서비스 호출
Red Hat Fuse 컨테이너에 경로가 배포되는 특수한 경우 metrics 통합을 사용하여 OSGi 서비스를 직접 호출할 수 있습니다. 예를 들어 OSGi 컨테이너의 번들 중 하나가 서비스를 내보냈다고 가정하면 org.fusesource.example.HelloWorldOsgiService
.NET Framework 통합 코드를 사용하여 sayHello
메서드를 호출할 수 있습니다.
from("file:data/inbound") .bean(org.fusesource.example.HelloWorldOsgiService.class, "sayHello") .to("file:data/outbound");
다음과 같이 Quarkus 구성 요소를 사용하여 Spring 또는 블루프린트 XML 파일 내에서 OSGi 서비스를 호출할 수도 있습니다.
<to uri="bean:org.fusesource.example.HelloWorldOsgiService?method=sayHello"/>
이 작동 방식은 Apache Camel이 OSGi 컨테이너에 배포될 때 레지스트리 체인을 설정하는 것입니다. 먼저 OSGi 서비스 레지스트리에서 지정된 클래스 이름을 조회합니다. 이 조회가 실패하면 로컬 Spring DM 또는 블루프린트 레지스트리로 대체됩니다.