好的,这将有点长而复杂,我希望这里有一些橡皮筋。 我有这个代码,实际上有点复杂,但我认为我做了一个合理的工作来简化它:
private Result getResult(Request request, RequestType type) {
final String date = request.getData(); // marker 1
final DataSource jdbcDataSource = getDataSource();
final JdbcOperations jdbcTemplate = newJdbcOperations(jdbcDataSource);
final TransactionTemplate transactionTemplate = createTransactionTemplate(jdbcDataSource);
Supplier<Integer> createResult = () -> transactionTemplate.execute(transactionStatus -> {
List<Map<String, Object>> rs = jdbcTemplate.queryForList("SELECT * FROM table");
if (rs.size() > 0) {
return ((Number) rs.get(0).get("count")).intValue();
} else {
log.info(request + " not found in table");
}
if (type == TYPE1) {
//...
} else {
throw new RuntimeException("unexpected type:" + type); // marker2
}
return 0;
});
int retryCount = 0;
while (retryCount < 5) {
try {
totalCount = createResult.get();
break;
} catch (DuplicateKeyException | DeadlockLoserDataAccessException e) {
// log
}
retryCount++;
}
}
这很好,除了今天app服务器进入停止工作的状态。该方法进入,过去行&#34; marker1&#34;所以我们知道请求不是null,然后继续记录&#34; null表中未找到&#34;建议请求变为null然后抛出runtimeException&#34; marker2&#34;因为类型也变成了null。 我不想这么说,但这真的只是闻起来像JVM中的一个错误,但这真的应该是最后一个考虑,所以我希望你,亲爱的橡皮鸭,会有一些想法。