我想知道是否有一种方法可以在规则之间定义层次结构(而不仅仅是执行顺序)并控制规则执行 - 即如果父规则被触发,那么下面的规则不应该被评估等等......
此线程中的信息是一个选项,但它基本上是IF/THEN/ELSE
有不同的选择吗?
谢谢
我取消部署使用异步记录器的Java EE应用程序,该异步记录器从Drools规则引擎登录自己的线程.我使用它来记录规则引擎所做的决定,但我不能让它对吞吐量产生影响,因此它必须在自己的线程中运行.
当我取消部署它时,我得到了异常页面,表明它没有正确关闭.这可能是真的,因为记录器只是这样的一个线程:
while(true){
log(something)
sleep(someTime);
}
Run Code Online (Sandbox Code Playgroud)
它在睡眠和取消部署开始时可能没有时间做出正确的反应.不幸的是我无法从记录器中获取线程,因此我无法在@PreDestroy方法中加入它.取消部署时如何避免异常?
豁免:
[#|2010-07-19T15:50:10.123+0200|WARNING|sun-appserver2.1|javax.enterprise.system.core.classloading|_ThreadID=24;_ThreadName=Thread-258;_RequestID=22a7d379-0813-4248-9095-3fba7f4cb95a;|LDR5206: EJBClassLoader EJBClassLoader :
doneCalled = true
doneSnapshot = EJBClassLoader.done() called ON EJBClassLoader :
urlSet = [URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/jaxp-api-1.3.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/mvel2-2.0.10.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/activation-1.1.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/stax-1.2.0.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/jms-1.1.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/commons-lang-2.4.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/joda-time-1.6.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/drools-compiler-5.0.1.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/commons-email-1.2.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/commons-beanutils-core-1.8.0.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/Mailforwarder-pojo-1.0.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/xml-apis-1.0.b2.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/commons-logging-1.1.1.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/janino-2.5.15.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/commons-digester-1.8.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/drools-api-5.0.1.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/commons-net-2.0.jar, URLEntry : file:/home/arne/env/runtime/glassfish/domains/domain1/applications/j2ee-apps/mailforwarder/lib/commons-lang-2.5.jar, URLEntry …
Run Code Online (Sandbox Code Playgroud) 背景:
我正在开发一个应用程序,它根据一组drools规则将输入对象转换为两个输出对象之一.直到运行时才知道输出对象,并在第一个要执行的规则中创建它.
以下是创建输出对象的规则和示例转换规则:
rule "Initialization"
dialect "java"
salience 1000
no-loop true
when
t : Trade()
then
if(t.getTran().getInsType().equalsIgnoreCase("EEO") ||
t.getTran().getInsType().equalsIgnoreCase("EEF"))
{
insert(new Option());
}
else
{
insert(new Swap());
}
end
rule "Example Rule"
dialect "java"
when
t : Trade()
opt : Option()
then
opt.setCounterpartyName(t.getTran().getCParty());
end
Run Code Online (Sandbox Code Playgroud)
以下是调用规则的代码:
private void test(){
for(File xmlFile : getXmlFilesFromDirectory(XML_DIRECTORY))
{
Trade trade = (Trade)unmarshall(xmlFile, Trade.class);
KnowledgeBase kbase = readKnowledgeBase();
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
List<Command> commands = new ArrayList<Command>();
commands.add(CommandFactory.newInsert(trade, "trade"));
commands.add(CommandFactory.newFireAllRules());
ExecutionResults results …
Run Code Online (Sandbox Code Playgroud) 我必须用drools来实现一个应用程序,但看起来DROOLS不能同时推理大量的对象.我想知道它是否可以推理存储在关系数据库中而不是存储在workingMemory中的数据.
谢谢你的帮助 :)
我正在开始一个Drools和Drools Guvnor的项目.
我的规则部署在drools guvnor中.当您执行包发布构建和发布时,我的规则引擎实例可以通过drools Guvnor公开的pkg文件访问这些规则.
这一切都运行正常,我正在寻找的是一种在运行时禁用规则的解决方案.
我现在唯一的解决方案是转到guvnor,归档规则并对包含该规则的包进行构建+发布.
是不是有另一种策略?
我需要一点Drools eval和变量赋值的帮助.
rule "check that no previously submitted requests exist"
when
$user : UserFormField( name == 'employeeId', value != null )
$repository : Repository( )
$activeRequests : List( ) from $repository.findActiveRequestsByEmployee( $user.getValue() ) # call to repository
eval( $activeRequests.size() > 0 )
then
System.err.println(' You have active requests: ' + ((Request)$activeRequests.get(0)).getTitle);
insert(Boolean.TRUE);
end
Run Code Online (Sandbox Code Playgroud)
在此规则中,我尝试访问存储库并获取当前用户的活动请求.规则编译和执行,没有任何例外或警告.在调试模式下,可以看到存储库返回非空列表,我希望看到控制台消息"您有活动请求",但这不会发生.我认为问题出在这一行
$activeRequests : List( ) from $repository.findActiveRequestsByEmployee( $user.getValue() )
Run Code Online (Sandbox Code Playgroud)
因为这条规则很好
rule "check that no previously submitted requests exist"
when
$user : UserFormField( name == 'employeeId', value != …
Run Code Online (Sandbox Code Playgroud) 以下是使用"无循环"的规则示例:
rule "Even Number Rule"
dialect "java"
no-loop
when
n : Number( number !=0 && (number%2)==0 , value : number)
then
modify(n){setNumber(8)};
end
Run Code Online (Sandbox Code Playgroud) 我们尝试使用全新的KIE工作台(以前称为Guvnor)和新的基于maven的工件切换到Drools 6.
现在我想在第二张图片("部署")中使用本博文中描述的系统:通过HTTP从工作台存储库加载规则(虚线箭头,从左边的HTTP直接进入应用程序) .
问题是,我不知道如何将工件加载到我的KieServices/KieModule对象中.我基本上不想使用maven,我也无法提供maven settings.xml
作为Java参数的全局路径,所以这个选项已经出来了.
我认为,类似的问题是这一个.正如那里提到的,我也试图加载一个URL资源,但问题似乎是系统无法确定ResourceType
给定的URL(http://localhost:8080/kie-drools/maven2/.../-1.0.0.jar
)是什么类型.是的,我可以直接从浏览器访问存储库中的.jar,无需身份验证.
任何想法或教程如何做到这一点?
我的测试代码:
public static void main(String[] args) {
KieServices ks = KieServices.Factory.get();
KieRepository repo = ks.getRepository();
String url = "http://localhost:8080/kie-drools/maven2/de/test/test/1.0.0/test-1.0.0.jar";
Resource urlResource = ks.getResources().newUrlResource(url);
KieModule kModule = repo.addKieModule(urlResource); // this already fails
}
Run Code Online (Sandbox Code Playgroud)
错误:
Exception in thread "main" java.lang.RuntimeException: Unable to fetch module from resource :[UrlResource path='http://localhost:8080/kie-drools/maven2/de/itm/Herma400/1.0.1/Herma400-1.0.1.jar']
at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.getKieModule(KieRepositoryImpl.java:205)
at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.addKieModule(KieRepositoryImpl.java:161)
at kieTest.MainKieTest.main(MainKieTest.java:24)
Caused by: java.lang.NullPointerException
at org.drools.compiler.kie.builder.impl.ClasspathKieProject.getPomProperties(ClasspathKieProject.java:197)
at org.drools.compiler.kie.builder.impl.ClasspathKieProject.fetchKModule(ClasspathKieProject.java:148)
at org.drools.compiler.kie.builder.impl.ClasspathKieProject.fetchKModule(ClasspathKieProject.java:109)
at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.getKieModule(KieRepositoryImpl.java:190) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用注入集成的kie(drools 6)构建一个web(spring-mvc)应用程序.我使用kie workbench创建了一个工作流程,编译和部署.我已经在我的项目的pom.xml中添加了这个工件的引用,并根据这篇博客文章添加了本地kie-workbench存储库,并且它工作正常(在我的maven/spring项目中将工件作为依赖项拉入).我想要做的是在我的一个服务中注入kiesession作为依赖与下面的片段 -
@Service
public class TniServiceImpl implements TniService {
@Inject
@KSession("tniSession")
private KieSession tniSession;
...
}
Run Code Online (Sandbox Code Playgroud)
在我的root-context.xml中,我添加了kie名称空间以及对xsd的引用.我添加了org.kie.spring.KModuleBeanFactoryPostProcessor以及每个drools文档.我正在尝试为KSession扫描和注入进行CDI注入工作(它已经在同一个项目中使用@Inject工作了我的其他组件).到目前为止,我总是得到"没有找到类型[org.kie.api.runtime.KieSession]的限定bean依赖"错误.看起来spring无法扫描其中可用的kie模块和会话.需要以下帮助 -
我的环境如下 -
我已经通过以下链接,但没有运气(大多数情况下他们没有尝试做我的意思) -
我很感激,如果有人可以指导我在这里可能缺少什么,或者如果没有选择,只能在spring配置文件中明确定义所有kmodules/ksessions.
我正在尝试使用S3存储桶作为远程maven存储库,通过该存储库将使用kie workbench UI创建的规则jar分发到需要它们的位置.
如果我从我的IDE中使用maven打包规则,我可以使用Maven S3货车扩展和分发管理将jar成功上传到s3,它运行正常.它们在maven部署阶段成功上传.
我试图从工作台UI(使用Business Central Workbench 7.15.0 Final和Wildfly 14.0.Final.)中实现相同的功能.基本上按下"构建和部署"按钮以导致经过验证的构建,然后上传到标记s3存储桶中定义的内容.
遗憾的是,这会导致错误:
Caused by: org.eclipse.aether.deployment.DeploymentException: Failed to deploy artifacts/metadata: Cannot access s3://my-repo/snapshot with type default using the available connector factories: BasicRepositoryConnectorFactory
at org.eclipse.aether.internal.impl.DefaultDeployer.deploy(DefaultDeployer.java:269)
at org.eclipse.aether.internal.impl.DefaultDeployer.deploy(DefaultDeployer.java:245)
at org.eclipse.aether.internal.impl.DefaultRepositorySystem.deploy(DefaultRepositorySystem.java:420)
at org.guvnor.m2repo.backend.server.repositories.DistributionManagementArtifactRepository.deploy(DistributionManagementArtifactRepository.java:140)
... 107 more
Caused by: org.eclipse.aether.transfer.NoRepositoryConnectorException: Cannot access s3://my-repo/snapshot with type default using the available connector factories: BasicRepositoryConnectorFactory
at org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider.newRepositoryConnector(DefaultRepositoryConnectorProvider.java:174)
at org.eclipse.aether.internal.impl.DefaultDeployer.deploy(DefaultDeployer.java:265)
... 110 more
Caused by: org.eclipse.aether.transfer.NoRepositoryConnectorException: Cannot access s3://my-repo/snapshot using the registered transporter factories: HttpTransporterFactory, FileTransporterFactory
at org.eclipse.aether.connector.basic.BasicRepositoryConnector.<init>(BasicRepositoryConnector.java:119)
at …
Run Code Online (Sandbox Code Playgroud)