gpt4 book ai didi

java - ExecutorService 类型中的方法 invokeAll 不适用于参数错误

转载 作者:行者123 更新时间:2023-12-02 06:45:52 28 4
gpt4 key购买 nike

我正在开发一个项目,其中我将拥有不同的 bundle 。让我们举个例子,假设我有 5 个 Bundle,每个 Bundle 都有一个方法名称 process

以下是我应该做的事情-

  1. 我需要使用多线程代码并行调用所有这 5 个 Bundles process 方法,然后写入数据库。我不确定这样做的正确方法是什么?我应该有五个线程吗?每个包一个线程?但是在这种情况下会发生什么,假设如果我有 50 个包,那么我将有 50 个线程?
  2. 而且,我也想要超时功能。如果任何 bundle 花费的时间超过了我们设置的阈值,那么它应该超时并记录为错误,表明该 bundle 花费了很多时间。

我所做的以下尝试很可能是有缺陷的,并且错误处理绝不是完整的。但不知何故,我总是在这一行遇到错误-

pool.invokeAll

错误是-

The method invokeAll(Collection<? extends Callable<T>>, long, TimeUnit) in the type ExecutorService is not applicable for the arguments (List<ModelFramework.ProcessBundleHolderEntry>, int, TimeUnit)

下面是我的方法,它将以多线程方式调用所有包的处理方法

public void processEvents(final Map<String, Object> eventData) {
ExecutorService pool = Executors.newFixedThreadPool(5);
List<ProcessBundleHolderEntry> entries = new ArrayList<ProcessBundleHolderEntry>();

Map<String, String> outputs = (Map<String, String>)eventData.get(BConstants.EVENT_HOLDER);

for (BundleRegistration.BundlesHolderEntry entry : BundleRegistration.getInstance()) {
ProcessBundleHolderEntry processBundleHolderEntry = new ProcessBundleHolderEntry(entry, outputs);
entries.add(processBundleHolderEntry);
}

try {

// somehow I always get an error at invokeAll method. Is there anything wrong?
List<Future<Object>> futures = pool.invokeAll(entries, 30, TimeUnit.SECONDS);
for (int i = 0; i < futures.size(); i++) {
// This works since the list of future objects are in the
// same sequential order as the list of entries
Future<Object> future = futures.get(i);
ProcessBundleHolderEntry entry = entries.get(i);
if (!future.isDone()) {
// log error for this entry
}
}
} catch (InterruptedException e) {
// handle this exception!
}
}

其次,我在 ModelFramework 类中添加了 Callable 的实现

public class ProcessBundleHolderEntry implements Callable {
private BundleRegistration.BundlesHolderEntry entry;
private Map<String, String> outputs;

public ProcessBundleHolderEntry(BundleRegistration.BundlesHolderEntry entry, Map<String, String> outputs) {
this.entry = entry;
this.outputs = outputs;
}

public Object call() throws Exception {
final Map<String, String> response = entry.getPlugin().process(outputs);
// write to the database.
System.out.println(response);
return response;
}
}

任何人都可以帮助我解决我遇到的错误吗?还有谁能告诉我上述方法是否有任何问题,或者是否有更好、更有效的方法来做同样的事情?

对此的任何帮助将不胜感激。

最佳答案

The following attempt that I have done is most probably flawed and error handling is by no means complete. But somehow, I always get an error at this line-

我认为问题在于ProcessBundleHolderEntry应该实现Callable<Object>如果你想要invokeAll(...)返回 List<Future<Object>> 。我刚刚编译了您的代码,这解决了问题。

真的,在我看来它应该实现 Callable<Map<String, String>> 。那么调用方法应该返回正确的类型:

public Map<String, String> call() throws Exception {

然后是invokeAll(...)方法将返回正确的 List<Future<Map<String, String>> .

一个不同的(尽管有点奇怪)想法是返回 thiscall()方法。有ProcessBundleHolderEntry implements Callable<ProcessBundleHolderEntry>并在返回之前将响应记录在条目中 this来自call() 。那么你不需要做get(i)在条目上进行匹配。然后,您就可以在一个对象中获得条目、输出和响应。

关于java - ExecutorService 类型中的方法 invokeAll 不适用于参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18644850/

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