2011-10-03 105 views
2

我是Ruby和Sinatra的初級用戶,但是設法在Heroku上運行的Web服務運行良好。我從Salesforce.com訪問此Web服務。使用Sinatra網絡服務處理客戶端超時

我在Salesforce/Apex中使用的HTTPRequest類的最大超時時間爲60秒。如果我遇到了這個超時(或者當我用於測試目的的1秒超時),我會在Salesforce端獲得一個例外情況,我可以輕鬆應對。我感興趣的是如何在Sinatra方面處理這個問題。

如果我的客戶端得到超時,並以某種方式關閉連接,是否有辦法在我的Sintra應用程序中「感知」這種方式?我想要注意客戶端超時,繼續執行應用程序啓動的工作,然後發送電子郵件讓用戶知道超時後完成作業。

我應該注意到,當我現在得到超時時,Sinatra應用程序快樂地完成了它正在做的事情,並且,我猜測,返回它應該的JSON數據。只有客戶端沒有任何東西可以獲取這些數據。

有什麼想法?

回答

0

有趣的問題。作爲一個無狀態的協議,我不認爲HTTP包含一個客戶關閉連接時「感知」的方法。我真的不知道什麼是SalesForce,但是這裏有一些標準的HTTP解決方案(我假設Web套接字已經出來)。

最簡單,但容易出現誤報

既然你知道最大超時時間您西納特拉的要求。如果花費時間超過60秒,則假定超時併發送電子郵件。很顯然,這在59-61秒左右的時間裏很容易出錯,你可能會得到一些誤報和誤報。

困難,但容易產生完美

你可以實現一個 「閱讀回執」。你的JSON響應將包含一個UID。如果您的SalesForce請求不是超時,請將UID作爲收據發回。然後西納特拉會知道一切都很好。

如果西納特拉應用程序並不n秒內沒有收到該收據/分鐘(因爲Salesforce的超時,你從來沒有得到的UID),該西納特拉應用程序可以在n秒/分鐘後發送電子郵件(或其他)。

這可以通過幾種方式實現。最簡單的可能涉及數據庫,腳本和cron。最困難的可能包括HTTP流式傳輸(現在在Sinatra 1.3中是微不足道的),可能還有像Thin或Zbattery這樣的多線程或者偶數服務器。我很樂意詳細說明。

+0

很好的反饋。謝謝。事實證明,Salesforce的60年代超時並不相關,因爲Heroku強加了30秒的超時時間(除非你在Cedar堆棧上並且覺得發送保持活躍的ping,我不知道)。鑑於30秒超時,以及我們大多數用戶將以需要大量時間的方式參與此項服務這一事實,我們只需每次都馬上發送一封電子郵件,讓Heroku完成重大提升延期工作。 –