- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
流口水 documentation提到规则可以使用 date-effective
和 date-expires
等属性来指定绝对规则有效期。
例如
rule "Date-restricted rule"
date-effective "20.2.2013 8:00" # 8 AM
date-expires "20.2.2013 16:00" # 4 PM
when
then
end
Drools 还支持周期性重复的规则,间隔为 timer(int:)
和 cron 为 timer(cron:)
但这意味着规则在这些点被触发.
如果有任何选项如何指定具有时间限制的定期可用(未触发)规则,我很感兴趣。例如,让我们想象一下某公司的营业时间——该操作只能在正式工作期间执行,而不能在下类后执行。
我想要这样的东西,但这不是 Drools 的有效规则
rule "Time-restricted rule"
time-effective "8:00" # 8 AM
time-expires "16:00" # 4 PM
when
then
end
是否可以将此类规则扩展为仅在周一至周五上午 8 点至下午 4 点生效?
Drools 不直接支持基于时间的关键字,但它们使用 Quartz 提供了更强大的日历机制。图书馆。由 StatelessSession
创建的 StatefulSession
或 WorkingMemory
具有定义这些日历的方法,这些日历可以限制触发规则的日期和时间。
示例:规则定义
rule "Business hours only"
calendars "business-hours"
when
SomeAttachedClass()
then
System.out.println("Rule is fired");
end
日历定义
import org.quartz.impl.calendar.DailyCalendar;
// stateless session and working memory or directly stateful session
StatefulKnowledgeSession memory = session.newWorkingMemory();
// interested time range is 8-16, also there is many Calendar implementation, not just Daily
DailyCalendar businessHours = new DailyCalendar( 8, 0, 0, 0, 16, 0, 0, 0 );
// by default, defined time is EXCLUDED, the inversion makes it INCLUDED and excludes the rest
businessHours.setInvertTimeRange( true );
//convert the calendar into a org.drools.time.Calendar
org.drools.time.Calendar businessHoursCalendar = QuartzHelper.quartzCalendarAdapter( businessHours );
//Register the calendar in the session with a name. You must use this name in your rules.
memory.getCalendars().set( "business-hours", businessHoursCalendar );
最佳答案
更好的方法是使用 calendar
而不是 timer(cron:)
。我按照以下步骤设法做了与您正在寻找的类似的事情:
创建 session 时,您必须创建和配置 Quartz 日历:
//in this case I'm using a DailyCalendar but you can use whatever implementation of Calendar you want
org.quartz.impl.calendar.DailyCalendar businessHours = new org.quartz.impl.calendar.DailyCalendar("business-hours", 8, 0, 0, 0, 16, 0, 0, 0);
businessHours.setInvertTimeRange(true);
//convert the calendar into a org.drools.time.Calendar
org.drools.time.Calendar businessHoursCalendar = QuartzHelper.quartzCalendarAdapter(businessHours);
//Register the calendar in the session with a name. You must use this name in your rules.
ksession.getCalendars().set( "business-hours", businessHoursCalendar );
然后在你的规则中你必须写这样的东西:
rule "Rule X"
calendars "business-hours"
when
...
then
...
end
希望对你有帮助
关于java - 流口水:限时规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14819615/
假设我有一群 N 人要乘火车旅行。我需要以最小化总门票成本的方式组织他们到售票处。如果一家人买家庭票,去同一目的地的人买团体票,成本可以降到最低。 我不知道这些人中谁是家人,他们要去哪里旅行。 我能做
限时 QQ音乐幸运狂欢PARTY 最高可抽豪华绿钻24个月 手机打开链接 登录即可参与活动 每人登录就有两次机会 分享一下活动还有一次机会 必中项目 但是抽中什么就看自己的了 反正小编抽中的都是
我有一个 Python 脚本,其中我连接到 MQTT 服务器。我希望通过我订阅的主题收到消息,但如果我没有收到消息,我想完全终止脚本。 我正在使用的脚本如下所示: #!/usr/bin/python
我有一个客户想在线销售教程视频。我已经预览了他从 CF 流式传输的教程(这是公开的)。现在我想使用 c# sdk 生成私有(private)的、有时间限制的 URL,以允许购买教程的客户在有限的时间段
如何使用 AWS SDK 创建云端签名 URL ? 这看起来确实应该很容易做到,但我就是看不到。我大体上了解它是如何工作的,并且可能会拼凑简单的 Java 代码来自己完成。 AWS SDK 没有为此提
我是一名优秀的程序员,十分优秀!