我有一個WCF Windows工作流(4.5)工作流服務託管在IIS和使用AppFabric 1.1。工作流程實例長時間運行(長達大約一週),但大部分時間都用於延遲活動。AppFabric託管工作流並不總是在延遲/卸載後重新加載
這似乎一開始工作正常,但是當同時運行多個工作流實例(2 +個實例導致這種情況)時,其中一些只是在延遲步驟中從內存卸載後纔會喚醒。當我查看日誌,我發現所有的錯誤是這樣的:
System.OperationCanceledException: The execution of InstancePersistenceCommands has been canceled because the InstanceHandle was freed.
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.WaitAndHandleStoreEventsCallback(IAsyncResult result)
不幸的是,我沒有找到該錯誤消息的任何有用的信息。
AppFabric Persisted Instances Table中的SuspensionExceptionName和SuspensionReason字段顯示System.NullReferenceException:未將對象引用設置爲對象的實例。但是這不會發生在我的工作流程內,只在外面。
附加信息:
- 我跑活動作爲消防&忘記(接收活動,沒有發送)
- 我的工作流程調用到其他WCF服務來獲取數據。
- 我在Server 2012 R2上運行IIS 8(不是天藍色)
- Workflow Persistence正在工作。我可以重置IIS,重啓......當我運行2個實例時,它有問題。
- 我絕對沒有遇到任何類型的限制。雖然工作流程處理幾MB的數據,但這個問題發生在2+實例。
任何想法可能發生在這裏?
編輯: 我意識到我發現了更多關於問題如何運作的信息,並且從未將它添加到問題中。當延遲問題發生時,它的運行很像一個由2個線程寫入的靜態變量。
這裏有一個可視化:
WF1 Start ---->Do Stuff--->Sleep------------*1----->Cancelled Exception at some point
------WF 2 Start---->Do Stuff------->Sleep->Wake up---------*2------>More Stuff---->End Successfully
*1 - When WF Instance 1 Should Wake up (Same time as WF 2 wakes)
*2 - When WF Instance 2 Should have woken up (Seems to be ignored)
之前有人問......我在我的代碼去掉每一個靜態變量,方法,類的。沒有什麼是靜止的了。
感謝您的回答!這聽起來像一個與我有什麼不同的問題(我的問題只會在多個實例出現時纔會發生,並且更像靜態變量被線程覆蓋,一個在錯誤的時間喚醒,另一個不會喚醒...)但是我會記住長時間的延遲。 – ChrisG 2015-04-02 17:55:58