当前位置: 首页 > 知识库问答 >
问题:

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

邵研
2023-03-14

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

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使用的JPATransactionManager与用于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);
          }
        }
    }

日志中出现以下错误:

共有1个答案

张嘉
2023-03-14

如果不在onException()子句中指定maximumRedeliveries的默认值为0。这就是为什么交换没有被重新交付的原因。由于交换没有被重新传递,因此RecoverableExceptionHandlingStrategy中的计数器没有被递增,应用程序也没有关闭。

为实现重新交付,应将例外条款修改如下

onException(...)
.maximumRedeliveries(5)
.logRetryAttempted(true)                    ---> This will log the retries
.retryAttemptedLogLevel(LoggingLevel.INFO)  ---> at INFO level
.handled(true)
.process(<---- shutdown code ---->)
 类似资料:
  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括:

  • 我正在和selenium一起工作,刮一些数据。 有一个按钮在页面上,我正在点击说“Custom_Cols”。这个按钮为我打开了一个窗口,我可以在那里选择我的列。 我的问题是为什么新窗口上的元素不可见,即使我正在等待元素的可见。补充一下,我已经尝试增加延迟时间,但我还是会偶尔出现这个错误。 我的密码在这里

  • 我正在使用Jooq将CSV数据填充到我的数据库中。如果我提供“字符串值”而不是Int,它不会将值输入数据库,但同时也不会抛出错误。我如何知道上传是否失败。如何处理这些类型的异常。此外,如果我尝试在int列中给出字符串,有没有办法检查/抛出警告。 版本:3.8.x