Drools + Guvnor + Tomcat

0 votes
asked May 11, 2013 in SzolgInt by mvince (324 points)  

Sziasztok!

Immár 20 órája szórakozok a címben említett eszközök összelövésével, mindeddig sikertelenül. A cél az lenne, hogy egy tomcat szerveren futó guvnorban összerakott tudásbázist package formában megegyen egy ugyanitt futó drools szerver.

A legjobb eredméy, ameddig nagyjából vakon tapogatózva eljutottam, az volt, hogy minden eszköz hiba nélkül elindult, azonban a drools szerver üres válaszokat adott vissza minden bemenetre.

Kezdetben egy Ubuntun próbálkoztam, majd átálltam a saját gépemen lévő Windowsra. Miután rájöttem, hogy a drools és a guvnor csak azonos verziószám mellett kompatibilisek (különböző java objektumok szerializálási verziószáma miatt), a következő kombinációkkal kísérleteztem:

  • Tomcat 6 + Guvnor 5.2 + Drools 5.2
  • Tomcat 6 + Guvnor 5.5 + Drools 5.5
  • Tomcat 7 + Guvnor 5.2 + Drools 5.2
  • Tomcat 7 + Guvnor 5.5 + Drools 5.5
  • Tomcat 7 + Guvnor 6.0 (beta) + Drools 6.0 (beta)

A kapott hibaüzenetek sokszínűsége ezt a listát bőségesen felülmúlja, illetve az ötletszerű és különböző fórumok és levelezőlisták ihlette konfiguráció-piszkálgatások miatt nem tudom megmondani, hogy pontosan mit csináltam és annak mi volt az eredménye. A hibaüzenetek között gyakori a PermGen OutOfMemoryException, a memóriaszivárgás, a szerver végtelen ciklusba ragadása és ezzel párhuzamosan újraindíthatatlansága, különböző springes listenerek hibaüzenetei, java verziószám problémák (az 5.2-es verziók nem működnek 1.7-es Java-val, bár két fájlban kell csak egy-egy sort átírni, hogy ezt az akadályt legyőzzük), a ClassNotFoundException, különböző fájlok írásának megtagadásából származó hibák (jellemzően windows-on), illetve még néhány amit nem tudtam megjegyezni.

A 6-os béta verziókból a Guvnor használhatatlan, és nem tudja beimportálni az korábban már az 5.2-es verzióval elkészített deklaratív modellemet és a hozzájuk tartozó szabályokat. Az üres válaszokig emlékeim szerint Ubuntun, Tomcat 6 + Drools 5.2 + Guvnor 5.2 kombinációval jutottam el, azóta nem sikerült ezt rekonstruálni. A többi esetben előbb-utóbb mindig hibákba futok.

Valószínű, hogy a 20 órányi szerencsétlenkedés okozta elmeállapotban már egészen nyilvánvaló dolgokat sem veszek észre, mindenesetre a kérdésem/kérésem arra vonatkozna, hogy össze tudta-e már rakni ezt valaki? Ha igen, hogyan? Ha nem, akkor megkérhetnék valakit az oktatók közül, hogy próbálkozzon meg ezzel, és ossza meg velünk a tapasztalatait például egy tutorial formájában?

Utolsó ZS tervként még ott van az a verzió, hogy POJO objektumokkal és dlr fájllal dolgozzak, de nagyon jó lenne a már kész guvnoros package-et használni, és nem újrakezdeni a "betanuló fázist" egy másféle megoldással.

Előre is köszönöm a segítséget!

1 Answer

+1 vote
answered May 12, 2013 by gurbanics (56 points)  
edited May 12, 2013 by gurbanics
 
Best answer

Szia!

Én a következőt próbáltam meg:
- Tomcat 6.0.37 (a legutolsó 6-os sorozat; érdemes a zip-et letölteni, mert a tar.gz-ből hiányoznak a Linux-os indító/leállító szkriptek)
- Drools 5.5.0.Final release-ből [1] a guvnor-distribution-5.5.0.Final.zip-et és a droolsjbpm-integration-distribution-5.5.0.Final.zip-et használtam. Utóbbiban van benne a Drools server

