我有一个Java方法,在设置数据库中的必需字段后,进行Web服务调用。但是这个方法是同步的,当我们运行一个在不同的case id上调用这个方法的批处理(大约10000多个案例)时,它需要超过一天。我不知道为什么这是同步的,所以如何让这个方法调用异步?
public synchronized void sendNotice(CaseKey caseKey, Long communicationId) {
// calling data from database
// setting parameters for webserice
// make a webservice call
// this code will be called 470 times
}
答案 0 :(得分:2)
您可以将您的Web服务调用包装在Callable
个对象中,并通过适当的ExecutorService
执行它们。它可能看起来像这样:
public class WSResult {
public int getResultProp1() {
...
}
}
public class WSCall implements Callable<WSResult> {
public WSCall(int param1, String param2) {
...
}
public WSResult call() {
// perform WS call
return new WSResult(...);
}
}
public class SomeClass {
// ...
public void driver() {
ExecutorService service = Executors.newFixedThreadPool(WS_CAPACITY);
List<Future<WSResult>> results = new ArrayList<>();
for (int i = 0; i < 10000; i += 1) {
results.add(service.submit(new WSCall(... parameters ...)));
}
service.shutdown();
service.awaitTermination();
// ... do something with the results ...
}
}
答案 1 :(得分:1)
ExecutorService es = Executors.newSingleThreadExecutor();
Future<?> f = es.submit(new Runnable(){
@Override
public void run() {
sendNotice(caseKey, communicationId);
}
});
您获得表示任务未完成的Future<?>
。
答案 2 :(得分:-1)
如果无法更改代码,则无法使方法异步运行。 克服这个问题的唯一方法是从多个JVM运行测试用例。