DB故障的异常处理未按预期工作



我正在开发一个小型camel应用程序,它从文件中读取数据并将数据写入数据库。它运行良好。现在,我想在其中添加DB故障转移功能,这意味着在将数据写入数据库时,如果数据库由于某些网络故障而不可用(或有人关闭了数据库),我的应用程序应该以1000ms的间隔重试5次,如果到那时DB已经启动或(重新建立网络连接)应用程序应该继续,或者如果到那时数据库还没有恢复,应用程序应该关闭。现在,我最初尝试了camel的重新传递功能,但这里的问题是,即使数据库在5次重试内恢复,现有的数据库连接也已经失效,因此应用程序无法继续使用它。因此,我尝试编写自己的类来处理这个可恢复的错误。

RouteBuilder看起来像:

public class MyRouteBuilder extends SpringRouteBuilder {
@Override
public void configure() throws Exception {
registerExceptionHandler();
addRoute();
}
private addRoute() {
from("file:/DHBSI/data/input?fileName=whdh90151.csv")
.id("MyRoute") 
.policy(transactionRequiredPolicy)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
...
StudentJPAEntity student = new StudentJPAEntity ();
...
studentJPARepository.save(student);
}
}).end();
}
private registerExceptionHandler() {
onException(JDBCConnectionException.class, 
SocketException.class)
.process(new RecoverableExceptionHandlingStrategy());
onException(Exception.class)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.exit(-1);
}
});
}
}

transactionRequiredPolicy使用与studentJPARepository.save(student);相同的JPATransactionManager

假设RecoverableExceptionHandlingStrategy看起来像:

public class RecoverableExceptionHandlingStrategy implements Processor {
static int count = 0; 
static int maxCount = 5;
@Override
public void process(Exchange exchange) throws Exception {
count++;
if(count<=maxCount) {
Thread.sleep(1000);
} else {
System.exit(-1);
}
}
}

现在,在将调试点保持在studentJPARepository.save(student);的同时,我已经关闭了DB服务。在我发布调试点后,应用程序将获得SocketException,并如预期的那样,转到RecoverableExceptionHandlingStrategyprocess方法。但是,然后路由就停止了,什么也没有发生(没有第二次到达studentJPARepository.save(student);的调试点或RecoverableExceptionHandlingStrategyprocess方法内。两个路由都没有关闭)。看起来,由于骆驼无法正常回滚交换,它只是停在那里。有人能告诉我到底出了什么问题,以及我如何才能让它发挥作用吗?

我在日志中得到以下错误:

