各位大神:
现在有一需要如下:A项目中的service层要调用B项目的一个方法,这个调用是利用Activemq的消息传递的,B项目处理完成后,将消息回复到A项目中activemq消息监听QUEUE上,而A项目的service层要将B处理的结果同步返回给调用者,
小弟我采用了两种方式,总感觉处理的不太舒服,求指导
第一种:采用加锁机制 ReentrantLock
第二种:采用了Spring 的DeferredResult,deferredResult在没有超时的的情况下,一直循环去断定是否被设置了值
DeferredResult deferredResult =newDeferredResult(5000L);
TaskDetail taskDetail =newTaskDetail("/login",deferredResult);
Task.addTask(correlationID,taskDetail);
deferredResult.onTimeout(newAsyncRequestTimeHandler(correlationID,taskDetail));
boolean hasReturn =false;
while(!hasReturn) {
hasReturn = deferredResult.hasResult();
}
JSONObject result = (JSONObject) deferredResult.getResult();
在Listener处做了如下处理:
if(Task.TASK_MAP.containsKey(correlationID)) {
longendTime = System.currentTimeMillis();
TaskDetail taskDetail = Task.TASK_MAP.get(correlationID);
longstartTime = taskDetail.getStartTime();
DeferredResult deferredResult = taskDetail.getResult();
deferredResult.setResult(json);
logger.info("correlationID:[{}] request normal,in {} ms.",correlationID,+(endTime - startTime));
Task.TASK_MAP.remove(correlationID);
}