java 7中的递归反应
我正在检查数十亿条包含大量URL的记录。所以我想检查每个url是否有效。然后,在搜索特定url时,它会显示在我的应用程序中。因此,运行一个用于递归检查URL的作业。现在我使用递归反应来解决这个问题。这条路对吗?。请给我一些有价值的建议 请查找下面的代码java 7中的递归反应,java,multithreading,Java,Multithreading,我正在检查数十亿条包含大量URL的记录。所以我想检查每个url是否有效。然后,在搜索特定url时,它会显示在我的应用程序中。因此,运行一个用于递归检查URL的作业。现在我使用递归反应来解决这个问题。这条路对吗?。请给我一些有价值的建议 请查找下面的代码 public class JobsRecurssiveAction extends RecursiveAction { /** * */ private static final long serialVersionUID =
public class JobsRecurssiveAction extends RecursiveAction {
/**
*
*/
private static final long serialVersionUID = 1L;
private final String[] domainsList;
private final Integer low;
private final Integer high;
private static final int THRESHOLD = 5000;
public JobsRecurssiveAction(String[] domainsList, int low, int high) {
super();
this.domainsList = domainsList;
this.low = low;
this.high= high;
}
@Override
protected void compute() {
if (high - low < THRESHOLD) {
ObjectMapper mapper = null;
for (int i = low; i < high; ++i){
mapper = new ObjectMapper();
DomainList domainList = null;
try {
domainList = mapper.readValue(cassandraService.getRedisValue(domainsList[i]), DomainList.class);
cassandraService.deleteKey(domainsList[i]);
int totalResources = domainList.getResourceCount();
int totalCheckedResources = domainList.getTotalChecked();
if(totalResources == totalCheckedResources){
cassandraService.resetDomainList(domainList);
}
cassandraService.stautsCheckerUrl(domainList);
logger.info("domainList Domain :{} :: resourceCount:{}",domainList.getDomainName(),domainList.getResourceCount());
} catch (Exception ex ) {
ex.printStackTrace();
}
}
} else {
int mid = (low + high) >>> 1;
invokeAll(new JobsRecurssiveAction(domainsList, low, mid), new JobsRecurssiveAction(domainsList, mid, high));
}
}
}
公共类作业递归动作扩展递归动作{
/**
*
*/
私有静态最终长serialVersionUID=1L;
私有最终字符串[]域列表;
私有最终整数低;
私人最终整数高;
私有静态最终整数阈值=5000;
public JobsRecursiveAction(字符串[]域列表,整数低位,整数高位){
超级();
this.domainsList=domainsList;
这个.低=低;
这个。高=高;
}
@凌驾
受保护的void compute(){
if(高-低<阈值){
ObjectMapper映射器=null;
对于(int i=低;i<高;++i){
映射器=新的ObjectMapper();
DomainList DomainList=null;
试一试{
domainList=mapper.readValue(cassandraService.getRedisValue(domainsList[i]),domainList.class);
deleteKey(域名列表[i]);
int totalResources=domainList.getResourceCount();
int totalCheckedResources=domainList.getTotalChecked();
if(totalResources==totalCheckedResources){
cassandraService.resetDomainList(domainList);
}
cassandraService.statscheckerurl(域名列表);
info(“domainList域:{}::resourceCount:{}”,domainList.getDomainName(),domainList.getResourceCount());
}捕获(例外情况除外){
例如printStackTrace();
}
}
}否则{
int mid=(低+高)>>>1;
调用所有(新作业递归动作(domainsList,low,mid),新作业递归动作(domainsList,mid,high));
}
}
}
您可以使用Fork/Join框架,它将帮助您实现递归方法。它设计用于可以递归地分解为多个任务的任务
检查:-
如果没有更多信息,我就说不出如何帮助。一些代码可能会有所帮助。invokeAll()向框架提交新请求。您需要做的是使用fork()对当前请求进行分段。遵循JavadocforForkJoinPool中的示例。例如左、右分割。left.fork()right.join()。我正在计算方法中添加这些行。正确吗?整数中间值=(低+高)>>>1;JobsRecursiveAction left=新JobsRecursiveAction(域列表、低、中、resourceCassandraService);JobsRecursiveAction right=新的JobsRecursiveAction(域列表、中等、高、resourceCassandraService);调用全部(左、右);对现在做左。fork();对。compute();左。join();请按照下面的例子来做。非常感谢你。。。无需添加invokeAll(左、右)???