WF4.0持久化问题探讨
何为持久化
“工作流持久性是指独立于进程或计算机信息持续捕获工作流实例的状态。其目的在于:在发生系统故障时为工作流实例提供一个已知恢复点,通过卸载当前未主动执行工作的工作流实例来节省内存,或者将工作流实例状态从服务器场中的一个节点移至另一个节点。
持久性支持进程灵活性、可扩展性、故障恢复以及更有效地管理内存的功能。持久性进程包括标识持久点、收集要保存的数据以及将数据实际存储最终委托给持久性提供程序。”------来源MSDN
“如果我们的流程需要长时间才能完成(这是很常见的),那么如何在这些流程空闲(例如等待经理审批)的时候,更好地管理它们呢?
我们都知道,默认情况下,所有流程实例都是在内存中被创建的一个对象。那么这里提到的管理,有两个层面的意思:
- 如果某些实例处于空闲状态,那么他们所占用的内存可能是浪费的。
- 由于可能因意外情况导致的宕机(例如停电,或者被某个恶作剧者按下了重启按钮),所以放在内存中的实例是很不保险的
所以,为了达到上面的两个目的,WF 提供了所谓的“持久化”的功能。就是支持我们将工作流实例通过一定的方式保存起来,等需要的时候再取出来即可。
WF3就开始支持这种特性,那时候称之为“持久化服务”。WF4对此做了进一步的改进和完善”------来源陈希章老师的文章
如何添加持久化
1:准备持久化数据库
WF4已经为我们提供好了数据库文件 ,你可以在下面地址找到sql文件
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SQL\en
【注意】如果你不是x64的系统,则可能是C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en
2:添加持久化功能
为WorkflowApplication添加持久化功能
为使用 WorkflowServiceHost 的自承载工作流服务启用持久性
WorkflowServiceHost 除了上面的方法还有一种更常用的方式
---------------------来源MSDN
这里推荐陈希章老师关于WF4.0持久化的文章 点此进入
WorkflowServiceHost 疑问
陈希章老师的文章(点此进入 )写得非常好,简单易懂 只是例子我自己没有测试成功。虽然数据库中可以看到持久化的内容,但是把服务器关掉,再次打开后,使用客户端测试失败 没有成功读取数据库持久化内容 所以很不解 MSDN上也没有找到WorkflowServiceHost 恢复持久化的相关内容 另外陈老师文章中有这样一句话“当一个流程的请求被发送到服务端,WorkflowServiceHost会收到,它先在内存中查找看是否有合适的实例,如果没有,则会尝试查看数据库中是否有合适的实例,如果有,则会加载它” 不知道是否这样 但是从文章中得截图看到是成功的样子 很不解。。。
总结
希望大家看一下陈老师的文章 看看能不能成功 如果成功 请求留言指点
我的邮箱: mengdesen09@qq.com