标签: drools

Drools - 规则层次结构和条件执行

我想知道是否有一种方法可以在规则之间定义层次结构(而不​​仅仅是执行顺序)并控制规则执行 - 即如果父规则被触发,那么下面的规则不应该被评估等等......

此线程中的信息是一个选项,但它基本上是IF/THEN/ELSE

有不同的选择吗?

谢谢

nested rules drools hierarchy

9
推荐指数
1
解决办法
6436
查看次数

如何在取消部署Java EE应用程序时停止线程?

我取消部署使用异步记录器的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)

java deployment multithreading drools java-ee

8
推荐指数
1
解决办法
7722
查看次数

如何在运行时在Drools DRL中将事实添加到工作内存中,并在无状态会话的执行结果中检索它们?

背景:

我正在开发一个应用程序,它根据一组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)

java drools

8
推荐指数
1
解决办法
1万
查看次数

可能会对存储在关系数据库中的数据产生影响(例如使用HIbernate)

我必须用drools来实现一个应用程序,但看起来DROOLS不能同时推理大量的对象.我想知道它是否可以推理存储在关系数据库中而不是存储在workingMemory中的数据.

谢谢你的帮助 :)

hibernate rule-engine drools relational-database

8
推荐指数
1
解决办法
5772
查看次数

Drools在运行时禁用规则

我正在开始一个Drools和Drools Guvnor的项目.

我的规则部署在drools guvnor中.当您执行包发布构建和发布时,我的规则引擎实例可以通过drools Guvnor公开的pkg文件访问这些规则.

这一切都运行正常,我正在寻找的是一种在运行时禁用规则的解决方案.

我现在唯一的解决方案是转到guvnor,归档规则并对包含该规则的包进行构建+发布.

是不是有另一种策略?

rule-engine drools

8
推荐指数
1
解决办法
8514
查看次数

Drools在运行时从数据库中获取事实

我需要一点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)

drools

8
推荐指数
1
解决办法
2534
查看次数

drools中无循环和锁定活动之间的区别是什么

以下是使用"无循环"的规则示例:

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)

drools

8
推荐指数
1
解决办法
1万
查看次数

直接从存储库加载Drools/KIE Workbench工件

我们尝试使用全新的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)

java drools maven drools-guvnor kie

8
推荐指数
2
解决办法
3万
查看次数

drools-6(kie)自动扫描(从春季开始)模块和来自kie workbench部署工件的会话

我正在尝试使用注入集成的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模块和会话.需要以下帮助 -

  1. CDI是否真的支持弹簧?我一定要配置kmodules和kession明确这里所说
  2. 我在这里遗漏了一些应该使扫描和注射工作的东西吗?

我的环境如下 -

  1. spring 3.2.6-RELEASE(包括webmvc和其他组件)
  2. kie-api-6.0.1.FINAL
  3. kie-spring-6.0.1.FINAL
  4. kie-internal-6.0.1.FINAL

我已经通过以下链接,但没有运气(大多数情况下他们没有尝试做我的意思) -

  1. 直接从存储库加载Drools/KIE Workbench工件
  2. 为什么将Drools 6 KIE JAR加载到代码失败?

我很感激,如果有人可以指导我在这里可能缺少什么,或者如果没有选择,只能在spring配置文件中明确定义所有kmodules/ksessions.

spring drools jbpm kie

8
推荐指数
1
解决办法
6455
查看次数

如何从kie工作台内部将规则kjar部署到S3存储桶?

我正在尝试使用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)

drools amazon-s3 amazon-web-services kie-wb kie-workbench

8
推荐指数
0
解决办法
229
查看次数