2010-12-09 50 views
0

我有一个servlet使用http get从另一个服务器请求地理位置。响应是通过来自其他服务器的回调接收的,并在另一个servlet中结束。理想情况下,我想在第一个servlet上返回一个映射,并使这个异步机制同步。我现在所能想出的就是轮询一个共享的hashmap,直到这个值出现为止,这看起来有点像一个丑陋的黑客。任何想法如何我可以更优雅地实现这一点?如何处理java中的回调

+0

如果您使用的是Servlet 3,那么您可以检查如何执行[异步处理](http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3。 HTML)。 – 2010-12-09 09:17:40

+0

就servlet 3而言,异步处理部分不是问题。问题在于请求是在一个servlet中生成的,而在另一个servlet中的响应需要被馈送到原始的servlet中。 – Wayne 2010-12-15 20:13:25

回答

3

在最基本的层面上,使用条件变量比无阻塞循环更有效。

// global, shared lock. 
final Lock lock = new ReentrantLock(); 
final Condition locationReceived = lock.newCondition(); 

// first servlet: 
// 
lock.lock(); 
try { 
    requestLocation(); 
    if (!locationReceived.await(10, TimeUnit.SECONDS)) { 
     // location was not received in the timeout. 
    } else { 
     // read location from shared object. 
    } 
} finally { 
    lock.unlock(); 
} 


// servlet that receives geolocation 
// 
lock.lock(); 
try { 
    // set location in shared object. 
    locationReceived.signal(); 
} finally { 
    lock.unlock(); 
}