gpt4 book ai didi

Java ExecutorService 获取所有任务的反馈

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:28 26 4
gpt4 key购买 nike

我想向多个 (500,1000,2000) 用户发送电子邮件。

我已经使用 ExecutorService 完成了该操作。

但现在我想从总记录中收集发送成功的邮件数和发送失败的邮件数。

我是这样实现的:

int startValue=0;
int endValue=0;
List userEmailList = getListFromDB();
ExecutorService e = Executors.newFixedThreadPool(10);
Collection c = new ArrayList();

while (someflag)
{
// in MyTask class I am sending email to users.
c.add(new MyTask(startValue, endValue,userEmailList));
}
e.invokeAll(c); //Here I am calling invokeall .
pool.shutdown();


public class MyTask implements Callable<String> {
MyTask(startValue, endValue,userEmailList){
}

public String call(){
//e.g. batch 1 will have - startValue => endValue = 0 -100
//e.g. batch 2 will have - startValue => endValue = 101 -199
//e.g. batch 3 will have - startValue => endValue = 200 -299
//e.g. batch 4 will have - startValue => endValue = 300 -399
//e.g. batch 5 will have - startValue => endValue = 400 - 499

for(int i=startValue;i<endValue;i++){
sendEmailToUser(userEmailList.get(i)){
}
}

但是 future.get() 返回我完成的任务数。所以根据上面的代码,它将返回 5 个任务。

但我希望输出失败的电子邮件数和成功发送的电子邮件数。

例如,如果有 500 个电子邮件用户,如果 20 个失败,则输出应该是 480 个成功和 20 个失败。

但是使用上面的代码我只得到 no of task 。即5个任务

谁能告诉我如何从所有并发任务中获得反馈(不是已完成的任务数)。

最佳答案

你的 MyTask返回 String (实现 Callable<String> ),这对您的情况没有多大意义。您可以自由返回您想要的任何其他类型。不幸的是,您需要一些简单的 POJO 来包含结果,例如:

public class Result {

private final int successCount;
private final int failureCount;

public Result(int successCount, int failureCount) {
this.successCount = successCount;
this.failureCount = failureCount;
}

}

并在给定批处理完成后返回它(实现 Callable<Result> )。当然是你的MyTask然后将必须跟踪有多少电子邮件失败并返回围绕 Result 的正确值.

不过,我看到有几种方法可以改进您的代码。首先不是传递 startValue, endValue范围为 MyTask只需使用 userEmailList.subList(startValue, endValue) - 这将大大简化您的代码:

new MyTask(userEmailList.subList(startValue, endValue));
//...

public class MyTask implements Callable<Result> {
MyTask(userEmailList){
}

public Result call(){
for(email: userEmailList) {
sendEmailToUser(email);
//collect results here
}
return new Result(...);
}
}

另一方面,创建 MyTask 并没有错只发送一封电子邮件。这不是在给定批处理中汇总计数,您只需检查一项任务(一封电子邮件)的结果 - 没有结果或异常(或单个 Boolean )。它更容易,不应该更慢。

关于Java ExecutorService 获取所有任务的反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13124905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com