当前位置: 首页 > 知识库问答 >
问题:

如何获取在Guvnor中创建BRL并查询Drools服务器的事实

胡星汉
2023-03-14

我在Guvnor遵守BRL规则。。我正在尝试使用Drools服务器从我的应用程序中执行规则(此解决方案是因为在生产中我可以使用更多服务器,并可能提高性能……对此不确定,因为这是我的公司第一次使用Drools)。。

所以基本上规则是。。给定一个对象路由设置属性“selectedOutboundJourney”,我上传到guvnor的一个jar中,我想获取另一个设置了属性“selectedReturnJourney”的对象。。(但是否可能得到相同的对象??)实际上,我得到了一个Route对象,其中SelectedReturnTravely为null。

考虑到我遇到的麻烦,我不确定使用BRL是否是一个好的解决方案。。对于那些想要更改规则或创建新规则的非技术人员来说,它似乎很容易使用。

无论如何

这是我在Guvnor中创建的BRL:

rule "Selected Return for Dover - Calais"
   dialect "mvel"
    when
        Route( selectedOutboundJourney == "DOCA" )
    then
        Route fact0 = new Route();
        fact0.setSelectedReturnJourney( "CADO" );
        insertLogical( fact0 );
        end

这是我正在使用的代码:

final List<Command> commands = new ArrayList<Command>();
final Command insertObjectCommand = CommandFactory.newInsert(input, RESULT, true, "default");
final Command getObjectCommand = CommandFactory.newGetObjects();
final Command fireAllRulesCommand = CommandFactory.newFireAllRules();
commands.add(insertObjectCommand);
commands.add(getObjectCommand);
commands.add(fireAllRulesCommand);

final ExecutionResults executionResults = droolsHttpClient.callDroolsServer(commands);
return executionResults.getValue(RESULT);

DroolsHttpClient类是:

public ExecutionResults callDroolsServer(final List<Command> commands) throws  DroolsException
{
    PostMethod postMethod = null;
    try
    {
        final HttpClient httpClient = new HttpClient();
        final String droolsServerHost = Config.getString(PoferriesrulesengineConstants.DROOLS_SERVER_HOST, "");
        final int droolsServerPort = Config.getInt(PoferriesrulesengineConstants.DROOLS_SERVER_PORT, 0);
        httpClient.getHostConfiguration().setHost(droolsServerHost, droolsServerPort);

        final String droolsServerUrl = Config.getString(PoferriesrulesengineConstants.DROOLS_SERVER_URL, "");
        postMethod = new PostMethod(droolsServerUrl);

        final BatchExecutionCommand command = CommandFactory.newBatchExecution(commands, PoferriesrulesengineConstants.DROOLS_SESSION);
        final XStream xStreamMarshaller = BatchExecutionHelper.newXStreamMarshaller();
        final String xmlCommand = xStreamMarshaller.toXML(command);

        final StringRequestEntity request = new StringRequestEntity(xmlCommand, MediaType.TEXT_PLAIN_VALUE, CharEncoding.UTF_8);
        postMethod.setRequestEntity(request);

        httpClient.executeMethod(postMethod);
        if (postMethod.getStatusCode() != 200)
        {
            throw new RuntimeException("Drools Communication Error, code: " + postMethod.getStatusCode());
        }
        final String response = postMethod.getResponseBodyAsString();

        final ExecutionResults executionResults = (ExecutionResults) xStreamMarshaller.fromXML(response);
        return executionResults;
    }
    catch (final Exception e)
    {
        throw new DroolsException(e.getMessage());
    }
    finally
    {
        postMethod.releaseConnection();
    }
}

如果我使用下面这样的DRL,那么不用getObjectCommand就可以完美地表达:

rule "Selected Return Routes for Dover Calais"

    when
    r : Route(selectedOutboundJourney == "DOCA")
then
    r.setSelectedReturnJourney("CADO")

end

有人能帮我吗?

共有1个答案

冯文彬
2023-03-14

假设在执行以下规则后,知识会话开始时只有一个事实

rule "Selected Return for Dover - Calais"
dialect "mvel"
when
    Route( selectedOutboundJourney == "DOCA" )
then
    Route fact0 = new Route()
    fact0.setSelectedReturnJourney( "CADO" )
    insert( fact0 )
end

您的会话中将有两个事实,因为您刚刚插入了第二个事实。

Route: selectedOutboundJourney = "DOCA", selectedReturnJourney=null
Route: selectedOutboundJourney = null, selectedReturnJourney="DACO"

如果要修改原始事实,请使用以下规则:

rule "Selected Return Routes for Dover Calais"
when
   $r : Route(selectedOutboundJourney == "DOCA")
then
   modify ($r) {
     selectedReturnJourney = "CADO"
   }
end
 类似资料:
  • 我们刚刚开始将Drools公开为RESTful web服务(从http://www.jboss.org/Drools/downloads.html中的Drools集成下载中的示例开始,我们的项目看起来类似于http://docs.jboss.org/Drools/release/5.4.0.cr1/droolsjbpm-integration-docs/html/ch03.html#)。这将产生一

  • 问题内容: 是否有任何教程或指南显示如何用PHP编写一个简单的Websockets服务器?我曾尝试在Google上寻找它,但没有找到很多。我找到了phpwebsockets,但是现在已经过时了,不支持最新的协议。我尝试自己更新它,但似乎不起作用。 和客户: 如果我的代码有任何错误,您可以帮我解决它吗?Firefox中的Concole说 问题答案: 我和您最近在同一条船上,这是我的工作: 1)我使用

  • 问题内容: 给定一个SSL密钥和证书,如何创建HTTPS服务? 问题答案: 我发现以下示例。 这适用于节点v0.1.94-v0.3.1。在新版本的节点中被删除。 直接从该来源:

  • 我在eclipse中创建了一个新服务器,但后来由于某种原因删除了它,现在我无法创建一个新服务器。我得到了Apache Tomcat7,但是当我从列表中选择Tomcat v7服务器时,服务器名称字段是不可编辑的,而且按钮也不工作(完成,下一步)。

  • 问题内容: 我正在从事AngularJs项目。我有一项可以设置和删除某些按钮上的事件的服务。我不想与按钮直接交互的另一项服务利用了该服务。但是,我希望通过第一个服务过滤并在第二个服务中处理按钮单击事件。由于我不希望第二个服务知道按钮,因此我认为我需要在第一个服务中创建一个自定义事件。单击按钮后,如何创建自定义事件并触发它? 提前致谢。 问题答案: 如果要在服务/指令之间发送事件,请使用: 并像这样