Java – loads drools / KIE workbench artifacts directly from the repository
We tried to switch to drools 6.0 using a new KIE workbench (formerly known as guvnor) and a new Maven based artifact
Now, I want to use the system described in this blog post in the second image ("deployment"): load rules from the workbench repository via HTTP (dashed arrow, enter the application directly from HTTP on the left)
The problem is that I don't know how to load artifacts into my kieservices / kiemodule object I basically don't want to use maven, and I can't provide Maven settings globally XML is used as the path of Java parameters, so this option has been shown
I think a similar problem is this one As mentioned there, I also tried to load a URL resource, but the problem seems to be that the system cannot determine what the resourcetype of a given URL is (http: / / localhost: 8080 / KIE) - drools / maven2 /... / - 1.0 0. Jar) yes Yes, I can access the in the repository directly from the browser Jar, no authentication required
How does any idea or tutorial do this?
My test code:
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
}
Error:
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)
... 2 more
Thank you in advance!
Solution
I finally managed to solve the problem The following is a working example that loads drools artifacts from the KIE repository via HTTP and executes rules:
package kieTest;
import java.util.Scanner;
import org.drools.compiler.kproject.ReleaseIdImpl;
import org.kie.api.KieServices;
import org.kie.api.builder.KieScanner;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.StatelessKieSession;
public class MainKieTest {
public static void main(String[] args) {
// works even without -SNAPSHOT versions
String url = "http://localhost:8080/kie-drools/maven2/de/test/Test/1.2.3/Test-1.2.3.jar";
// make sure you use "LATEST" here!
ReleaseIdImpl releaseId = new ReleaseIdImpl("de.test","Test","LATEST");
KieServices ks = KieServices.Factory.get();
ks.getResources().newUrlResource(url);
KieContainer kieContainer = ks.newKieContainer(releaseId);
// check every 5 seconds if there is a new version at the URL
KieScanner kieScanner = ks.newKieScanner(kieContainer);
kieScanner.start(5000L);
// alternatively:
// kieScanner.scanNow();
Scanner scanner = new Scanner(system.in);
while (true) {
runRule(kieContainer);
System.out.println("Press enter in order to run the test again....");
scanner.nextLine();
}
}
private static void runRule(KieContainer kieKontainer) {
StatelessKieSession kSession = kieKontainer.newStatelessKieSession("testSession");
kSession.setGlobal("out",System.out);
kSession.execute("testRuleAgain");
}
}
When searching for solutions, I find the following links useful:
> http://www.skills421.com/tutorials-drools-components.jsp > http://blog.athico.com/2013/12/deployment-with-drools-60.html
I hope someone will find this useful when using so as the first search result; -)
