天天看点

求助:以下场景用什么模式或是思路好

各位大神:

现在有一需要如下: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);