簡體   English   中英

Java Web應用程序與Web服務之間的線程間通信

[英]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()結合使用

  • 線程1對線程2的遠程調用集以及唯一的調用ID。
  • 線程1現在在同步對象上執行了wait() (而不是sleep()
  • 線程2進行工作,並返回結果,它在JVM線程1中駐留了一些遠程回調方法-調用ID與結果一起傳遞
  • Thread-1端的回調方法使結果可通過call-ID獲得,並通過notifyAll()喚醒所有等待的線程
  • 含螺紋 線程1檢查其結果是否到達,如果是,則再次繼續執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM