我正在开发一个小型的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);
}
}
}
日志中出现以下错误:
如果不在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