我正在开发一个基于REST的Web应用程序,它将异步调用一些数据的第三系统(使用WebSocket)。因此,浏览器-> REST->我的WebApp->另一个应用程序->我的WebApp->浏览器我的WebApp与另一个APP之间的通信是异步的,我只能使用某些标识符来跟踪请求的响应。因此,我要求C为<counter>.C
,并且响应将是<counter>.Response
两个计数器都相同的地方。
为了将响应映射到请求,我将命令,计数器,标志设置为一个bean。我有一个while循环,继续检查是否设置了标志。一旦获得响应,就设置标志,同时循环退出,我知道数据可用。
这是正确的方法吗?有没有一种方法可以使它变得更好,因为我感觉(我可能错了!)保持打开的while循环不正确。
类bean的设置如下所示,
public void setAllProperties(){
bean.setCommand(commandString);
bean.setCounter(counter);
bean.hasResponse(false);
}
Webservice中的代码段是
bean.setAllProperties();
sendToApplication(bean);
int checkCounter = 0;
while(!bean.hasResponse && checkCounter > 0){
if(bean.hasResponse){
checkCounter++;
// loggers and other logic here
}
}
循环破坏了异步操作的许多价值。它还消耗了大量的CPU时间(使用这种循环时,请尝试增加延迟-快速睡眠)。
我建议改用“ wait()”和“ notify()” /“ notifyAll()”。
在等待响应的代码中,执行以下操作:
synchronized ( bean ) {
while ( ! bean.hasResponse ) {
bean.wait();
}
}
在处理响应并更新Bean的代码中:
synchronized ( bean ) {
bean.hasResponse = true;
bean.notifyAll();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句