我目前正在使用Apache Wicket。我有一些REST调用,每个调用几秒钟。 Wicket只允许同步调用ajax,所以我试图使用Future和Callable。
这是我班级的一部分:
public abstract class GetPrices extends AbstractAjaxTimerBehavior {
private static final long serialVersionUID = 1L;
private List<Future<List<Result>>> list;
public GetPrices(Duration updateInterval, List<Callable> priceCalls) {
super(updateInterval);
list = new ArrayList<Future<List<Result>>>();
ExecutorService executor = Executors.newFixedThreadPool(priceCalls.size());
for(Callable callable : priceCalls) {
list.add(executor.submit(callable));
}
executor.shutdown();
}
@Override
protected void onTimer(AjaxRequestTarget target) {
while(list.hasNext()) {
Future<List<Result>> future = listIterator.next();
if(future.isDone()) {
List<Result> data = future.get();
//Process data
}
}
}
//Error handling etc
}
List<Callable> priceCalls
包含对相应价格调用的方法调用
我收到对象类型不是Serializable!针对java.util.concurrent.FutureTask列表字段
我假设我应该以不同的方式设计。可以提出任何关于如何做到这一点的想法吗?
如果有帮助,我正在使用Spring
答案 0 :(得分:2)
FutureTask
不可序列化,因为它依赖于其他资源,例如Executor
,可能是Thread
实例,Queue
和操作系统资源,这些资源不容易序列
答案 1 :(得分:1)
另一种选择是创建自己的Future实现,它也实现了Serializable。
在下面的页面中,作者显示了这一点。在这种情况下,他在Future实现背后使用了JMS。
http://www.javacodegeeks.com/2013/02/implementing-custom-future.html
答案 2 :(得分:0)
我最终使用了Spring的Async和AjaxLazyLoadPanel