[rules-users] Drools and serialize

clement.pernot clement.pernot at newel.net
Tue Jul 12 06:37:05 EDT 2011


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 for your reply, I think I am near the solution

--
View this message in context: http://drools.46999.n3.nabble.com/Drools-and-serialize-tp3161882p3162038.html
Sent from the Drools: User forum mailing list archive at Nabble.com.



More information about the rules-users mailing list