我正在使用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完成。有什么办法可以实现异步数据加载吗?
答案 0 :(得分:0)
我不确定你的意思
它等待AsyncDataLoader完成
返回null
有效地停止了集成流程 - 当服务没有返回结果时,所有消息都会停止;线程将返回到启动它的任何内容;如果那是一个网关,它将永远等待那里永远不会到达的结果(除非网关超时)。
您需要返回一些表示缓存未命中的值。