6장. Camel 구성 요소
이 장에서 지원되는 camel 구성 요소에 대한 자세한 정보
6.1. Camel-activemq
Camel ActiveMQ 통합은 activemq 구성 요소에서 제공합니다.
포함된 또는 외부 브로커와 작동하도록 구성 요소를 구성할 수 있습니다. Wildfly / EAP 컨테이너 관리 연결 풀 및 XA-Transaction 지원의 경우 ActiveMQ 리소스 어댑터 를 컨테이너 구성 파일에 구성할 수 있습니다.
6.1.1. JBoss EAP ActiveMQ 리소스 어댑터 구성
ActiveMQ 리소스 어댑터 rar 파일을 다운로드합니다. 다음 단계에서는 ActiveMQ 리소스 어댑터를 구성하는 방법을 간략하게 설명합니다.
- JBoss EAP 인스턴스를 중지합니다.
리소스 어댑터를 다운로드하여 관련 JBoss EAP 배포 디렉터리에 복사합니다. 독립 실행형 모드의 경우:
cp activemq-rar-5.11.1.rar ${JBOSS_HOME}/standalone/deployments/activemq-rar.rar
- ActiveMQ 어댑터에 대한 JBoss EAP 리소스 어댑터 하위 시스템을 구성합니다.
<subsystem xmlns="urn:jboss:domain:resource-adapters:2.0"> <resource-adapters> <resource-adapter id="activemq-rar.rar"> <archive> activemq-rar.rar </archive> <transaction-support>XATransaction</transaction-support> <config-property name="UseInboundSession"> false </config-property> <config-property name="Password"> defaultPassword </config-property> <config-property name="UserName"> defaultUser </config-property> <config-property name="ServerUrl"> tcp://localhost:61616?jms.rmIdFromConnectionId=true </config-property> <connection-definitions> <connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndi-name="java:/ActiveMQConnectionFactory" enabled="true" pool-name="ConnectionFactory"> <xa-pool> <min-pool-size>1</min-pool-size> <max-pool-size>20</max-pool-size> <prefill>false</prefill> <is-same-rm-override>false</is-same-rm-override> </xa-pool> </connection-definition> </connection-definitions> <admin-objects> <admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndi-name="java:/queue/HELLOWORLDMDBQueue" use-java-context="true" pool-name="HELLOWORLDMDBQueue"> <config-property name="PhysicalName"> HELLOWORLDMDBQueue </config-property> </admin-object> <admin-object class-name="org.apache.activemq.command.ActiveMQTopic" jndi-name="java:/topic/HELLOWORLDMDBTopic" use-java-context="true" pool-name="HELLOWORLDMDBTopic"> <config-property name="PhysicalName"> HELLOWORLDMDBTopic </config-property> </admin-object> </admin-objects> </resource-adapter> </resource-adapters> </subsystem>
리소스 어댑터 아카이브 파일 이름이 activemq-rar.rar와 다른 경우 아카이브 파일의 이름과 일치하도록 이전 구성의 아카이브 요소 내용을 변경해야 합니다.
외부 브로커에 있는 유효한 사용자의 자격 증명과 일치하도록 UserName 및 Password 구성 속성 값을 선택해야 합니다.
외부 브로커가 노출하는 실제 호스트 이름 및 포트와 일치하도록 ServerUrl 구성 속성 값을 변경해야 할 수 있습니다.
4) JBoss EAP를 시작합니다. 모든 항목이 올바르게 구성된 경우 다음과 같은 JBoss EAP server.log에 메시지가 표시됩니다.
13:16:08,412 INFO [org.jboss.as.connector.deployment] (MSC service thread 1-5) JBAS010406: Registered connection factory java:/AMQConnectionFactory`
6.1.2. Camel 경로 구성
다음 ActiveMQ 생산자 및 소비자 예제에서는 ActiveMQ 포함 브로커 및 'vm' 전송(외부 ActiveMQ 브로커의 필요성을 방지)을 사용합니다.
예에서는 camel-cdi 구성 요소와 함께 CDI를 사용합니다. JMS ConnectionFactory 인스턴스는 JNDI 조회를 통해 Camel RouteBuilder에 삽입됩니다.
6.1.2.1. ActiveMQ Producer
@Startup @ApplicationScoped @ContextName("activemq-camel-context") public class ActiveMQRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { from("timer://sendJMSMessage?fixedRate=true&period=10000") .transform(constant("<?xml version='1.0><message><greeting>hello world</greeting></message>")) .to("activemq:queue:WildFlyCamelQueue?brokerURL=vm://localhost") .log("JMS Message sent"); } }
메시지가 WildFlyCamelQueue 대상에 추가될 때마다 로그 메시지가 콘솔에 출력됩니다. 메시지가 실제로 큐에 배치되는지 확인하려면 EAP 하위 시스템에서 Camel에서 제공하는 ../features/hawtio.md[Hawtio 콘솔,window=_blank]을 사용할 수 있습니다.
6.1.2.2. ActiveMQ 소비자
ActiveMQ 메시지를 사용하기 위해 Camel RouteBuilder 구현은 생산자 예제와 유사합니다.
ActiveMQ 끝점에서 WildFlyCamelQueue 대상의 메시지를 사용하면 콘텐츠가 콘솔에 기록됩니다.
@Override public void configure() throws Exception { from("activemq:queue:WildFlyCamelQueue?brokerURL=vm://localhost") .to("log:jms?showAll=true"); }
6.1.2.3. ActiveMQ 트랜잭션
6.1.2.3.1. ActiveMQ 리소스 어댑터 구성
XA 트랜잭션 지원, 연결 풀링 등을 활용하려면 ActiveMQ 리소스 어댑터가 필요합니다.
아래 XML 스니펫에서는 JBoss EAP 서버 XML 구성 내에서 리소스 어댑터가 구성된 방법을 보여줍니다. ServerURL
은 포함된 브로커를 사용하도록 설정되어 있습니다. 연결 팩토리는 JNDI 이름 java:/ActiveMQConnectionFactory
에 바인딩됩니다. 이는 다음 RouteBuilder 예제에서 조회됩니다.
마지막으로 두 개의 큐가 'queue1' 및 'queue2'라는 이름으로 구성됩니다.
<subsystem xmlns="urn:jboss:domain:resource-adapters:2.0"> <resource-adapters> <resource-adapter id="activemq-rar.rar"> ... <admin-objects> <admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndi-name="java:/queue/queue1" use-java-context="true" pool-name="queue1pool"> <config-property name="PhysicalName">queue1</config-property> </admin-object> <admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndi-name="java:/queue/queue2" use-java-context="true" pool-name="queue2pool"> <config-property name="PhysicalName">queue2</config-property> </admin-object> </admin-objects> </resource-adapter> </resource-adapters> </subsystem>
6.1.2.4. 트랜잭션 관리자
camel-activemq 구성 요소에는 org.springframework. Cryostat.PlatformTransactionManager
유형의 트랜잭션 관리자가 필요합니다. 따라서 이 요구 사항을 충족하는 JtaTransactionManager
확장 함수를 생성하여 시작할 수 있습니다. 8080에 @Named
주석이 추가되어, 8080이 Camel 8080 레지스트리 내에 등록될 수 있습니다. 또한 JBoss EAP 트랜잭션 관리자 및 사용자 트랜잭션 인스턴스는 CDI를 사용하여 삽입됩니다.
@Named("transactionManager") public class CdiTransactionManager extends JtaTransactionManager { @Resource(mappedName = "java:/TransactionManager") private TransactionManager transactionManager; @Resource private UserTransaction userTransaction; @PostConstruct public void initTransactionManager() { setTransactionManager(transactionManager); setUserTransaction(userTransaction); } }
6.1.2.5. 거래 정책
다음으로 사용하려는 트랜잭션 정책을 선언해야 합니다. 다시 @Named
주석을 사용하여 Camel에서 빈을 사용할 수 있도록 합니다. 트랜잭션 관리자는 원하는 트랜잭션 정책을 사용하여 TransactionTemplate
을 생성할 수 있도록 삽입됩니다. 이 인스턴스의 PROPAGATION_REQUIRED
.
@Named("PROPAGATION_REQUIRED") public class CdiRequiredPolicy extends SpringTransactionPolicy { @Inject public CdiRequiredPolicy(CdiTransactionManager cdiTransactionManager) { super(new TransactionTemplate(cdiTransactionManager, new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED))); } }
6.1.2.6. Route Builder
이제 Camel RouteBuilder 클래스를 구성하고 Camel ActiveMQ 구성 요소에 필요한 종속 항목을 삽입할 수 있습니다. 리소스 어댑터 구성에 구성한 ActiveMQ 연결 팩토리는 이전에 구성한 트랜잭션 관리자와 함께 삽입됩니다.
이 예에서 RouteBuilder는 queue1에서 메시지를 사용할 때마다 queue2라는 다른 JMS 큐로 라우팅됩니다. queue2에서 사용되는 메시지로 인해 JMS 트랜잭션이 rollback() DSL 메서드를 사용하여 롤백됩니다. 이로 인해 원본 메시지가 dead letter queue(DLQ)에 배치됩니다.
@Startup @ApplicationScoped @ContextName("activemq-camel-context") public class ActiveMQRouteBuilder extends RouteBuilder { @Resource(mappedName = "java:/ActiveMQConnectionFactory") private ConnectionFactory connectionFactory; @Inject private CdiTransactionManager transactionManager; @Override public void configure() throws Exception { ActiveMQComponent activeMQComponent = ActiveMQComponent.activeMQComponent(); activeMQComponent.setTransacted(false); activeMQComponent.setConnectionFactory(connectionFactory); activeMQComponent.setTransactionManager(transactionManager); getContext().addComponent("activemq", activeMQComponent); errorHandler(deadLetterChannel("activemq:queue:ActiveMQ.DLQ") .useOriginalMessage() .maximumRedeliveries(0) .redeliveryDelay(1000)); from("activemq:queue:queue1F") .transacted("PROPAGATION_REQUIRED") .to("activemq:queue:queue2"); from("activemq:queue:queue2") .to("log:end") .rollback(); } }
6.1.3. 보안
JMS 보안 섹션을 참조하십시오.
6.1.4. GitHub의 코드 예제
GitHub에서 camel-activemq 애플리케이션 예를 사용할 수 있습니다.