Re: [rules-users] Drools and serialize
Sorry, I am new to java/drools. I have less than 1year practice. I know that my code it's bad, but my goal is to understand how it's work, then I can make some good stuff. I realise some improvement in this moment. (I have suppress the line that you are talking ;) ) Thank you for all tip. Serialize and de-serialize work fine. Have a nice day, Clement Pernot -- View this message in context: http://drools.46999.n3.nabble.com/Drools-and-serialize-tp3161882p3165175.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] Drools and serialize
You don't need the object output stream below - and it's very bad code to give access to the same output stream to two parents (the marshaller and the OOS in this case) as you can end up just writing garbage if they interleave their writes - you don't know the buffering policy that each parent is using. Thomas > -Original Message- > From: rules-users-boun...@lists.jboss.org [mailto:rules-users- > boun...@lists.jboss.org] On Behalf Of clement.pernot > Sent: 12 July 2011 13:53 > To: rules-users@lists.jboss.org > Subject: Re: [rules-users] Drools and serialize > > Thank you for all your tips. > > I think I have found the solution. (the project run) Now for test that, I try > to > make a project who can un-serialize this. > > There it is: > > package com.sample; > > import java.io.FileOutputStream; > import java.io.ObjectOutputStream; > import java.io.OutputStream; > import java.io.Serializable; > > import org.drools.KnowledgeBase; > import org.drools.KnowledgeBaseFactory; > import org.drools.builder.KnowledgeBuilder; > import org.drools.builder.KnowledgeBuilderError; > import org.drools.builder.KnowledgeBuilderErrors; > import org.drools.builder.KnowledgeBuilderFactory; > import org.drools.builder.ResourceType; > import org.drools.io.ResourceFactory; > import org.drools.marshalling.Marshaller; > import org.drools.marshalling.MarshallerFactory; > import org.drools.marshalling.ObjectMarshallingStrategy; > import org.drools.runtime.StatefulKnowledgeSession; > > > /** > * This is a sample class to launch a rule. > */ > public class test{ > >private static void compileRuleBase2( String drlPath, String rbPath ) > throws Exception { > KnowledgeBuilder kBuilder = > KnowledgeBuilderFactory.newKnowledgeBuilder(); > kBuilder.add( ResourceFactory.newFileResource( drlPath ), > ResourceType.DRL ); > if( kBuilder.hasErrors() ){ > for( KnowledgeBuilderError err: kBuilder.getErrors() ){ > System.err.println( err.toString() ); > } > throw new IllegalStateException( "DRL errors" ); > } > KnowledgeBase kBase = > KnowledgeBaseFactory.newKnowledgeBase(); > kBase.addKnowledgePackages( > kBuilder.getKnowledgePackages() ); > > try { > // load up the knowledge base > KnowledgeBase kbase = readKnowledgeBase(); > StatefulKnowledgeSession ksession = > kbase.newStatefulKnowledgeSession(); > > // go ! > Message message = new Message(); > message.setMessage("Hello World"); > message.setStatus(Message.HELLO); > > ksession.insert(message); > > ObjectMarshallingStrategy oms = > MarshallerFactory.newIdentityMarshallingStrategy(); > Marshaller marshaller = MarshallerFactory.newMarshaller( > ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ oms } ); > > OutputStream os = new FileOutputStream( rbPath ); > ObjectOutputStream oos = new ObjectOutputStream( os ); > marshaller.marshall( os, ksession ); > > oos.close(); > > ksession.fireAllRules(); > > > } catch (Throwable t) { > t.printStackTrace(); > } > > > } > > public static final void main(String[] args) { > try{ > compileRuleBase2("Sample.drl", > "drools_compiled_file_with_fact" ); > } catch (Exception e) { > e.printStackTrace(); > } > > } > > private static KnowledgeBase readKnowledgeBase() throws > Exception { > KnowledgeBuilder kbuilder = > KnowledgeBuilderFactory.newKnowledgeBuilder(); > > > kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), > ResourceType.DRL); > KnowledgeBuilderErrors errors = kbuilder.getErrors(); > if (errors.size() > 0) { > for (KnowledgeBuilderError error: errors) { > System.err.println(error); > } > throw new IllegalArgumentException("Could not > parse knowledge."); > } > KnowledgeBase kbase = > KnowledgeBaseFactory.newKnowledgeBase(); > >
Re: [rules-users] Drools and serialize
Thank you for all your tips. I think I have found the solution. (the project run) Now for test that, I try to make a project who can un-serialize this. There it is: package com.sample; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.Serializable; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.marshalling.Marshaller; import org.drools.marshalling.MarshallerFactory; import org.drools.marshalling.ObjectMarshallingStrategy; import org.drools.runtime.StatefulKnowledgeSession; /** * This is a sample class to launch a rule. */ public class test{ private static void compileRuleBase2( String drlPath, String rbPath ) throws Exception { KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( ResourceFactory.newFileResource( drlPath ), ResourceType.DRL ); if( kBuilder.hasErrors() ){ for( KnowledgeBuilderError err: kBuilder.getErrors() ){ System.err.println( err.toString() ); } throw new IllegalStateException( "DRL errors" ); } KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); try { // load up the knowledge base KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); // go ! Message message = new Message(); message.setMessage("Hello World"); message.setStatus(Message.HELLO); ksession.insert(message); ObjectMarshallingStrategy oms = MarshallerFactory.newIdentityMarshallingStrategy(); Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ oms } ); OutputStream os = new FileOutputStream( rbPath ); ObjectOutputStream oos = new ObjectOutputStream( os ); marshaller.marshall( os, ksession ); oos.close(); ksession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } } public static final void main(String[] args) { try{ compileRuleBase2("Sample.drl", "drools_compiled_file_with_fact" ); } catch (Exception e) { e.printStackTrace(); } } private static KnowledgeBase readKnowledgeBase() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors.size() > 0) { for (KnowledgeBuilderError error: errors) { System.err.println(error); } throw new IllegalArgumentException("Could not parse knowledge."); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); return kbase; } public static class Message implements Serializable{ public static final int HELLO = 0; public static final int GOODBYE = 1; private String message; private int status; public String getMessage() { return this.message; } public void setMessage(String message) { this.message = message; } public int getStatus() { return this.status; } public void setStatus(int status) { this.status = status; } } } -- View this message in context: http://drools.46999.n3.nabble.com/Drools-and-serialize-tp3161882p3162316.html Sent from the Drool
Re: [rules-users] Drools and serialize
You call ObjectOutputStream out = new ObjectOutputStream( baos ); out.writeObject( marshaller ); which would (if it succeeded) just serialize the MarshallerImpl, which is useless as it is nothing but the ballpen with which you write. You need to serialize the "text" via a call to marshaller.marshall(...) as you do. But, to really get it on paper, you must write to a file. Using FileOutputStream might be an option. -W On 12 July 2011 12:37, clement.pernot wrote: > I have try what you say. This didn't work. > here is my full code: > > package com.sample; > > import java.io.ByteArrayOutputStream; > import java.io.ObjectOutputStream; > import java.io.Serializable; > > import org.drools.KnowledgeBase; > import org.drools.KnowledgeBaseFactory; > import org.drools.builder.KnowledgeBuilder; > import org.drools.builder.KnowledgeBuilderError; > import org.drools.builder.KnowledgeBuilderErrors; > import org.drools.builder.KnowledgeBuilderFactory; > import org.drools.builder.ResourceType; > import org.drools.io.ResourceFactory; > import org.drools.marshalling.Marshaller; > import org.drools.marshalling.MarshallerFactory; > import org.drools.marshalling.ObjectMarshallingStrategy; > import org.drools.runtime.StatefulKnowledgeSession; > > public class test{ > >private static void compileRuleBase2( String drlPath, String rbPath > ) > throws Exception { >KnowledgeBuilder kBuilder = > KnowledgeBuilderFactory.newKnowledgeBuilder(); >kBuilder.add( ResourceFactory.newFileResource( drlPath ), > ResourceType.DRL ); >if( kBuilder.hasErrors() ){ >for( KnowledgeBuilderError err: kBuilder.getErrors() ){ >System.err.println( err.toString() ); >} >throw new IllegalStateException( "DRL errors" ); >} >KnowledgeBase kBase = > KnowledgeBaseFactory.newKnowledgeBase(); >kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() > ); > >try { >KnowledgeBase kbase = readKnowledgeBase(); >StatefulKnowledgeSession ksession = > kbase.newStatefulKnowledgeSession(); > >Message message = new Message(); >message.setMessage("Hello World"); >message.setStatus(Message.HELLO); > >ksession.insert(message); > >ObjectMarshallingStrategy oms = > MarshallerFactory.newIdentityMarshallingStrategy(); >ByteArrayOutputStream baos = new ByteArrayOutputStream(); >Marshaller marshaller = > MarshallerFactory.newMarshaller( > ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ oms } ); > >marshaller.marshall( baos, ksession ); > >ObjectOutputStream out = new ObjectOutputStream( > baos ); >out.writeObject( marshaller ); >out.close(); > >baos.close(); >ksession.fireAllRules(); > >} catch (Throwable t) { >t.printStackTrace(); >} >} > >public static final void main(String[] args) { >try { >compileRuleBase2("Sample.drl", > "drools_compiled_file_with_fact" ); >} catch (Exception e) { >e.printStackTrace(); >} >} > >private static KnowledgeBase readKnowledgeBase() throws Exception { >KnowledgeBuilder kbuilder = > KnowledgeBuilderFactory.newKnowledgeBuilder(); > > kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), > ResourceType.DRL); >KnowledgeBuilderErrors errors = kbuilder.getErrors(); >if (errors.size() > 0) { >for (KnowledgeBuilderError error: errors) { >System.err.println(error); >} >throw new IllegalArgumentException("Could not parse > knowledge."); >} >KnowledgeBase kbase = > KnowledgeBaseFactory.newKnowledgeBase(); >kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); >return kbase; >} > >public static class Message implements Serializable{ > >public static final int HELLO = 0; >public static final int GOODBYE = 1; >private String message; >private int status; > >public String getMessage() { >return this.message; >} >public void setMessage(String message) { >this.message = message; >} >public int getStatus() { >return this.status; >} >
Re: [rules-users] Drools and serialize
This looks wrong to me ByteArrayOutputStream baos = new ByteArrayOutputStream(); Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ oms } ); marshaller.marshall( baos, ksession ); ObjectOutputStream out = new ObjectOutputStream( baos ); out.writeObject( marshaller ); out.close(); Presumably the marshaller is writing out the knowledge session to the output stream, then you are trying to use an object output stream to output the marshaller you just used. I think in this case you need to use one or the other - either just write out the knowledgebase through the objectOutputStream, or write out the knowledge base with a custom marshaling strategy with the Marshaller, not both! Thomas > -Original Message- > From: rules-users-boun...@lists.jboss.org [mailto:rules-users- > boun...@lists.jboss.org] On Behalf Of Abhay B. Chaware > Sent: 12 July 2011 11:46 > To: Rules Users List > Subject: Re: [rules-users] Drools and serialize > > Haven't used this before, but looks like DefaultMarshaller is not > serializable. > > What I've done in past is directly serializing and deserializing knowledgebase > without using Marshaller. That worked. > > -abhay > > -Original Message- > From: rules-users-boun...@lists.jboss.org [mailto:rules-users- > boun...@lists.jboss.org] On Behalf Of clement.pernot > Sent: Tuesday, July 12, 2011 4:07 PM > To: rules-users@lists.jboss.org > Subject: Re: [rules-users] Drools and serialize > > I have try what you say. This didn't work. > here is my full code: > > package com.sample; > > import java.io.ByteArrayOutputStream; > import java.io.ObjectOutputStream; > import java.io.Serializable; > > import org.drools.KnowledgeBase; > import org.drools.KnowledgeBaseFactory; > import org.drools.builder.KnowledgeBuilder; > import org.drools.builder.KnowledgeBuilderError; > import org.drools.builder.KnowledgeBuilderErrors; > import org.drools.builder.KnowledgeBuilderFactory; > import org.drools.builder.ResourceType; > import org.drools.io.ResourceFactory; > import org.drools.marshalling.Marshaller; > import org.drools.marshalling.MarshallerFactory; > import org.drools.marshalling.ObjectMarshallingStrategy; > import org.drools.runtime.StatefulKnowledgeSession; > > public class test{ > > private static void compileRuleBase2( String drlPath, String rbPath ) > throws Exception { > KnowledgeBuilder kBuilder = > KnowledgeBuilderFactory.newKnowledgeBuilder(); > kBuilder.add( ResourceFactory.newFileResource( drlPath ), > ResourceType.DRL ); > if( kBuilder.hasErrors() ){ > for( KnowledgeBuilderError err: kBuilder.getErrors() ){ > System.err.println( err.toString() ); > } > throw new IllegalStateException( "DRL errors" ); > } > KnowledgeBase kBase = > KnowledgeBaseFactory.newKnowledgeBase(); > kBase.addKnowledgePackages( > kBuilder.getKnowledgePackages() ); > > try { > KnowledgeBase kbase = readKnowledgeBase(); > StatefulKnowledgeSession ksession = > kbase.newStatefulKnowledgeSession(); > > Message message = new Message(); > message.setMessage("Hello World"); > message.setStatus(Message.HELLO); > > ksession.insert(message); > > ObjectMarshallingStrategy oms = > MarshallerFactory.newIdentityMarshallingStrategy(); > ByteArrayOutputStream baos = new ByteArrayOutputStream(); > Marshaller marshaller = > MarshallerFactory.newMarshaller( ksession.getKnowledgeBase(), new > ObjectMarshallingStrategy[]{ oms } ); > > marshaller.marshall( baos, ksession ); > > ObjectOutputStream out = new > ObjectOutputStream( baos ); > out.writeObject( marshaller ); > out.close(); > > baos.close(); > ksession.fireAllRules(); > > } catch (Throwable t) { > t.printStackTrace(); > } > } > > public static final void main(String[] args) { > try { > compileRuleBase2("Sample.drl", > "drools_compiled_file_with_fact" ); > } catch (Exception e) { > e.printStackTrace(); > } >
Re: [rules-users] Drools and serialize
Haven't used this before, but looks like DefaultMarshaller is not serializable. What I've done in past is directly serializing and deserializing knowledgebase without using Marshaller. That worked. -abhay -Original Message- From: rules-users-boun...@lists.jboss.org [mailto:rules-users-boun...@lists.jboss.org] On Behalf Of clement.pernot Sent: Tuesday, July 12, 2011 4:07 PM To: rules-users@lists.jboss.org Subject: Re: [rules-users] Drools and serialize I have try what you say. This didn't work. here is my full code: package com.sample; import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.marshalling.Marshaller; import org.drools.marshalling.MarshallerFactory; import org.drools.marshalling.ObjectMarshallingStrategy; import org.drools.runtime.StatefulKnowledgeSession; public class test{ private static void compileRuleBase2( String drlPath, String rbPath ) throws Exception { KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( ResourceFactory.newFileResource( drlPath ), ResourceType.DRL ); if( kBuilder.hasErrors() ){ for( KnowledgeBuilderError err: kBuilder.getErrors() ){ System.err.println( err.toString() ); } throw new IllegalStateException( "DRL errors" ); } KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); try { KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Message message = new Message(); message.setMessage("Hello World"); message.setStatus(Message.HELLO); ksession.insert(message); ObjectMarshallingStrategy oms = MarshallerFactory.newIdentityMarshallingStrategy(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ oms } ); marshaller.marshall( baos, ksession ); ObjectOutputStream out = new ObjectOutputStream( baos ); out.writeObject( marshaller ); out.close(); baos.close(); ksession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } } public static final void main(String[] args) { try { compileRuleBase2("Sample.drl", "drools_compiled_file_with_fact" ); } catch (Exception e) { e.printStackTrace(); } } private static KnowledgeBase readKnowledgeBase() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors.size() > 0) { for (KnowledgeBuilderError error: errors) { System.err.println(error); } throw new IllegalArgumentException("Could not parse knowledge."); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); return kbase; } public static class Message implements Serializable{ public static final int HELLO = 0; public static final int GOODBYE = 1; private String message; private int status; public String getMessage() { return this.message; } public void setMessage(String message) { this.message = message; } public int getStatus() { return t
Re: [rules-users] Drools and serialize
I have try what you say. This didn't work. here is my full code: package com.sample; import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.marshalling.Marshaller; import org.drools.marshalling.MarshallerFactory; import org.drools.marshalling.ObjectMarshallingStrategy; import org.drools.runtime.StatefulKnowledgeSession; public class test{ private static void compileRuleBase2( String drlPath, String rbPath ) throws Exception { KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( ResourceFactory.newFileResource( drlPath ), ResourceType.DRL ); if( kBuilder.hasErrors() ){ for( KnowledgeBuilderError err: kBuilder.getErrors() ){ System.err.println( err.toString() ); } throw new IllegalStateException( "DRL errors" ); } KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); try { KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Message message = new Message(); message.setMessage("Hello World"); message.setStatus(Message.HELLO); ksession.insert(message); ObjectMarshallingStrategy oms = MarshallerFactory.newIdentityMarshallingStrategy(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ oms } ); marshaller.marshall( baos, ksession ); ObjectOutputStream out = new ObjectOutputStream( baos ); out.writeObject( marshaller ); out.close(); baos.close(); ksession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } } public static final void main(String[] args) { try { compileRuleBase2("Sample.drl", "drools_compiled_file_with_fact" ); } catch (Exception e) { e.printStackTrace(); } } private static KnowledgeBase readKnowledgeBase() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors.size() > 0) { for (KnowledgeBuilderError error: errors) { System.err.println(error); } throw new IllegalArgumentException("Could not parse knowledge."); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); return kbase; } public static class Message implements Serializable{ public static final int HELLO = 0; public static final int GOODBYE = 1; private String message; private int status; public String getMessage() { return this.message; } public void setMessage(String message) { this.message = message; } public int getStatus() { return this.status; } public void setStatus(int status) { this.status = status; } } } here is my error: java.io.NotSerializableException: org.drools.marshalling.impl.DefaultMarshaller at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) at com.sample.test.compileRuleBase2(test.java:59) at com.sample.test.main(test.java:73) Thank you fo
Re: [rules-users] Drools and serialize
You just need to modify the definition of Message class to add "implements Serializable" . -Original Message- From: rules-users-boun...@lists.jboss.org [mailto:rules-users-boun...@lists.jboss.org] On Behalf Of clement.pernot Sent: Tuesday, July 12, 2011 3:32 PM To: rules-users@lists.jboss.org Subject: Re: [rules-users] Drools and serialize Thank you for the hint, I will try that. I don't know how to do this for the moment, but I will found. -- View this message in context: http://drools.46999.n3.nabble.com/Drools-and-serialize-tp3161882p3161977.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] Drools and serialize
Thank you for the hint, I will try that. I don't know how to do this for the moment, but I will found. -- View this message in context: http://drools.46999.n3.nabble.com/Drools-and-serialize-tp3161882p3161977.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] Drools and serialize
All the facts in working memory ( e.g. Message ) also need to be serializable. Regards, -Original Message- From: rules-users-boun...@lists.jboss.org [mailto:rules-users-boun...@lists.jboss.org] On Behalf Of clement.pernot Sent: Tuesday, July 12, 2011 2:42 PM To: rules-users@lists.jboss.org Subject: [rules-users] Drools and serialize Hi, I want to serialize a StatefulKnowledgeSession in drools (which have rule and fact) Actually i know how to serialize a KnowledgeBase. Here is my code for serialize a KnowledgeBase: KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( ResourceFactory.newFileResource( "Sample.drl" ), ResourceType.DRL ); if( kBuilder.hasErrors() ){ for( KnowledgeBuilderError err: kBuilder.getErrors() ){ System.err.println( err.toString() ); } throw new IllegalStateException( "DRL errors" ); } KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); OutputStream os = new FileOutputStream( "droolsCompiledFile" ); ObjectOutputStream oos = new ObjectOutputStream( os ); oos.writeObject( kBase ); oos.close(); This work fine, no problem here. Here is my code for serialize a StatefulKnowledgeSession: KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( ResourceFactory.newFileResource( "Sample.drl" ), ResourceType.DRL ); if( kBuilder.hasErrors() ){ for( KnowledgeBuilderError err: kBuilder.getErrors() ){ System.err.println( err.toString() ); } throw new IllegalStateException( "DRL errors" ); } KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); try { KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Message message = new Message(); message.setMessage("Hello World"); message.setStatus(Message.HELLO); ksession.insert(message); Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ MarshallerFactory.newSerializeMarshallingStrategy() } ); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectMarshallingStrategy oms = MarshallerFactory.newIdentityMarshallingStrategy(); marshaller.marshall( baos, ksession ); ObjectOutputStream out = new ObjectOutputStream( baos ); out.writeObject( marshaller ); out.close(); baos.close(); ksession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } } But this didn't work. I get always the same error: "java.io.NotSerializableException" I have try to not implement the "marshall" but this didn't work. I don't know what I must do. Can someone help me? Thank. Best regards, Clement Pernot -- View this message in context: http://drools.46999.n3.nabble.com/Drools-and-serialize-tp3161882p3161882.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
[rules-users] Drools and serialize
Hi, I want to serialize a StatefulKnowledgeSession in drools (which have rule and fact) Actually i know how to serialize a KnowledgeBase. Here is my code for serialize a KnowledgeBase: KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( ResourceFactory.newFileResource( "Sample.drl" ), ResourceType.DRL ); if( kBuilder.hasErrors() ){ for( KnowledgeBuilderError err: kBuilder.getErrors() ){ System.err.println( err.toString() ); } throw new IllegalStateException( "DRL errors" ); } KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); OutputStream os = new FileOutputStream( "droolsCompiledFile" ); ObjectOutputStream oos = new ObjectOutputStream( os ); oos.writeObject( kBase ); oos.close(); This work fine, no problem here. Here is my code for serialize a StatefulKnowledgeSession: KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kBuilder.add( ResourceFactory.newFileResource( "Sample.drl" ), ResourceType.DRL ); if( kBuilder.hasErrors() ){ for( KnowledgeBuilderError err: kBuilder.getErrors() ){ System.err.println( err.toString() ); } throw new IllegalStateException( "DRL errors" ); } KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() ); try { KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Message message = new Message(); message.setMessage("Hello World"); message.setStatus(Message.HELLO); ksession.insert(message); Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ MarshallerFactory.newSerializeMarshallingStrategy() } ); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectMarshallingStrategy oms = MarshallerFactory.newIdentityMarshallingStrategy(); marshaller.marshall( baos, ksession ); ObjectOutputStream out = new ObjectOutputStream( baos ); out.writeObject( marshaller ); out.close(); baos.close(); ksession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } } But this didn't work. I get always the same error: "java.io.NotSerializableException" I have try to not implement the "marshall" but this didn't work. I don't know what I must do. Can someone help me? Thank. Best regards, Clement Pernot -- View this message in context: http://drools.46999.n3.nabble.com/Drools-and-serialize-tp3161882p3161882.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users