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

简介: 各位大神:现在有一需要如下:A项目中的service层要调用B项目的一个方法,这个调用是利用Activemq的消息传递的,B项目处理完成后,将消息回复到A项目中activemq消息监听QUEUE上,而A项目的service层要将B处理的结果同步返回给调用者,小弟我采用了两种...

各位大神:

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

}

目录
相关文章
|
5月前
|
存储 数据库
领域模式问题之模型设计存在问题如何解决
领域模式问题之模型设计存在问题如何解决
|
5月前
|
数据库 缓存
发号器优化思路
【7月更文挑战第10天】
42 7
|
5月前
|
SQL 索引
业务系统架构实践问题之想要再SQL代码中生成递增序列,那么步骤问题如何解决
业务系统架构实践问题之想要再SQL代码中生成递增序列,那么步骤问题如何解决
|
存储 小程序 数据库
小程序整体的思路
小程序整体的思路
210 0
|
算法
写题思路的分享
写题思路的分享
54 0
|
设计模式 C#
大话设计模式——错误汇总1
大话设计模式——错误汇总1
68 0
|
JSON 分布式计算 数据处理
IP 转换_思路梳理 | 学习笔记
快速学习 IP 转换_思路梳理
110 0
IP 转换_思路梳理 | 学习笔记
|
Java
LanguageTool精简的两个思路
LanguageTool精简的两个思路
78 0
|
缓存 数据库
秒杀解决方案思路和步骤
秒杀解决方案思路和步骤
174 0
秒杀解决方案思路和步骤
|
设计模式 算法 架构师
如何优化你的if-else?来试试“责任树模式”
写业务逻辑时,if-else 可能是最容易想到的逻辑方式了。然而大量堆砌的 if-else 毫无疑问将给代码维护带来巨大的困难。如何优化这些 if-else 呢?本文分享一种设计模式——责任树模式,通过将责任链与策略模式融合,成为一种广义的责任链模式,不仅可以完成任务的逐级委托,也可以在任一级选择不同的下游策略进行处理,并将责任树模式抽象出一个通用的框架。
如何优化你的if-else?来试试“责任树模式”