我刚刚安装了Java 8的最终版本.当我尝试使用Maven构建我的项目时,如果我使用Java 8,许多测试都会失败,但是使用Java 7会很好.我尝试通过命令行运行它,并将JAVA_HOME设置为C:\ Program Files\Java\jdk1.8.0并通过Eclipse选择jdk1.8.0作为已安装JRE中的默认JRE.两者都失败了 请注意,失败的测试都使用Drools 6(及其依赖项).
这是输出:
-------------------------------------------------------------------------------
Test set: com.local.lds.rules.LocmChiTest
-------------------------------------------------------------------------------
Tests run: 3, Failures: 0, Errors: 3, Skipped: 0, Time elapsed: 1.245 sec <<< FAILURE!
test(com.local.lds.rules.LocmChiTest) Time elapsed: 0.001 sec <<< ERROR!
java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:187)
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at mockit.internal.util.MethodReflection.invoke(MethodReflection.java:63)
at mockit.Invocation.proceed(Invocation.java:192)
at mockit.integration.junit4.internal.BlockJUnit4ClassRunnerDecorator.createTest(BlockJUnit4ClassRunnerDecorator.java:59)
at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at mockit.internal.util.MethodReflection.invokeWithCheckedThrows(MethodReflection.java:95)
at mockit.internal.mockups.MockMethodBridge.callMock(MockMethodBridge.java:75)
at mockit.internal.mockups.MockMethodBridge.invoke(MockMethodBridge.java:41)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:236)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) …
Run Code Online (Sandbox Code Playgroud) 我有一个问题,其中一个drools规则的when子句抛出一个MethodNotFoundException.我正在寻找一种方法来确定它在运行时的规则,以便能够从要使用的规则列表中删除它.
规则示例
Rule "FooBar"
when
$V1 : Foo ( ) AND
$V2 : FooBar( ) from $V1.getGoodMethod() AND
$V3 : FooBarBar( status == "FooBar" ) from $V2.getBadMethod()
reply : FooFooBar()
then
reply.getList().add("FooBar");
end
Run Code Online (Sandbox Code Playgroud)
因此,FooBar上的getBadMethod不存在.我想要一种方法来告诉它是什么规则,并将其从要使用的规则列表中删除.
尝试和失败的解决方案:
我已经尝试扩展DefaultAgendaEventListener并覆盖beforeActivationFired方法,将要触发的规则添加到列表中.我希望列表中的最后一个是抛出错误的那个,但遗憾的是它并没有那么成功.
我现在尝试在我的所有规则之前添加"始终为真"的规则.它们记录了它之后的规则的名称.问题是当"WHEN"子句中存在异常时,不会记录任何内容.这就好像在发生上述异常时不会触发规则.
问题都在于动态drools生成代码.我想采取双管齐下的方法来修复生成代码,并捕获像本文中列出的异常.
旁注:我确实检查了构建器中的错误.我从下面的代码中没有收到任何错误.
KnowledgeBuilderErrors errors = builder.getErrors();
if (!errors.isEmpty()) {
for (KnowledgeBuilderError error : errors) {
...
}
}
Run Code Online (Sandbox Code Playgroud) 我尝试了一个示例,看看议程小组的工作原理.最初,我将ksession的重点放在议程组"ag1"上,并解除了规则.
package com.sample
import com.sample.DroolsTest.Message;
rule "Hello World"
agenda-group "ag1"
when
m : Message( status == Message.HELLO, myMessage : message )
then
System.out.println( "Hello World" );
m.setMessage( "Goodbye cruel world" );
m.setStatus( Message.GOODBYE );
update( m );
end
rule "Hello World 2"
agenda-group "ag2"
when
m : Message( status == Message.HELLO, myMessage : message )
then
System.out.println( "Hello World 2" );
m.setMessage( "Goodbye cruel world" );
m.setStatus( Message.GOODBYE );
update( m );
end
rule "GoodBye"
agenda-group "ag1"
when
m : …
Run Code Online (Sandbox Code Playgroud) 可以在运行时动态地定义规则吗?还可以在运行时更改规则集.
例如,
at time = t_1 the ruleset is { R1, R2, R3 }
at time = t_2 the ruleset is { R1, R3, R4 }
.....
Run Code Online (Sandbox Code Playgroud)
R1,R2是在运行时定义的规则.
谢谢.
我计划引入Java规则,目前正在评估Drools以从应用程序外部化(物理地和逻辑地)业务规则.
由于这些业务规则经常由业务部门提供,我希望业务部门通过GUI对规则进行必要的更改.
我已经谷歌搜索集成java Web应用程序+ Drools + Guvnor,我没有得到任何地方.
我的问题:
关于通常简单实现集成Java Application + Drools + Guvnor的任何其他建议都会很棒.
任何指向教程的指针也会为我做.
我有一个.DRL文件,它说了10个规则.一旦我插入事实,可能会匹配一些规则 - 如何找出以编程方式匹配的规则?
我们使用Drools作为解决方案的一部分,在一个非常密集的处理应用程序中充当一种过滤器,可能在500,000个工作内存对象上运行多达100个规则.事实证明它非常慢.有没有其他人在批处理类型处理应用程序中使用Drools的经验?
目前我将所有规则文件存储在文件系统上(它们有很多版本),并在启动时将它们的不同版本加载到内存中.我想更改为将我的drools文件存储在一个数据库中,并想知道是否有任何解决方案或Drools插件可以促进这个或我应该自己制作?
谢谢.
我糊涂了.我正在为我的公司开发基于grails的内部工具.此工具中的一个组件是一个简单的问题跟踪器(帮助台功能).我有域对象,如问题,问题和NewFeature.每个域类都有不同的工作流程.
我最初的想法是在域对象中滚动我自己的状态机功能.然后我用Google搜索状态机引擎和工作流引擎.而现在我迷路了.
我想评论其他开发人员如何解决这个问题.你用Drools,Jbpm,Activiti吗?还是一些更简单的状态机引擎?
我一直在阅读Drools,Jbpm的一些文档.他们看起来很漂亮.但似乎我只需要这些库提供的一小部分功能.
我正在使用Grails,但它当然也很容易使用Java库.
我是optaplanner的新手,我希望用它来解决拾取和交付的VRPTW问题(VRPTWPD).
我首先从示例repo中获取VRPTW代码.我想添加它来解决我的问题.但是,我无法返回一个符合优先级/车辆限制的解决方案(必须在交付之前完成拾取,并且两者必须由同一车辆完成).
我一直在返回一个解决方案,其中硬分数是我期望的这样一个解决方案(即我可以在一个小样本问题中加起来所有违规,并看到硬分数与我为这些违规分配的处罚相匹配).
我尝试的第一种方法是遵循Geoffrey De Smet在此处概述的步骤 - /sf/answers/1336104731/
每个Customer
都有一个变量customerType
,描述它是一个皮卡(PU)还是一个交付(DO).它还有一个名为变量的变量parcelId
,用于指示要拾取或交付的包裹.
我在Customer
命名中添加了一个阴影变量parcelIdsOnboard
.这是一个HashSet,它包含了驾驶员在访问给定时所拥有的所有parcelId Customer
.
VariableListener
保持parcelIdsOnboard
更新的我看起来像这样:
public void afterEntityAdded(ScoreDirector scoreDirector, Customer customer) {
if (customer instanceof TimeWindowedCustomer) {
updateParcelsOnboard(scoreDirector, (TimeWindowedCustomer) customer);
}
}
public void afterVariableChanged(ScoreDirector scoreDirector, Customer customer) {
if (customer instanceof TimeWindowedCustomer) {
updateParcelsOnboard(scoreDirector, (TimeWindowedCustomer) customer);
}
}
protected void updateParcelsOnboard(ScoreDirector scoreDirector, TimeWindowedCustomer sourceCustomer) {
Standstill previousStandstill = sourceCustomer.getPreviousStandstill();
Set<Integer> parcelIdsOnboard = (previousStandstill instanceof …
Run Code Online (Sandbox Code Playgroud)