2009-05-20 40 views
0

你將如何去實現等待,直到在Java中完成方法調用爲止?在java中執行同步網絡調用等待ack消息?

基本上我想要做的是hava一種方法,它通過網絡將消息發送到服務器應用程序,並等待它從服務器獲取相應的Ack消息,但操作已成功完成或操作失敗,並顯示錯誤消息。

我已經有一個非阻塞版本的我的方法,它傳遞一個回調類,其中有一個方法在回調中被調用。

構建一個回調類將它傳遞給我以前的方法,然後執行一個等待操作,並在回調中有該類做一個通知是否有意義?

回答

1

簡答:是的。我很喜歡使用類庫中的內容,您所描述的內容聽起來很像Observer模式,假設您使用的是J2SE,那麼您已經擁有Observer/Observable接口。

編輯︰我的咖啡有什麼問題:)顯然,我的意思是檢查什麼是java.util.concurrent包,特別是未來<>和ExecutorService類。

2

將.wait()添加到您的回調類將是最簡單的路徑。它可以坐在那裏旋轉一些標誌,直到你的回調切換它,只要確保在你的循環中包含Thread.yield()或.sleep()。

保存必須重寫另一個阻塞通信通道。

+0

如果你使用wait(),你爲什麼要旋轉一個標誌?使用wait()意味着你不需要那樣做,或者yield()或sleep()。 – Robin 2009-05-20 13:11:53

+0

我想實現自己的.wait(),但是是Object.wait()是另一種可能性,或者可能Callback.wait(),然後回調可以調用this.notifyAll() – Cogsy 2009-05-20 13:32:13

0

如果您不使用JMS,請忽略。

如果您使用的是JMS,那麼您可以使用QueueRequestor,這是Request Reply integration pattern的實現。

也就是說,下面的電話出現同步到客戶端,即使使用異步消息:

QueueRequestor requestor = null; 
try { 
    requestor = new QueueRequestor(session, queue); 
    Message response = requestor.send(request); 
} finally { 
    if (requestor == null) { 
     try { 
      requestor.close(); 
     } catch (JMSException e) { 
      // log error message 
     } 
    } 
} 
1

是,使用現有的方法,就像你所提出的建議。在同步方法調用中創建回調,該方法將通過wait()/ notify()與同步方法調用進行協調。同步方法將調用異步,然後wait()。當回調被調用時,它會調用notify()來喚醒同步方法,以便返回結果。