2013-10-07 2 views
0

Я пытаюсь найти, существует ли прямой маршрут на верблюде с помощью блока catch try, как показано ниже. Я ищу предикат, чтобы проверить, существует ли маршрут на верблюде или нет. Я не мог найти ничего, что непосредственно дает мне ответ, так что я взял ниже подход,Как проверить, существует ли маршрут верблюда apache?

<doTry> 
    <recipientList> 
     <description>Check if a country specific handler is available</description> 
     <simple>direct:${header.operationName}${body.country}</simple> 
    </recipientList> 
    <doCatch> 
     <exception>org.apache.camel.component.direct.DirectConsumerNotAvailableException</exception> 
     <recipientList> 
      <description>if a country specific handler is not available to to the base</description> 
      <simple>direct:${header.operationName}</simple> 
     </recipientList> 
    </doCatch> 
</doTry> 

Это означает, что я вынужден использовать обработчик исключений в верблюд, чтобы поймать DirectConsumerNotAvailableException, чтобы определить, является ли маршрут существует. Я смотрю на альтернативный подход, при котором мы можем использовать простое выражение, как существует ниже,

<choice> 
    <when> 
     <description>Check if a country specific handler is available</description> 
     <simple>direct:${header.operationName}${body.country} exists</simple> 
     <recipientList> 
      <description>country specific handler is available</description> 
      <simple>direct:${header.operationName}${body.country}</simple> 
     </recipientList> 
    </when> 
    <otherwise> 
     <recipientList> 
      <description>country specific handler is not available then route to generic processing</description> 
      <simple>direct:${header.operationName}</simple> 
     </recipientList> 
    </otherwise> 
</choice> 

Пожалуйста, дайте мне знать, если что-то подобное может быть достигнуто с помощью некоторых других средств.

ответ

1

Как верблюд 2.11.x, простое выражение имеет новую переменную camelContext, которая может быть использована для оценки, если маршрут существует camelContext.hasEndpoint.

<choice> 
    <when> 
     <description>Check if a country specific handler is available</description> 
     <simple>${camelContext.hasEndpoint(direct:${header.operationName}${body[0].country})} != null</simple> 
     <recipientList> 
      <description>country specific handler is available</description> 
      <simple>direct:${header.operationName}${body.country}</simple> 
     </recipientList> 
    </when> 
    <otherwise> 
     <recipientList> 
      <description>country specific handler is not available then route to generic processing</description> 
      <simple>direct:${header.operationName}</simple> 
     </recipientList> 
    </otherwise> 
</choice> 

Для тех, кто использует более раннюю версию апача-верблюд, как 2.10.x, вы можете использовать контекст верблюда, чтобы проверить, если маршрут существует через объект обмена и его динамического маршрутизатор

информации о маршруте,

<dynamicRouter> 
    <method ref="dynamicRouterService" method="route"/> 
</dynamicRouter> 

Динамический маршрутизатор,

public class DynamicRouterService { 
    public String route(@Header("operationName") String operationName, @Properties Map<String, Object> properties, Exchange exchange, Country body) { 
     //needed to end the iterative routing calls 
     if (Boolean.valueOf((String)properties.get("SERVICE_INVOKED"))) { 
      return null; 
     } 

     //indicate that the route has been invoked 
     properties.put("SERVICE_INVOKED", "true"); 

     return this.orchestrateRoute(exchange, operationName, body.getcountry()); 
    } 
    private String orchestrateRoute(Exchange exchange, String operationName, String country) { 
     String uriBaseString = "direct:" + operationName; 
     String uriCountryString = uriBaseString + country; 
     Endpoint endpoint = exchange.getContext().hasEndpoint(uriCountryString); 
     if (endpoint != null) { 
      return uriCountryString; 
     } else { 
      return uriBaseString; 
     } 
    } 
} 

Спасибо Клаусу за указание на контекст верблюда

0

Смотрите эту справку о динамической < к> http://camel.apache.org/how-do-i-use-dynamic-uri-in-to.html

Вы можете использовать метод на компоненте, чтобы вычислить конечную точку. И есть API на CamelContext, чтобы проверить, существует ли маршрут/конечная точка.

+0

Я отредактировал вопрос для использования recipientList –

Смежные вопросы