2014-11-24 42 views
0

我的項目有一個編排,其中包含非事務性作用域將可序列化對象返回到biztalk時數據丟失

在該範圍內,爲了獲得帶有值的Hashtable,需要調用.NET幫助程序。

重要的是要提到它是我在該範圍內執行的事情,意味着範圍只包含調用.NET函數的表達形狀。

返回Hashtable的函數被標記爲static

它看起來像這樣:

public static Hashtable GetKeys(XmlDocument xmlDoc) 
     { 
      Hashtable servicesKey = new Hashtable(); 

      //Key1 
      int keysCounter = 1; 

      // Add key1 
      servicesKey.Add("Key" + keysCounter, Constants.Keys.First); 
      keysCounter++; 

      // Add key2 
      servicesKey.Add("Key" + keysCounter, Constants.Keys.Second); 
      keysCounter++; 

      // Add key3 
      servicesKey.Add("Key" + keysCounter, Constants.Keys.Third); 
      keysCounter++; 

      return servicesKey; 
     } 

出於某種原因,發送消息的一個巨大的質量,並在同一時間重新啓動主機實例時 - 我得到的結果上一些空Hashtable消息的

有人可以幫助我如何改變它,所以在這種情況下消息不會迷路?

+0

我不是專家,但我認爲這裏的問題可能歸結爲持久性。我懷疑數據丟失可能在實例處於GetKeys方法時發生。您可以嘗試通過在.Net幫助程序調用之前調用一個空的Orch來強制執行一個持久性點?請參閱持續點:http://blogs.msdn.com/b/sanket/archive/2006/11/12/understanding-persistence-points-in-biztalk-orchestration.aspx – Rodders 2014-12-01 14:07:05

回答

0

您需要正確地序列化您的類,以確保數據能夠正確保存。

首先,你需要給你的類序列化標籤:

[Serializable] 
public class MyClass 
{ 
    public Hashtable GetKeys(XmlDocument xmlDoc) 
    { 
     // etc... 
    } 
} 

然後,你需要實例化它的一個實例在您的業務流程。您可以通過創建一個變量併爲其指定類的類型(您必須在包含biztalk項目中的類的流程中使用編排參考)來完成此操作。)

然後,您可以在表達式形狀中聲明新實例:

// In an expression shape: 
MyOrchestrationVariable = new MyExternalAssembly.MyClass(); 

,並致電方法安全:

// In an expression shape again: 
ServicesKey = MyOrchestrationVariable.GetKeys(XmlDoc); 

希望這有助於。

0

我不明白,這是什麼意思,並重新啓動主機實例。提交消息後是否重新啓動主機實例?爲什麼這樣?

關於返回空主題標籤,請嘗試在控制檯應用程序內單獨測試該代碼,並查看它是如何表現「大量消息」的。 另一個建議是,設計你的過程的方式是,每個消息(羣集中)創建Orch的新實例,因此也將單獨實例化.NET類。