Java 可调用任务未正确执行
嗨,我已经创建了一个简单的任务,它正在攻击一个第三方API 我试图创建一个可调用的任务,并与ExecutorService并行执行它 我得到的输出是Java 可调用任务未正确执行,java,multithreading,thread-safety,executorservice,Java,Multithreading,Thread Safety,Executorservice,嗨,我已经创建了一个简单的任务,它正在攻击一个第三方API 我试图创建一个可调用的任务,并与ExecutorService并行执行它 我得到的输出是 Size5list[RELIANCE, SBIN, YESBANK, ITC, VEDL] Callable Tasks5 Starting Job for ScriptRELIANCE After wait 但是没有得到工作完成的结果 我尝试减少作业大小,使用FixedThreadPool和CachedThreadPool更改ExecutorS
Size5list[RELIANCE, SBIN, YESBANK, ITC, VEDL]
Callable Tasks5
Starting Job for ScriptRELIANCE
After wait
但是没有得到工作完成的结果
我尝试减少作业大小,使用FixedThreadPool和CachedThreadPool更改ExecutorService的创建
将DataFetchTask更改为newCallable as方法以及早期版本,该类本身直接实现了Callable
当我尝试获取future.get时,它会给出NullPointerException
我尝试了多种方法,但不确定可调用任务创建有什么问题
我通过控制器点击服务您的yahooFinDataFetcher可能为空,因为IOC无法注入它的实例。DataFetchTask未作为组件处理 尝试在DataFetchTask中手动实例化yahooFinDataFetcher,看看是否确实如此 @所需参数构造函数 公共类数据获取任务{ 私有最终字符串脚本; 专用最终时间间隔; 专用最终范围时间范围; @自动连线 YahooFinDataFetcher YahooFinDataFetcher=新的YahooFinDataFetcher; ...
你读过它的实际功能吗?我几乎肯定你不应该在这里使用它。@VGR读得很好,但为什么ExecutorService在这里不是一个好主意?ExecutorService很好。用SynchronousQueue支持它不是。@VGR明白了,谢谢,明白了你的意思。类设计有什么问题吗?有没有办法在她身上注入依赖关系在手动实例化DataFetchTask之后,您可以将YahooFinDataFetcher自动连线向上移动一个级别,我假设它对IOC容器可见,并将其作为构造函数参数传递回DataFetchTask。
@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