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
誰か助けてくれませんか?