我正在开发一个基于REST的Web应用程序,它将为某些数据异步调用第三个系统(使用websockets)。所以
浏览器 - > REST - >我的WebApp - >另一个应用程序 - >我的WebApp - >浏览器
My WebApp与另一个APP之间的通信是异步的,我只能使用一些标识符跟踪请求的响应。
因此,我请求C为<counter>.C
,响应将为<counter>.Response
,其中两个计数器都相同。
要将响应映射到请求,我将命令,计数器,标志设置为bean。我保持一个while循环,继续检查标志是否已设置。一旦我得到响应,设置标志,while循环退出,我知道数据可用。
这是正确的方法吗?有没有办法让我做得更好,因为我觉得(我可能错了!)保持开放的while循环是不正确的。
类bean设置如下,
public void setAllProperties(){
bean.setCommand(commandString);
bean.setCounter(counter);
bean.hasResponse(false);
}
网络服务中的代码段是
bean.setAllProperties();
sendToApplication(bean);
int checkCounter = 0;
while(!bean.hasResponse && checkCounter > 0){
if(bean.hasResponse){
checkCounter++;
// loggers and other logic here
}
}
答案 0 :(得分:3)
循环失败了很多异步操作的值。它还消耗了大量的CPU时间(尝试添加延迟 - 快速睡眠 - 使用这样的循环时)。
我建议使用&#34; wait()&#34;和&#34;通知()&#34; /&#34; notifyAll()&#34;代替。
在等待回复的代码中,执行以下操作:
synchronized ( bean ) {
while ( ! bean.hasResponse ) {
bean.wait();
}
}
在处理响应并更新bean的代码中:
synchronized ( bean ) {
bean.hasResponse = true;
bean.notifyAll();
}