我必须每个月运行一次150,000多件物品,并且所有发生的事情大约需要3到4个小时,这很好。问题是,有时某些数据会抛出一个exception
(当然在第一次测试运行中没有发生,直到类似148,000项)。我只是将它设置为逻辑上忽略异常(当然记录它),但我意识到我并不总是想忽略异常。
我写了一个简单的异常处理程序,它处理不同类型的异常以及如果发生某种类型该怎么办;例如,如果我得到SQLException
我中止了该过程,但在NullPointerException
上我继续,因为这通常是数据的问题。我还跟踪了例外总数,如果达到预设限制,我也会终止这个过程。
所以我的问题是:我将构建更多这些程序来处理Collections
中不同类型的数据。是否有一个库来处理集合和处理不同类型的异常?
以下是我根据评论请求添加的一些代码。如果你在想自己,“嗯,这就是你想做的,问题是什么?”,你是对的。但我想知道是否有一个存在的库让我注册异常以及遇到时要做什么。例如,我想在A或D类型的异常发生时停止处理,B发生时继续处理,除非它发生X次,当C发生时继续,除非它发生Y次,并完全忽略E.主要是因为我知道我有不同的数据集和collections
我和其他人将来会合作并希望使用一致的东西。
基本代码段:
exeptionLimit = 50;
exceptionCount = 0;
for (long id : MyCollection)
{
try
{
//All these methods throw the exceptions
Item item = getItemById(id);
NewData data = ProcessItem(item);
SaveNewData(data);
}
catch (SQLException e)
{
//log
throw e; //I want this to cause the process to fail
}
catch (NullPointerException e)
{
//log
exceptionCount++;
if (exceptionCount >= exceptionLimit) throw new Exception("Limit hit!");
}
}
答案 0 :(得分:3)
Collection
表示数据的逻辑分组和对数据进行操作的一组函数
您可以找到提供高级数据结构和性能的库,而不是JDK
中提供的库,但如果我正确理解您的问题,您需要了解您想要构建的逻辑 该集合。
我的意思是,不同类型的异常之间的分离以及它们是否被记录等等都是你的应用程序逻辑的一部分。
它不是与集合框架相关的东西。数据
答案 1 :(得分:2)
您可以查看Failsafe。它以一种富有表现力和简洁的方式处理您的场景:
RetryPolicy retryPolicy = new RetryPolicy()
.abortOn(SQLException.class)
.retryOn(NullPointerException.class)
.withMaxRetries(50);
Connection connection = Failsafe.with(retryPolicy).run(() -> {
Item item = getItemById(id);
NewData data = ProcessItem(item);
SaveNewData(data);
});
不会变得更简单。
答案 2 :(得分:1)
我最后拼凑了我自己的解决方案,但最近偶然发现了异步重试模式:
https://github.com/nurkiewicz/async-retry
关于它的好文章:
http://nurkiewicz.blogspot.com/2013/07/asynchronous-retry-pattern.html