BizTalk业务规则引擎比较日期范围内的DateTimeNow?

问题描述:

我尝试使用Between谓词将当前日期时间与日期时间范围进行比较。BizTalk业务规则引擎比较日期范围内的DateTimeNow?

我参考mscorlib组装和使用get_Now()DateTime类在程序集中获取DateTimeNow。我有问题比较此当前日期时间与范围。

我的病情是这样的:

  • DateTimeNow是2012-08-03 07:00:00之间2012-08-04 07:00:00

  • 在我区DateTimeNow应目前为2012-08-03 16:33:20。它应该在我指定的范围之间。但它似乎不起作用。如果我将DateTimeNow替换为2012-08-03 16:33:20,它可以工作。

这似乎是由于某种原因,我的DateTimeNow不起作用。任何人有任何想法?

我发现使用Get_Date()在.NET mscorlib程序汇编功能,您必须修改您的计算机的注册表

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ BusinessRules \ 3.0 \ StaticSupport(DWORD),值给予1

详细信息:

http://blogs.msdn.com/b/richardbpi/archive/2005/11/14/492489.aspx

http://kinnaribhute.blogspot.co.nz/2008/04/some-interesting-stuff-about-biztalk.html

我不是确定这将如何影响生产服务器,如果生产服务器环境未与多个节点集群,将会有重新启动服务器的中断。

事实在引擎中逻辑建模的方式与在.NET代码中建模对象的方式之间存在阻抗不匹配,其中一个影响是调用静态方法的问题。如果您按照萧寒的描述设置了StaticSupport标志,则引擎会改变其行为,对静态方法进行处理,就好像它们是内置函数或谓词一样。然而,默认情况下,引擎将静态方法视为事实的行为。在物理上,事实是引擎工作内存中的一个对象,并且在方法可以使用之前,每个事实都必须向引擎声明。因此,要在DateTime上调用静态Now属性获取器,首先必须将DateTime对象设置为引擎。当然,DateTime是一个值类型(结构),但这没关系,因为当你执行一个规则集时,你将一个事实作为一个对象或一组事实声明为一个对象数组。 .NET会自动将一个DateTime(以内部方式将其包装为一个对象)装箱。

我认识到,为了调用一个静态方法(或者,在这种情况下,属性getter,当然这是一种方法),必须声明一个对象到引擎,那个对象。如果引擎已经被构建为默认将静态方法视为内置插件,那么它可能会更好。但是,情况并非如此。另外,如果微软在单独的规则集或甚至单个规则的层面上实施了StaticSupport标志,情况会好得多。在注册表(机器级)中实现它,或者以这种方式在.config文件(应用程序级;使用)中配置它可能会造成实际问题,因为它可能会破坏写入的规则集,以使用相反的旗。

需要牢记的另一点是静态支持也可以设置为'2'。在这种情况下,如果您调用不带参数的静态方法,或者只使用常量值调用该方法,并且将其作为条件中的谓词或另一个函数的参数调用,则引擎将评估静态成员只需一次并缓存结果。