BizTalk业务规则引擎在一系列日期内比较DateTimeNow?

时间:2012-08-04 01:44:25

标签: datetime biztalk business-rules biztalk-rule-engine

我尝试使用Between谓词来比较当前日期时间和一系列日期时间。

我引用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无效。任何人都有任何想法?

2 个答案:

答案 0 :(得分:2)

我发现在.net mscorlib程序集中使用Get_Date()函数,你必须修改你的机器注册表

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ 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

我不确定这会对生产服务器产生什么影响,如果生产服务器环境没有与多个节点集群,则会有服务器重启的中断。

答案 1 :(得分:0)

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

似乎很疯狂,我意识到,为了调用一个静态方法(或者,在这种情况下,一个属性getter,当然这是一个方法),它必须向引擎断言一个对象宾语。如果构建引擎默认情况下将静态方法视为内置函数,那可能会更好。但事实并非如此。此外,如果Microsoft在单个规则集甚至单个规则的级别上实现了StaticSupport标志,那将会好得多。在注册表(机器级)中实现它,或者以这种方式在.config文件(应用程序级别;使用)中配置它可能会带来真正的问题,因为它可能会破坏写入的规则集以使用相反的值旗。

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

相关问题