可调用任务未正确执行



嗨,我创建了一个简单的任务,它正在点击第三方 API 之一,

我尝试创建一个可调用的任务并与ExecutorService并行执行

for (String script : allScripts) {
callableTasks.add(new DataFetchTask(script,TimeInterval.get(interval),
Range.get(range)).newCallable());
}
final ExecutorService executorService = new ThreadPoolExecutor(1, 10,
10000, TimeUnit.MILLISECONDS,
new SynchronousQueue<Runnable>());
try {
System.out.println("Callable Tasks"+callableTasks.size());
final Future<YahooFinResponse> yahooFinResponseFuture = executorService.submit(callableTasks.get(0));
/*final List<Future<YahooFinResponse>> futures = executorService.invokeAll(callableTasks);
for(Future<YahooFinResponse> future : futures) {
yahooFinResponses.add(future.get());
}*/
return FinDataServiceUtil.writeResponsesToCSVFile(yahooFinResponses);
} catch (Exception e) {
e.printStackTrace();
}

任务类

@RequiredArgsConstructor
public class DataFetchTask {
private final String script;
private final TimeInterval timeInterval;
private final Range timeRange;
@Autowired
YahooFinDataFetcher yahooFinDataFetcher;
public Callable<YahooFinResponse> newCallable() {
return new Callable<YahooFinResponse>() {
public YahooFinResponse call() {
System.out.println("Starting Job for Script"+script);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("After wait");
final YahooFinResponse yahooFinResponse = yahooFinDataFetcher.fetchData(script +
".NS", timeInterval, timeRange);
System.out.println("Returning from call"+yahooFinResponse.chart.error);
return yahooFinResponse;
}
};
}
}

服务类

@Component
public class YahooFinDataFetcher {
private static final OkHttpClient client = new OkHttpClient();
private static final Gson gson = new Gson();
private static final String BASE_URL = "***;
private static final String DOMAIN = "**";
private static final String CORS_DOMAIN = "***";
public YahooFinResponse fetchData (final String scriptName, final TimeInterval timeInterval,
final Range range) {
System.out.println("Calling Service");
final Request request = new Request.Builder()
.url(createUrl(scriptName, timeInterval, range))
.build();
final Call call = client.newCall(request);
try {
final Response response = call.execute();
final String responseStr = response.body().string();
final YahooFinResponse yahooFinResponse = gson.fromJson(responseStr,
YahooFinResponse.class);
System.out.println(String.format("Returning Data For YahooFInResponse %s "
+ "n",yahooFinResponse));
return yahooFinResponse;
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(String.format("Returning null from fetchData for %s  TimeInterval %s, "
+ "Range %s n",scriptName,timeInterval,range));
return null;
}

我得到的输出为

Size5list[RELIANCE, SBIN, YESBANK, ITC, VEDL]
Callable Tasks5
Starting Job for ScriptRELIANCE
After wait

但没有得到作业完成的输出,

我尝试减小作业规模,用FixedThreadPoolCachedThreadPool更改ExecutorService的创建

DataFetchTask更改为 newCallable 作为方法,并且早些时候此类本身直接实现Callable<T>

当我试图得到future.get()它给了NullPointerException

我尝试了多种方法,但不确定Callable任务创建有什么问题。

我正在通过控制器点击服务

您的 yahooFinDataFetcher 可能为空,因为 IOC 无法注入它的实例。DataFetchTask 未作为组件进行处理。

尝试在DataFetchTask上手动实例化yahooFinDataFetcher,看看是否确实如此


@RequiredArgsConstructor
public class DataFetchTask {
private final String script;
private final TimeInterval timeInterval;
private final Range timeRange;
@Autowired
YahooFinDataFetcher yahooFinDataFetcher = new YahooFinDataFetcher();
...

最新更新