我有一个必须从服务器删除文件然后从数据库删除文件的要求。
我正在使用阿帕奇骆驼和弹簧靴。
我在Apache Camel Route中使用transacted()方法,但是如果DB中有任何错误,则markRollbackOnly()方法将删除文件。

我的路线看起来像

from(RouterConstants.DIRECT_DELETE_FILE)
    .onException(Exception.class)
    .handled(true)
    .setBody(simple(RouterConstants.EXCEPTION_PROPERTY))
    .to(RouterConstants.BEAN_GLOBAL_EXCEPTION_HANDLER_METHOD_GENERIC_EXCEPTION_HANDLER)
    .to(RouterConstants.ROUTE_WRITE_AS_JSON)
    .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(HttpStatus.SC_BAD_REQUEST))
    .setHeader(Exchange.CONTENT_TYPE, constant(MediaType.APPLICATION_JSON_VALUE))
    .markRollbackOnly()
    .end()
.routeId("directRouteDeleteFileId")
.transacted()
    //1. sftp delete
    .to(RouterConstants.DIRECT_ROUTE_SFTP)
    //2. db delete
    .setBody(header("id"))
    .convertBodyTo(Long.class).throwException(new RuntimeException())
    .to(RouterConstants.ROUTE_DELETE_FILE_FROM_DB);


当我使用rollback()时,它确实停止了从服务器中删除文件的操作,但没有向最终用户提供正确的消息并抛出org.apache.camel.RuntimeCamelException: org.apache.camel.RollbackExchangeException

关于如何解决此问题的任何想法?

最佳答案

我通过更改执行顺序来使其工作。使用markRollbackOnly()方法可以删除数据库。使用markRollbackOnly()时,SFTP不会回滚文件删除,但是数据库删除会回滚文件删除。

关于java - markRollbackOnly()在 Camel 2.0中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59049898/

10-14 07:37