【问题标题】:Spring Integration create asynchronous thread in service activator methodSpring Integration 在服务激活器方法中创建异步线程
【发布时间】:2018-01-25 21:59:29
【问题描述】:

我正在使用基于 TCP 的 Spring Integration 编写缓存服务。我在服务类中有一个方法,它使用服务激活器调用并从缓存中返回值。我需要在此方法中创建一个异步线程,以防缓存未命中以异步加载数据,而调用服务激活器线程应立即返回空值。服务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" />

但不是服务激活器调用线程立即返回,而是等待 AsyncDataLoader 完成。有什么办法可以实现异步数据加载?

【问题讨论】:

    标签: java spring asynchronous spring-integration


    【解决方案1】:

    我不知道你的意思是什么

    它等待 AsyncDataLoader 完成

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

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

    【讨论】:

    • 通过发送非空响应帮助解决了这个问题。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多