2010-12-09 29 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(); 
}