Spring Integration在服务激活器方法中创建异步线程

时间:2017-08-17 13:04:31

标签: java spring asynchronous spring-integration

我正在使用Spring上的Spring Integration编写缓存服务。我在服务类中有一个方法,它使用service-activator调用并从缓存中返回值。我需要在此方法中创建一个异步线程,以防异常缓存加载数据,同时调用service-activator线程应立即返回null值。服务java方法代码如下。

    public Object getValue(Object key){
        Object valueObj = cache.get(key);
        if(null == valueObj) {
            taskExecutor.execute(new AsyncDataLoader(key));
        }
        return valueObj;
    }

    private class AsyncDataLoader implements Runnable{
        private Object key;
        public AsyncDataLoader(Object key){
            this.key = key;
        }
        @Override
        public void run() {
            try {
                Object valueObj = dataClient.getData(key);
                put(key, valueObj);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

Spring集成部分:

<int:service-activator input-channel="inputObjChannel"
    ref="myService" method="getValue" />

但是,不是立即返回service-activator调用线程,而是等待AsyncDataLoader完成。有什么办法可以实现异步数据加载吗?

1 个答案:

答案 0 :(得分:0)

我不确定你的意思

  

它等待AsyncDataLoader完成

返回null有效地停止了集成流程 - 当服务没有返回结果时,所有消息都会停止;线程将返回到启动它的任何内容;如果那是一个网关,它将永远等待那里永远不会到达的结果(除非网关超时)。

您需要返回一些表示缓存未命中的值。