[英]inter-thread communication between java application and jax-ws web service
[英]inter thread communication between java web application and web service
我在Java應用程序和jax-ws Web服務之間的線程間通信中發布的原始問題的某些前提發生了變化(我也在簡化該問題,以使其更易於理解(並因此得到回答)...希望主持人可以)
Web服務線程(THREAD-1)在套接字上發出請求,然后進入睡眠狀態以等待響應。 另一個偵聽器線程(THREAD-2)(一旦收到響應,就作為單獨的Web應用程序運行)必須將THREAD-1喚醒。
我該怎么做(以推送通知的方式)?
他們倆都可以訪問數據庫表。 THREAD-1可以在睡覺之前將其唯一的ID放在表中。 THREAD-2,一旦收到響應並確定它屬於THREAD-1,就更新數據庫表中的相應行。 現在,THREAD-1可以(定期)對數據庫表進行輪詢,以檢查響應是否到達。
但我希望以推送通知的方式進行。 響應到達時應立即通知THREAD-1,而不必每隔幾秒鍾輪詢一次。
如果您的后端請求很快完成,並且您將沒有大量的客戶端請求要處理,則可以讓Web服務在剛剛打開的同一套接字上等待響應。 它可以阻止等待讀取響應。
但是,如果可以訪問Servlet 3.0(例如Tomcat 7),則可以使用異步HTTP請求 。 它允許您將處理Web服務客戶端的線程釋放回池中,而無需響應客戶端的請求。 當響應消息從后端服務到達時,抓取將從servlet容器中獲取適當的Web服務客戶端請求,並將最終響應發送回Web服務客戶端。
好吧,正如評論所建議的那樣:最好不要嘗試自己實現這一點。 但是,基本上,您可以將標准Java線程同步與wait()/ notify()結合使用
wait()
(而不是sleep()
) notifyAll()
喚醒所有等待的線程 wait()
,它們將繼續工作。 線程1端的偽代碼:
HashMap<String, Object> results;
// Called by Thread-1 to access Thread-2
public void doIt() {
String callId = "aUniqueCallId";
Object result = null;
remoteCallToThread2(callId);
synchronized(results) {
while((result = results.remove(callId)) == null) {
results.wait();
}
}
doSomethingWith(result);
}
// Called remotely by Thread-2 when result is available
public void callback(String callId, Object result) {
synchronized(results) {
results.put(callId, result);
results.notifyAll();
}
}
當然,這只是基本思想,不能被如此使用,這里有很多東西要考慮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.