我正在使用camel从.csv文件中读取一些记录,用bindy转换它们并将它们保存在db中。但是,当出现错误时(例如取消显示或保留文件中的行时),我希望停止处理文件并将其移动到其他目录。我的路线如下,我使用的是SpringBootCamel3.7版本
onException(Exception.class)
.handled(true)
.log(LoggingLevel.INFO, "${file:name}")
.log("IOException occurred due: ${exception.message}")
.useOriginalMessage()
.toD("file://".concat(targetErrorLocation).concat("/${file:name}"))
.end();
from(buildPathUrl())
.transacted()
.log(LoggingLevel.INFO, "${file:name}")
.choice()
.when(header("CamelFileName").contains("ORDER"))
.log(LoggingLevel.INFO, "Order file")
.to("direct:orderRoute")
.when(header("CamelFileName").contains("TRANSACTIONS"))
.log(LoggingLevel.INFO, "Transaction file")
.to("direct:transactionRoute")
.when(header("CamelFileName").contains("BATCH"))
.log(LoggingLevel.INFO, "Shipment batch file")
.to("direct:shipBatchRoute")
.otherwise()
.log(LoggingLevel.INFO, "Shipment file")
.to("direct:shipmentRoute");
from("direct:orderRoute")
.log(LoggingLevel.INFO, "${body}")
.unmarshal(orderCsvDataFormat)
.log(LoggingLevel.INFO, "${file:name}")
.split(body())
.streaming()
.shareUnitOfWork()
.log(LoggingLevel.INFO, "${body}")
.to("bean:ordersService?method=persistOrder")
.end();
private String buildPathUrl() {
StringBuilder stringBuilder = new StringBuilder("file://");
stringBuilder.append(sourceLocation)
.append("?move=")
.append(targetLocation)
.append("/")
.append("${file:name}")
/* .append(AMPERSAND)
.append("bridgeErrorHandler=true")*/
.append(AMPERSAND)
.append("moveFailed=error/${file:name}")
/*.append(AMPERSAND)
.append("delete=true")*/;
return stringBuilder.toString();
}
到目前为止,当发生异常时,处理停止,但文件不会移动到错误目录,而是移动到已成功处理的文件所在的目录?如果有任何帮助,我将不胜感激。提前谢谢。
1条答案
按热度按时间dw1jzc5e1#
你试过删除你的错误处理程序吗?
文件使用者选项
move
以及moveFailed
你应该做你想做的。当文件使用者接收到异常时,它会将文件移动到
moveFailed
位置,否则将移动到标准位置move
位置。看看你的路线,这应该行得通。
direct
路由是同步的内部调用,因此异常会跨路由传播。但是,错误处理程序会捕获任何异常(
Exception.class
)同时也处理它们(handled(true)
).因此,文件使用者不再接收异常。它假定处理成功并将文件移动到标准
move
位置。