0

Guvnor で BRL ルールに行き詰まっています.Drools Server を使用してアプリケーションからルールを実行しようとしています (このソリューションは、本番環境ではより多くのサーバーを使用してパフォーマンスを向上させることができるためです..初めてなので、これについてはわかりません私の会社では Drools を使用しています)。

したがって、基本的なルールは.. jar の guvnor にアップロードしたプロパティ "selectedOutboundJourney" を設定するオブジェクト Route が与えられた場合、プロパティ "selectedReturnJourney" が設定された別のオブジェクトを取得したい.. (しかし、取得することは可能ですか?同じオブジェクト??) 実際には、selectedReturnJourney が null である Route オブジェクトを取得します。

私が抱えている問題を考えると、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

誰か助けてくれませんか?

4

1 に答える 1

0

次のルールの実行後、開始時にナレッジ セッションにファクトが 1 つしかないと仮定します。

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

Route2 つ目のファクトを挿入したので、セッションには 2 つのファクトがあります。

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
于 2013-09-04T10:29:49.027 に答える