2017-03-21 10 views
0

私は関数の引数として渡されるStringの形式のルールを持っていますが、これはどのファイルにも格納されていません。私がこれまで読んだことから、APIが非常に異なっていると推測している6以前のバージョンでは、これに対する多くの解決策があります。Droolsの文字列からルールをロードする方法6.5

KieFileSystem kfs = kService.newKieFileSystem(); 
Resource drlResource = ResourceFactory.newByteArrayResource(rules.getBytes()); 
drlResource.setResourceType(ResourceType.DRL); 
kfs.write(drlResource); 
KieBuilder builder = kService.newKieBuilder(kfs).buildAll(); 

しかし、私は実行したときに、これはというエラーを投げている:

java.lang.RuntimeException: Resource does not have neither a source nor a target path. Impossible to add it to the bundle. Please set either the source or target name of the resource before adding it.ByteArrayResource[bytes=[105, 109, 112, 111, 114, 116, 32, 106, 97, 118, ...], encoding=null] 
at org.drools.compiler.kie.builder.impl.KieFileSystemImpl.write(KieFileSystemImpl.java:95) 

しかし、これはこれまでのところ私のソリューションです

を(彼らは6.5で廃止されナレッジベースを、使用することをお勧め)ここにソースファイルがありません。どのようにしてStringをルールリソースに変換できますか?

私はDrools 6.5.0.Finalを使用しています。

答えて

0

あなたはこれを使用する可能性があります:

String drl = "..."; 
KieServices kieServices = KieServices.Factory.get(); 
KieFileSystem kfs = kieServices.newKieFileSystem(); 
kfs.write("src/main/resources/simple.drl", 
    kieServices.getResources().newReaderResource(new StringReader(drl))); 
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); 

それはDroolsのAPIですぐそこです - 1はそれを見つける必要があります。

Javadocには、メソッド名と型名を参照できるインデックスがあります。 「KieFileSystemが慣れメモリ内のファイルシステムである...」それがどのように動作するかを確認するには、ソースコードを見て:インタフェースは

org.kie.api.KieServices 
org.kie.api.builder.KieFileSystem 
org.kie.api.io.KieResources 
org.kie.api.io.Resource 

のJavadocです。

+0

私はこれを見つけることができませんでした。 'kfs.write()'はその場所に一時ファイルを作成しますか?どのように機能するのですか? – ar7

+0

"src/main/rules/abc.drl"(任意のユーザ定義パス)を使用している場合は、正しい構文ですか? "src/main/resources/simple.drl"の代わりにmavenを使用していませんか?私の場合、ルールを実行していないにもかかわらず、何のエラーも投げていません。私は問題にこだわっている、助けてください。 –

+0

@NamrataChoudharyコメントは新しい質問をするためのものではありません。あなた自身の質問にルールとJavaコードを表示する。 – laune

0
KieServices ks = KieServices.Factory.get(); 
     KieContainer kContainer = ks.getKieClasspathContainer(); 
     KieSession kSession = kContainer.newKieSession("ksession-rules"); 
     kSession.insert(createCommlObject()); 

キエモジュールはすべて.drlファイルをロードします。負荷の選択.drlを使用する場合は、

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
    kbuilder.add(ResourceFactory.newClassPathResource("Rules.drl"), ResourceType.DRL); 
関連する問題