为什么java.util.concurrent.FutureTask不可序列化

时间:2014-03-13 10:31:38

标签: java spring wicket java.util.concurrent

我目前正在使用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

3 个答案:

答案 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

在此处查看更多信息: http://apache-wicket.1842946.n4.nabble.com/AjaxLazyLoadPanel-loading-asynchronously-td4664035.html#a4665188