Чтобы создать политику маршрутизации, необходимо реализовать интерфейс RoutePolicy или использовать класс org.apache.camel.support.RoutePolicySupport, предоставляемый Camel для удобства. Таким образом, ваш класс политики должен быть как
class MyRoutePolicy extends RoutePolicySupport{...}
Как вы сказали в своем описании, onExchangeBegin
не будет работать в случае JMS, поскольку оно будет использовать ваше сообщение, поэтому сообщение будет потеряно.
Один способ, который, как мне кажется, может работать, - отключить / включить соответствующий маршрут, который прослушивает очередь JMS .
Итак, вы можете создать новый маршрут, начиная с таймера, скажем, каждые 10 секунд, который будет выполнять запрос к БД, который вы хотите. На этом маршруте вы примените свою политику и будете использовать onExchangeDone
. Таким образом, если результат в порядке, включите маршрут JMS или отключите его. Примерно так:
public void onExchangeDone(Route route, Exchange exchange) {
//check the result of the query
... exchange.getIn().getBody() ...
// If result is ok (enable JMS route)
CamelContext context = exchange.getContext();
if(ok){
try {
context.startRoute("JMSRoute");
} catch (Exception e) {
getExceptionHandler().handleException("Exception occured during staring route ", e);
}
}
// If result is not ok (disable JMS route)
else{
try {
context.getInflightRepository().remove(exchange, "JMSRoute");
context.stopRoute("JMSRoute");
} catch (Exception e) {
getExceptionHandler().handleException("Exception occured during stoping route ", e);
}
}
}
Если вы хотите добавить одну и ту же политику маршрутов во многие маршруты, вы можете просто добавить routePolicyRef (XML DSL) или routePolicy (Java DSL) в свои маршруты. Например
<bean id="myRoutePolicy" class="com.xxx.MyRoutePolicy"/>
<route id="route1" routePolicyRef="myRoutePolicy"> ... </route>
<route id="route2" routePolicyRef="myRoutePolicy"> ... </route>
<route id="route3" routePolicyRef="myRoutePolicy"> ... </route>
Или используйте RoutePolicyFactory, см. Подробнее в https://camel.apache.org/routepolicy.html section Использование RoutePolicyFactory .