2010-09-27 35 views
1

我想弄清楚如何創建一個無狀態Spring bean,包裝一組調用salesforce web服務API。我的理解是,調用Salesforce的過程是這樣的:一個春季bean來包裝salesforce網絡服務調用

  1. 呼叫登錄服務登錄到Salesforce
  2. 進行一系列服務的調用
  3. 呼叫註銷

要有一個無狀態的包裝它似乎是正確的模式是讓bean中的每個方法執行上述所有三個步驟。例如(僞代碼)

binding.login(); 
binding.upsert(….); 
binding.upsert(….); 
binding.logout(); 

這是一個很好的做法嗎?看來,爲了保持bean無狀態將是一種昂貴的方式。在這種情況下,最好是製作豆request scope

+0

您不希望在每次調用時都要調用登錄/註銷,您將不必要地刻錄api調用,並添加延遲。你不能使用你計劃用來存儲用戶名/密碼來存儲sessionId的任何狀態嗎? – superfell 2010-09-28 03:01:15

+0

謝謝@superfell。在bean內部保持狀態是很容易的。我只是好奇我是否需要用請求範圍來實例化這個spring bean。我認爲答案是肯定的。那麼問題是:請求範圍是否會增加顯着的可擴展性成本?我是Spring的新手,所以我不知道請求範圍的開銷。 – pastafarian 2010-09-28 05:38:23

+0

正如@superfell所提到的那樣,可擴展性的擔憂並不僅限於Spring可以做什麼。您是否知道Salesforce的管理員限制?在爲Salesforce設計封裝程序時,您需要確保儘可能少地使用api來避免觸及這些限制。有關更多信息,請閱讀http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_gov_limits.htm。 – Paddyslacker 2010-09-29 15:36:02

回答

0

你試過SFDC WSC庫嗎?它很容易使用,並且適合您正在嘗試完成的用例。

1

我同意Anup,你應該看看sfdc wsc。

如果您想要完全無狀態,您需要了解有關salesforce連接的以下內容。

  1. 每一個動作都要有一個端點URL,像na6.salesforce.com或na7.salesforce.com
  2. 每一個動作都要有一個有效的SID(會話ID)的動作來完成。

當您登錄到salesforce時,原始終端是login.salesforce.com,如果您成功,您將返回有效終端(na6.salesforce.com)和SID。

然後,您可以將該端點/ sid放入單例中,並根據需要與多個spring bean共享。在你執行insert/upsert/update/etc之前,你需要創建一個新的SoapBindingStub並設置端點和sid。行動。

該sid將在一段時間不活動之後過期(任何時間從30-120分鐘取決於設置),因此您應該捕獲任何異常並使用單例對象重新登錄。

不用擔心兩個bean同時出現單例重新登錄,因爲salesforce會將同樣的sid返回給兩者。