2014-10-28 33 views
1

我正在开发一个基于REST的Web应用程序,它将为一些数据异步调用第三个系统(使用websockets)。所以 浏览器 - > REST - >我的Web应用程序 - >另一个应用程序 - >我的Web应用程序 - >浏览器 我的Web应用程序与另一个APP之间的通信是异步的,我只能跟踪使用某些标识符的请求的响应。 因此,我请求C为<counter>.C,并且响应将为<counter>.Response,其中两个计数器都是相同的。POJO物业更改监听器 - 理想的方式

要映射响应请求,我将命令,计数器,标志设置为一个bean。我保持一段时间循环,不断检查标记是否已设置。一旦我得到响应,设置标志,while循环退出,我知道数据是可用的。

这是正确的方法吗?有没有一种方法可以使这一点更好,因为我觉得(我可能错了!)保持一个开放的while循环是不正确的。

类豆设置像下面,

public void setAllProperties(){ 
bean.setCommand(commandString); 
bean.setCounter(counter); 
bean.hasResponse(false); 
} 

在web服务的片段是

bean.setAllProperties(); 
sendToApplication(bean); 
int checkCounter = 0; 
while(!bean.hasResponse && checkCounter > 0){ 
    if(bean.hasResponse){ 
    checkCounter++; 
    // loggers and other logic here 
    } 
} 
+0

是怎样的“其他应用程序”能够更新你的bean类? – 2014-10-28 04:00:36

+0

那么它没有更新bean类,它正在返回一个响应。使用websocket – aksappy 2014-10-28 05:03:23

回答

3

环路击败了很多的异步操作的值无关。它也消耗大量的CPU时间(尝试添加延迟 - 快速休眠 - 使用此类循环时)。

我推荐使用“wait()”和“notify()”/“notifyAll()”。

在那种在等待响应的代码,做这样的事情:

synchronized (bean) { 
    while (! bean.hasResponse) { 
     bean.wait(); 
    } 
} 

在该处理响应,并更新豆代码:

synchronized (bean) { 
    bean.hasResponse = true; 
    bean.notifyAll(); 
} 
+0

这工作得很好,我也添加了一个超时,以确保没有线程无限等待。谢谢。回复晚了非常抱歉。 – aksappy 2014-12-12 11:38:38