2016-01-07 4 views
1

преобразовани последовательности Рассмотрим следующий верблюд маршрут:распространения ошибки через Camel

from("file://....?moveFailed=/failed") 
    .resequence(c).stream() 
    .throwException(new Exception()); 

Я бы ожидать, что файл потребитель будет переместить обработанный файл в «отказавший /» папку, так как произошло исключение. Это не тот случай.

Поскольку StreamResequencer использует новый поток для доставки переупорядоченных файлов (см. Stacktrace), исключение никогда не распространяется на пользователя файла.

... 
at org.apache.camel.processor.StreamResequencer$Delivery.run(StreamResequencer.java:262) 

Я был бы признателен за помощь или обратную связь в том, как обеспечить, чтобы ошибки приводили к неудачному перемещению файла?

  • Вариант 1: Распространение исключения для первоначального потребителя. Тем не менее, я не знаю, как бы это достичь.
  • Вариант 2: Напишите пользовательское '.onException (...)', которое перемещает файл вручную, а не полагаясь на пользователя файла, чтобы сделать это.
  • Возможно, есть еще один, более правильный способ настроить этот маршрут, о котором я не думал?
+1

Это дизайн как работает преобразовань последовательность, вам нужно будет использовать Нооп = True на файловой Урии, и переместить файл самостоятельно после преобразовани последовательности. И, может быть, просто лучше написать собственный сортировщик файлов или фильтр файлов, который принимает файл в нужном порядке. –

+0

@ClausIbsen. Первоначально мы использовали сортировщик файлов, но из-за количества файлов эта сортировка не могла идти в ногу. Мы должны были убедиться, что заказ был правильным для каждого файла, поэтому мы сортировали каждый раз, когда мы брали один файл. Приоритетная очередь (resequencer) является лучшим вариантом в этом случае. --- Я последую вашим советам и перейду к варианту 2, при необходимости перемещая файл. Большое спасибо! – user2890248

ответ

0

Мы пошли с вариантом 2, поскольку вариант 1 невозможен. Оказалось, что он работает неплохо, и код все еще ясен. Мы переработали маршрут следующим образом:

onException(Exception.class) 
    .handled(true) 
    .to("direct:moveFile"); 

from("file://....") 
    .setProperty("originalContent", body()) 
    .resequence(c).stream() 
    .to("businessLogicHere") 
    .to("direct:moveFile"); 

from("direct:moveFile") 
    .choice() 
    .when(property(Exchange.EXCEPTION_CAUGHT).isNull()) 
     .setBody(property("originalContent") 
     .setHeader(Exchange.FILE_NAME, simple("success/${file:onlyname}") 
     .to("file://...") 
    .otherwise() 
     .setBody(property("originalContent") 
     .setHeader(Exchange.FILE_NAME, simple("failure/${file:onlyname}") 
     .to("file://...") 
Смежные вопросы