2016-04-14 252 views
2

我使用駱駝2.14.1將消息路由到一堆端點,例如啓用/禁用端點:駱駝:如何使用CamelContext

from(...) 
... 
.to(monitoringEndpointId, broadcastEndpointId); 

我要動態地啓用/禁用這些端點/路線在運行期間。到目前爲止,我已經嘗試過使用CamelContextstopRoutesuspendRoute方法,例如:

camel.suspendRoute(broadcastEndpointId) 

但是這會導致以下異常:

An unknown exception occurred: 
org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: Endpoint[direct://broadcast]. Exchange[JmsMessage[JmsMessageID: ID:NB137-38323-1460630272896-5:1:1:1:1356]] 
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:47) 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:120) 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:416) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:105) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:87) 
    at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:103) 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:685) 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:623) 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:591) 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308) 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:246) 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1142) 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134) 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:722) 

所以這實際工作,但日誌充滿了這些例外。有沒有更好的方法來實現我想要的?

+0

你可以配置你的路線是動態:http://camel.apache.org/content-based-router.html –

回答

2

給Router ID是你的路線 -

from("activemq:queue:test") 
.routeId("myrouteid") 
.to("file:///hello"); 

然後你可以使用暫停和使用駱駝情況下恢復航線 -

camelContext.suspendRoute("myrouteid") or camelContext.resumeRoute("myrouteid") 

欲瞭解更多信息,請通過http://camel.apache.org/lifecycle.html

+0

'#suspendRoute()'正是我試過的,這就是我得到'DirectConsumerNotAvailableException'的原因。有沒有任何選項可以忽略/吞下該異常而不會失去它的目的? –

+0

suspendRoute用於暫停完整路線。如果您想要執行動態路由,請轉至收件人列表EIP或動態路由器EIP。 [收件人列表](http://camel.apache.org/recipient-list.html),[動態路由器](http://camel.apache.org/dynamic-router.html) –

0

一種方法可能是使用過濾器。然後,「開關」打開和關閉使用屬性端點:如下圖所示

<filter> 
     <simple>${properties:endpoint1.isEnabled}</simple> 
     <to uri="direct:endpoint1"/> 
    </filter>