Én nagyjából a következő forgatókönyv szerint haladtam:

  1. Elindítottam a Tomcat-et.

  2. Letöltés és kitömörítés után telepítettem a Guvnor-t a Tomcatbe: átmásoltam a guvnor-distribution-5.5.0.Final/binaries/guvnor-5.5.0.Final-tomcat-6.0.war fájlt a Tomcat webapps mappájába. Picit játszottam vele, hogy elkészítse a minta csomagokat, nem akartam sajátot csinálni.

  3. A Drools Server, ami inkább egy példa konfiguráció (a Drools-os Camel komponensek és Drools szabályok összedrótozása Spring-es konfigfájlokkal egy webappba) a droolsjbpm-integration-distribution-5.5.0.Final/binaries/drools-camel-server-example-5.5.0.Final.war fájlban található. Tekintve, hogy ez csak egy szabályt és egy a .drl-ben definiált osztályt tartalmaz, ezt én kiegészítettem egy újabb resource-szal, azzal, ami majd a webapp inicializálásakor betölti a Guvnor-os egyik példa package-et. Ehhez a .war fájlon belül a WEB-INF/classes/knowledge-services.xml fájlt kiegészítettem úgy, hogy a meglévő DRL resource mellé felvettem a következőt:

    <drools:resource type="PKG" 
    source="http://localhost:8080/guvnor-5.5.0.Final-tomcat-6.0/org.drools.guvnor.Guvnor/package/mortgages/TEST"
    basic-authentication="enabled"
    username="guest"
    password="guest"/>
    

    Ez persze azt feltételezi, hogy a Guvnor a localhost:8080/guvnor-5.5.0.Final-tomcat-6.0 URL-en érhető el. Annak még utána kell gondolni/olvasni, hogy ez valóban jó megoldás-e és pl. a Drools server követi-e a változásokat a package-ben vagy csak indításkor behúzza és kész (ill. ha csak az utóbbi, akkor az elég-e).

  4. Ekkor én ott tartottam, hogy fut a Guvnor, amiben van egy Drools package és azt az ugyanabban Tomcat-ben futó Drools server is megette.

  5. A Jersey library [2] felhasználásával készíttetem egy egyszerű REST klienst, ami beszúr két tényt a Drools server tudásbázisába és hagyja tüzelni az összes szabályt:

        String request2 = "<batch-execution lookup=\"ksession1\">\n" + 
            "  <insert out-identifier=\"application1\">\n" + 
            "     <mortgages.LoanApplication>\n" + 
            "     </mortgages.LoanApplication>\n" + 
            "   </insert>\n" + 
            "  <insert out-identifier=\"applicant1\">\n" + 
            "     <mortgages.Applicant>\n" + 
            "       <age>18</age>\n" + 
            "     </mortgages.Applicant>\n" + 
            "   </insert>\n" + 
            "  <fire-all-rules max=\"-1\"/>\n" + 
            "</batch-execution>";
    
        String rootPath = 
            "http://localhost:8080/drools-camel-server-example-5.5.0.Final/kservice/rest";
    
    Client client = Client.create();
    
    WebResource ws = client.resource(rootPath+"/execute");
    
    ClientResponse response = ws.
            accept(MediaType.TEXT_PLAIN_TYPE).
            type(MediaType.TEXT_PLAIN_TYPE).
            post(ClientResponse.class, request2);
    
    String responseStr = response.getEntity(String.class);
    
    System.out.println("Server responded:");
    System.out.println(responseStr);
    

    Ehhez pár megjegyzés:

    • a Drools server nekem a *http://localhost:8080/drools-camel-server-example-5.5.0.Final* URL-en volt elérhető, pontosabban a REST interfész a /kservice/rest alatt
    • Itt nem szép, hogy az XML-t nekem kell összerakni és sajnos a REST interfész sima szöveget vár, ezen azt hiszem lehet okosítani... de ezzel már nem akartam foglalkozni.
  6. Erre egy ilyesmi választ kapunk:

    Server responded:
    <?xml version='1.0' encoding='UTF-8'?><execution-results><result identifier="applicant1"><mortgages.Applicant><age>18</age></mortgages.Applicant></result><result identifier="application1"><mortgages.LoanApplication><approved>false</approved><explanation>Underage</explanation></mortgages.LoanApplication></result><fact-handle identifier="applicant1" external-form="0:3:797313603:797313603:3:DEFAULT"/><fact-handle identifier="application1" external-form="0:-1:1342723800:1342723800:2:null"/></execution-results>
    

A támogatott parancsokról és azok lehetséges formájáról [3] ír bővebben.

[1] http://downloads.jboss.org/drools/release/5.5.0.Final/
[2] https://jersey.java.net
[3] http://docs.jboss.org/drools/release/5.5.0.Final/droolsjbpm-integration-docs/html_single/#d0e980

Üdv,
Gábor

commented May 12, 2013 by mvince (324 points)  
Ez így tényleg működik, köszönöm! Két különbség van csak ahhoz képest, amivel próbálkoztam: én nem adtam meg felhasználónevet és jelszót, illetve kikommenteztem a meglévő DLR resource-ot.
Sajnos a saját package-emet még mindig nem eszi meg, de ezt felteszem egy másik kérdésben inkább.
asked May 12, 2013 in SzolgInt by mvince (324 points)  
edited May 12, 2013 by mvince
Nem működik a Guvnor deklaratív modellje - CannotResolveClassException
...