[20200-06-09 15:05:51183]-[错误]-[HBSI/data/input]-[org.springframework.transaction.support.TransactionTemplate.rollbackOnException():171]-回滚异常覆盖的应用程序异常org.apache.camel.RuntimeCamelException:javax.persistence.PersistenceException:org.hibernate.exception.JDBConnectionException:无法提取结果集网址:org.apache.cocamel.RuntimeCamelException.wrapaRuntimeCamelException(RuntimeCamel Exception.java:52)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler$1.doInTransactionWithoutResult(TransactionErrorHandler.java:196)位于org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithout Result.java:36)网址:org.springframework.transaction.support.TransactionTemplate.execure(TransactionTemplate.java:140)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:182)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:140)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:107)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:116)网址:org.apache.cocamel.producter.CamelInternalProcessor.procedure(CamelInternalProcesser.java:228)网址:org.apache.cocamel.processer.Pipeline.doProcess(Pipeline.java:103)网址:org.apache.cocamel.processer.Pipeline.lambda$process$1(Pipeline.java:87)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$3.run(DefaultReactiveExecutior.java:116)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:185)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutior.java:59)网址:org.apache.cocamel.processer.Pipeline.process(Pipeline.java:87)网址:org.apache.cocamel.producter.CamelInternalProcessor.procedure(CamelInternalProcesser.java:228)网址:org.apache.cocamel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:454)网址:org.apache.cocamel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:223)网址:org.apache.cocamel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:186)网址:org.apache.cocamel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:183)网址:org.apache.cocamel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102)位于java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executitors.java:515)位于java.base/java.util.concurrent.FFutureTask.runAndReset(FutureTask.java:305)位于java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)位于java.base/java.util.concurrent.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.java:1128)位于java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)位于java.base/java.lang.Thread.run(线程.java:834)由以下原因引起:javax.persistence.PersistenceException:org.hubinate.exception.JDBConnectionException:无法提取ResultSet位于org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)位于org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)位于org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)位于org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:794)位于org.hibernate.internal.SessionImpl.merge(SessionImpl.java:770)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位于java.base/java.lang.reflect.Method.ioke(Method.java:566)位于org.springframework.om.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreater.java:314)网址:com.sun.proxy.$Proxy105.merge(未知来源)网址:org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:557)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位于java.base/java.lang.reflect.Method.ioke(Method.java:566)位于org.springframework.data.restore.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:371)位于org.springframework.data.repository.core.support.RepositoryComposition.ioke(RepositoryComposition.java:204)位于org.springframework.data.restore.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.ioke(RepositoryFactorySupport.java:657)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.data.restore.core.support.RepositoryFactorySupport$QueryExecutiorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:621)位于org.springframework.data.restore.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.ioke(RepositoryFactorySupport.java:605)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.data.project.DefaultMethodInvokingMethodInterceptor.ioke(DefaultMethodInvokingMethodInterceptor.java:80)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.transaction.intercept.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)位于org.springframework.transaction.interceptor.TransactionInterceptor.ininvoke(TransactionInterceptor.java:118)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.ioke(PersistenceExceptionTranslationInterceptor.java:139)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.ioke(CrudMethodMetadataPostProcessor.java:178)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.aop.intercept.ExposeInvocationInterceptor.ioke(ExposeInvocation interceptor.java:95)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)网址:org.springframework.aop.framework.JdkDynamicAopProxy.invoke网址:com.sun.proxy.$Proxy123.save(未知来源)网址:com.mumss.dhb.core.audit.impl.DefaultAuditInterfacePersister.persistIncomingAudit(DefaultAuditInterface Persister.java:219)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位于java.base/java.lang.reflect.Method.ioke(Method.java:566)网址:org.apache.cocamel.support.ObjectHelper.invokeMethodSafe(ObjectHelper.java:207)网址:org.apache.cocamel.component.bean.MethodInfo.ioke(MethodInfo.java:421)网址:org.apache.cocamel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:242)网址:org.apache.cocamel.component.bean.MethodInfo$1.product(MethodInfo.java:213)网址:org.apache.cocamel.component.bean.AbstractBeanProcesser.process(AbstractBeanProcessor.java:148)网址:org.apache.cocamel.component.bean.BeanProcesser.process(BeanProcesser.java:55)网址:org.apache.cocamel.processer.errorhandler.RedeliveryErrorHandler$RedeliveryState.run(RedeliveryErrorHandler.java:476)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:185)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor.scheduleSync(DefaultReactiveExecutor.java:75)网址:org.apache.cocamel.spi.ReactiveExecutior.scheduleSync(ReactiveExecutior.java:66)网址:org.apache.cocamel.producter.errorhandler.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:158)网址:org.apache.cocamel.impl.engine.DefaultAsyncProcessorAwaitManager.produce(DefaultAsyncProcessorAwaitManager.java:78)网址:org.apache.cocamel.producter.errorhandler.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:146)网址:org.apache.cocamel.producter.CamelInternalProcessor.procedure(CamelInternalProcesser.java:203)网址:org.apache.cocamel.processer.Pipeline.doProcess(Pipeline.java:103)网址:org.apache.cocamel.processer.Pipeline.lambda$null$2(Pipeline.java:104)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$3.run(DefaultReactiveExecutior.java:116)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:185)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:67)网址:org.apache.cocamel.spi.ReactiveExecution.schedule(ReactiveExecutior.java:32)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecution.callback(DefaultReactiveExecutior.java:100)网址:org.apache.cocamel.producter.CamelInternalProcessorLambda$process$0(CamelInternalProcesser.java:183)网址:org.apache.cocamel.producter.CamelInternalProcessor.procedure(CamelInternalProcesser.java:210)网址:org.apache.cocamel.processer.Pipeline.doProcess(Pipeline.java:103)网址:org.apache.cocamel.processer.Pipeline.lambda$null$2(Pipeline.java:104)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$3.run(DefaultReactiveExecutior.java:116)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:185)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:67)网址:org.apache.cocamel.spi.ReactiveExecution.schedule(ReactiveExecutior.java:32)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecution.callback(DefaultReactiveExecutior.java:100)网址:org.apache.cocamel.producter.CamelInternalProcessorLambda$process$0(CamelInternalProcesser.java:183)网址:org.apache.cocamel.producter.CamelInternalProcessor.procedure(CamelInternalProcesser.java:210)网址:org.apache.cocamel.processer.Pipeline.doProcess(Pipeline.java:103)网址:org.apache.cocamel.processer.Pipeline.lambda$process$0(Pipeline.java:84)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$3.run(DefaultReactiveExecutior.java:116)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:185)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor.scheduleSync(DefaultReactiveExecutor.java:75)网址:org.apache.cocamel.processer.Pipeline.process(Pipeline.java:84)网址:org.apache.cocamel.processer.errorhandler.RedeliveryErrorHandler$RedeliveryState.run(RedeliveryErrorHandler.java:476)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:185)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor.scheduleSync(DefaultReactiveExecutor.java:75)网址:org.apache.cocamel.spi.ReactiveExecutior.scheduleSync(ReactiveExecutior.java:66)网址:org.apache.cocamel.producter.errorhandler.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:158)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.access$301(TransactionErrorHandler.java:44)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler$2.procle(TransactionErrorHandler.java:228)网址:org.apache.cocamel.impl.engine.DefaultAsyncProcessorAwaitManager.produce(DefaultAsyncProcessorAwaitManager.java:78)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.processByErrorHandler(TransactionErrorHandler.java:225)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:103)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:116)网址:org.apache.cocamel.processer.errorhandler.RedeliveryErrorHandler$RedeliveryState.run(RedeliveryErrorHandler.java:476)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:185)网址:org.apache.cocamel.impl.engine.DefaultReactiveExecutor.scheduleSync(DefaultReactiveExecutor.java:75)网址:org.apache.cocamel.spi.ReactiveExecutior.scheduleSync(ReactiveExecutior.java:66)网址:org.apache.cocamel.producter.errorhandler.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:158)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.access$301(TransactionErrorHandler.java:44)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler$2.procle(TransactionErrorHandler.java:228)网址:org.apache.cocamel.impl.engine.DefaultAsyncProcessorAwaitManager.produce(DefaultAsyncProcessorAwaitManager.java:78)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler.processByErrorHandler(TransactionErrorHandler.java:225)网址:org.apache.cocamel.spring.spi.TransactionErrorHandler$1.doInTransactionWithoutResult(TransactionErrorHandler.java:189)…省略了25个常用帧导致原因:org.hubinate.exception.JDBConnectionException:无法提取结果集位于org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversion Delegate.java:112)网址:org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)位于org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:67)在org.hibernate.loader.loader.getResultSet(loader.java:2292)在org.hibernate.loader.loader.executeQueryStatement(loader.java:2050)位于org.hibernate.loader.loader.executeQueryStatement(loader.java:2012)在org.hibernate.loader.loader.doQuery(loader.java:953)位于org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollection(loader.java:354)位于org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollection(loader.java:324)位于org.hibernate.loader.loader.loadEntity(loader.java:2410)位于org.hibernate loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:74)位于org.hibernate loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:63)位于org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersester.java:4396)位于org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersester.java:4386)位于org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:569)位于org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:537)位于org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)位于org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332)位于org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)位于org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)位于org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)位于org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1176)位于org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1165)网址:org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:194)位于org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2776)位于org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2757)位于org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2713)位于org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2757)位于org.hibernate.internal.SessionImpl.get(SessionImpl.java:978)位于org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetailed(DefaultMergeEventLister.java:306)位于org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventLister.java:172)位于org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventLister.java:70)位于org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)位于org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:783)…省略了121个公共帧导致原因:com.microsoft.sqlserver.jdbc.SQLServerException:对等方重置连接:套接字写入错误网址:com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2924)网址:com.microsoft.sqlserver.jdbc.TDSChannel.write(IOBuffer.java:2045)网址:com.microsoft.sqlserver.jdbc.TDSWriter.flush(IOBuffer.java:4146)网址:com.microsoft.sqlserver.jdbc.TDSWriter.writePacket(IOBuffer.java:4048)网址:com.microsoft.sqlserver.jdbc.TDSWriter.endMessage(IOBuffer.java:3185)位于com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:7556)位于com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedSStatement(SQLServerPreparedAtatement.java:592)位于com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedAtatement.java:524)在com.microsoft.sqlserver.jdbc.TDSCommand.exexecute(IOBuffer.java:7194)位于com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2979)位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:248)网址:com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:223)网址:com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedAtatement.java:446)位于org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)…省略了152个公共帧引起原因:java.net.SocketException:对等方重置连接:套接字写入错误位于java.base/java.net.SocketOutputStream.socketWrite0(本机方法)位于java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110)位于java.base/java.net.SocketOutputStream.write(SocketOutputStream.java:150)网址:com.microsoft.sqlserver.jdbc.TDSChannel.write(IOBuffer.java:2040)…省略了164个常用帧[20200-06-09 15:05:51185]-[WARN]-[HBSI/data/input]-[org.apache.cocamel.spring.spi.TransactionErrorHandler.logTransactionRollback():276]-已捕获(ExchangeId:ID-KUNTALC-VM-1591695289643-0-2上的MessageId:ID-KUNTALC-VM-1592695289643-0)的事务回滚(0x32a7c583)重新传递(false):无法回滚JPA事务;嵌套异常为org.hubinate.TransactionException:无法根据JDBC连接回滚[20200-06-09 15:05:51186]-[警告]-[HBSI/data/input]-[org.apache.cocamel.component.file.GenericFileOnCompletion.processStrategyRollback():144]-回滚文件策略:org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy@710f2d72对于文件:GenericFile[C:\DHBSI\data\input\whdh90151.csv][20200-06-09 15:06:06701]-[WARN]-[HBSI/data/input]-[org.hibernate.engineer.jdbc.spi.SqlExceptionHelper.logExceptions():137]-SQL错误:0,SQLState:08S01[20200-06-09 15:06:06702]-[错误]-[HBSI/data/input]-[org.hibernate.engineer.jdbc.spi.SqlExceptionHelper.logExceptions():142]-与主机172.16.31.22端口1433的TCP/IP连接失败。错误:"连接超时。请验证连接属性。确保SQL Server实例在主机上运行并接受端口上的TCP/IP连接。确保到端口的TCP连接未被防火墙阻止。"。[20200-06-09 15:06:06703]-[WARN]-[HBSI/data/input]-[org.apache.cocamel.spi.TransactionErrorHandler.logTransactionRollback():276]-为(ExchangeId:ID-KUNTALC-VM-1591695289643-0-4上的MessageId:ID-KUNTALC-VM-159169289643-0-3)重新传递(false)事务回滚(0x32a7c583):无法打开事务的JPA EntityManager;嵌套异常为org.hubinate.exception.JDBC连接异常:无法获取JDBC连接[20200-06-09 15:06:06704]-[警告]-[HBSI/data/input]-[org.apache.cocamel.component.file.GenericFileOnCompletion.processStrategyRollback():144]-回滚文件策略:org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy@710f2d72对于文件:GenericFile[C:\DHBSI\data\input\whdh90151.csv][20200-06-09 15:06:22218]-[WARN]-[HBSI/data/input]-[org.hibernate.engineer.jdbc.spi.SqlExceptionHelper.logExceptions():137]-SQL错误:0,SQLState:08S01[20200-06-09 15:06:22219]-[错误]-[HBSI/data/input]-[org.hibernate.engineer.jdbc.spi.SqlExceptionHelper.logExceptions():142]-与主机172.16.31.22端口1433的TCP/IP连接失败。错误:"连接超时。请验证连接属性。确保SQL Server实例在主机上运行并接受端口上的TCP/IP连接。确保到端口的TCP连接未被防火墙阻止。"。[20200-06-09 15:06:22220]-[WARN]-[HBSI/data/input]-[org.apache.cocamel.spi.TransactionErrorHandler.logTransactionRollback():276]-为(ExchangeId:ID-KUNTALC-VM-1591695289643-0-6上的MessageId:ID-KUNTALC-VM-159169528964-0-6)重新传递(false)的事务回滚(0x32a7c583):捕获到:无法打开事务的JPA EntityManager;嵌套异常为org.hubinate.exception.JDBC连接异常:无法获取JDBC连接[20-06-09 15:06:22222]-[警告]-[HBSI/data/input]-[org.apache.cocamel.component.file.GenericFileOnCompletion.processStrategyRollback():144]-回滚文件策略:org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy@710f2d72对于文件:GenericFile[C:\DHBSI\data\input\whdh90151.csv][20200-06-09 15:06:37734]-[WARN]-[HBSI/data/input]-[org.hibernate.engineer.jdbc.spi.SqlExceptionHelper.logExceptions():137]-SQL错误:0,SQLState:08S01[20200-06-09 15:06:37735]-[错误]-[HBSI/data/input]-[org.hibernate.engineer.jdbc.spi.SqlExceptionHelper.logExceptions():142]-与主机172.16.31.22端口1433的TCP/IP连接失败。错误:"连接超时。请验证连接属性。确保SQL Server实例在主机上运行并接受端口上的TCP/IP连接。确保到端口的TCP连接未被防火墙阻止。"。[20200-06-09 15:06:37736]-[WARN]-[HBSI/data/input]-[org.apache.cocamel.spi.TransactionErrorHandler.logTransactionRollback():276]-为(ExchangeId:ID-KUNTALC-VM-1591695289643-0-8上的MessageId:ID-KUNTALC-VM-15926952896430-7)重新传递(false)事务回滚(0x32a7c583):无法打开事务的JPA EntityManager;嵌套异常为org.hubinate.exception.JDBC连接异常:无法获取JDBC连接[20200-06-09 15:06:37737]-[警告]-[HBSI/data/input]-[org.apache.cocamel.component.file.GenericFileOnCompletion.processStrategyRollback():144]-回滚文件策略:org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy@710f2d72对于文件:GenericFile[C:\DHBSI\data\input\whdh90151.csv][20200-06-09 15:06:53249]-[WARN]-[HBSI/data/input]-[org.hibernate.engineer.jdbc.spi.SqlExceptionHelper.logExceptions():137]-SQL错误:0,SQL状态:08S01[20200-06-09 15:06:53250]-[错误]-[HBSI/data/input]-[org.hibernate.engineer.jdbc.spi.SqlExceptionHelper.logExceptions():142]-与主机172.16.31.22端口1433的TCP/IP连接失败。错误:"连接超时。请验证连接属性。确保SQL Server实例在主机上运行并接受端口上的TCP/IP连接。确保到端口的TCP连接未被防火墙阻止。"。[20200-06-09 15:06:53250]-[WARN]-[HBSI/data/input]-[org.apache.cocamel.spi.TransactionErrorHandler.logTransactionRollback():276]-已捕获(ExchangeId:ID-KUNTALC-VM-1591695289643-0-10上的MessageId:ID-KUNTALC-VM-1591695289-643-0-9)的事务回滚(0x32a7c583)重新传递(false):无法打开事务的JPA EntityManager;嵌套异常为org.hubinate.exception.JDBC连接异常:无法获取JDBC连接[20200-06-09 15:06:53251]-[警告]-[HBSI/data/input]-[org.apache.cocamel.component.file.GenericFileOnCompletion.processStrategyRollback():144]-回滚文件策略:org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy@710f2d72对于文件:GenericFile[C:\DHBSI\data\input\whdh90151.csv]

如果您没有在onException()子句中指定maximumRediveries的默认值为0。这就是为什么交易所没有重新交割的原因。由于交换没有重新交付,因此RecoverableExceptionHandlingStrategy中的计数器没有增加,应用程序没有关闭。

为了实现再交付,例外条款应修改如下

onException(...)
.maximumRedeliveries(5)
.logRetryAttempted(true)                    ---> This will log the retries
.retryAttemptedLogLevel(LoggingLevel.INFO)  ---> at INFO level
.handled(true)
.process(<---- shutdown code ---->)

Raju Parashar,

首先,我的意图不是使用骆驼的重新交付功能(请仔细阅读上面的描述,找出原因)。因此,我省略了最大重新交付部分。其次,如果我在onException()子句中不使用maximumRedeliverys,那么count将不会增加,这句话是不正确的。我也尝试过使用SocketException以外的异常(如onException子句中的InvalidInputData异常,其中回滚完全发生),尽管我没有提到maximumRediveries子句,但计数会按预期增加。我想,问题是,在我的情况下,由于DB已经关闭,在回滚(这是异常处理的一部分)时,骆驼会出现异常,并在那里等待资源(DB)恢复。

最新更新