178.6. 샘플
JMS는 다른 구성 요소에도 많은 예에서 사용됩니다. 그러나 시작하기 위해 아래에 몇 가지 샘플을 제공합니다.
178.6.1. JMS에서 수신
다음 샘플에서는 JMS 메시지를 수신하고 메시지를ECDHE로 라우팅하는 경로를 구성합니다.
from("jms:queue:foo"). to("bean:myBusinessLogic");
물론 경로를 기반으로 할 수 있도록 모든 EIP 패턴을 사용할 수 있습니다. 예를 들어, 큰 소비자에 대한 순서 주제를 필터링하는 방법은 다음과 같습니다.
from("jms:topic:OrdersTopic"). filter().method("myBean", "isGoldCustomer"). to("jms:queue:BigSpendersQueue");
178.6.2. JMS로 전송
아래 샘플에서 파일 폴더를 폴링하고 파일 내용을 JMS 주제로 보냅니다. Bytes
로 파일의 내용을 원하는 경우 본문을 문자열로 변환해야 합니다. Message
대신 textMessage
from("file://orders"). convertBodyTo(String.class). to("jms:topic:OrdersTopic");
178.6.3. 주석 사용
Camel에는 또한 annotations가 있으므로ECDHE Consuming 및ECDHE Producing을 사용할 수 있습니다.
178.6.4. Spring DSL 샘플
위의 예제에서는 Java DSL을 사용합니다. Camel은 Spring XML DSL도 지원합니다. 다음은 Spring DSL을 사용하는 큰 소비 샘플입니다.
<route> <from uri="jms:topic:OrdersTopic"/> <filter> <method bean="myBean" method="isGoldCustomer"/> <to uri="jms:queue:BigSpendersQueue"/> </filter> </route>
178.6.5. 기타 샘플
JMS는 다른 구성 요소 및 EIP 패턴의 많은 예와 이 Camel 설명서에서 나타납니다. 따라서 문서를 자유롭게 검색할 수 있습니다.
178.6.6. JMS를 교환을 저장하는 Dead Letter Queue로 사용
일반적으로 JMS 를 전송으로 사용할 때 본문과 헤더만 페이로드로 전송합니다. JMS 대기열을 Dead Letter Queue로 사용하여 Dead Letter Channel 과 함께 JMS를 사용하려는 경우 일반적으로 caused exception이 JMS 메시지에 저장되지 않습니다. 그러나 JMS dead letter 대기열의 transferExchange
옵션을 사용하여 Camel에 org.apache.camel.impl.DefaultExchangeHolder
가 있는 javax.jms.ObjectMessage
로 전체 Exchange를 저장하도록 지시할 수 있습니다. 이를 통해 Dead Letter Queue에서 사용하고 Exchange 속성에서 발생한 예외를 Exchange.EXCEPTION_CAUGHT
키로 검색할 수 있습니다. 아래 데모는 다음을 보여줍니다.
// setup error handler to use JMS as queue and store the entire Exchange errorHandler(deadLetterChannel("jms:queue:dead?transferExchange=true"));
그런 다음 JMS 대기열에서 를 사용하고 문제를 분석할 수 있습니다.
from("jms:queue:dead").to("bean:myErrorAnalyzer"); // and in our bean String body = exchange.getIn().getBody(); Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); // the cause message is String problem = cause.getMessage();
178.6.7. JMS를 Dead Letter Channel로만 사용
JMS를 사용하여 원인 오류 메시지를 저장하거나 직접 초기화할 수 있는 사용자 정의 본문을 저장할 수 있습니다. 다음 예제에서는 메시지 EIP를 사용하여 JMS dead letter 큐로 이동하기 전에 실패한 교환에서 변환을 수행합니다.
// we sent it to a seda dead queue first errorHandler(deadLetterChannel("seda:dead")); // and on the seda dead queue we can do the custom transformation before its sent to the JMS queue from("seda:dead").transform(exceptionMessage()).to("jms:queue:dead");
여기에서는 원본 원인 오류 메시지만 변환에 저장합니다. 그러나 모든 표현식을 사용하여 원하는 대로 보낼 수 있습니다. 예를 들어 빈에서 메서드를 호출하거나 사용자 지정 프로세서를 사용할 수 있습니다.
178.6.8. JMS를 사용하여 소비자 우선 순위 지정
일부 브로커 (특히 Artemis)를 사용하면 전송 중인 메시지에 대한 소비자 우선 순위를 지정할 수 있습니다. 다음 샘플에서는 Artemis ConsumerPriority
속성을 사용하여 우선 순위에 따라 메시지를 변환합니다.
<camelContext id="jms-basic-consumer-priority" xmlns="http://camel.apache.org/schema/spring" autoStartup="true"> <endpoint id="highPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=1000"/> <endpoint id="mediumPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=500"/> <endpoint id="lowPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=1"/> <endpoint id="resultQueue" uri="jms:queue:outputQueue"/> <route> <from uri="ref:highPriorityQueue"/> <transform> <simple>High</simple> </transform> <to uri="ref:resultQueue"/> </route> <route> <from uri="ref:mediumPriorityQueue"/> <transform> <simple>Medium</simple> </transform> <to uri="ref:resultQueue"/> </route> <route> <from uri="ref:lowPriorityQueue"/> <transform> <simple>Low</simple> </transform> <to uri="ref:resultQueue"/> </route> </camelContext>