[rules-users] Write Error when Serializing a stateful session to a file.

chrisLi shengtao0077 at 163.com
Mon Jul 9 04:07:08 EDT 2012


Hi, all

     I am trying to serialize a StatefulKnowledgeSession into a file as a
snapshot. But I got  the following error:

  java.io.IOException: Write error
	at java.io.FileOutputStream.writeBytes(Native Method)
	at java.io.FileOutputStream.write(FileOutputStream.java:282)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at
java.io.ObjectOutputStream$BlockDataOutputStream.flush(ObjectOutputStream.java:1793)
	at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:699)
	at java.io.ObjectOutputStream.close(ObjectOutputStream.java:720)
	at com.sample.test.EventDataConsumer.run(EventDataConsumer.java:44)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)

    However, when I serialized it to a ByteArrayOutputStream, it works well.

 I wrapped the stateful session in a class as a field. And I wrote
writeObject and readObject methods in this class to provide custom
serializing behaviour. The code is as follows:

    private void writeObject(ObjectOutputStream out) throws IOException {
		System.out.println("writing");
		out.defaultWriteObject();

		DroolsObjectOutputStream droolsOut = new DroolsObjectOutputStream(
				(OutputStream) out);
		droolsOut.writeObject(knowledgeBase);

		Marshaller marshaller = createSerializableMarshaller(knowledgeBase);
		marshaller.marshall(droolsOut, session);
		System.out.println("written");
	}

	private void readObject(ObjectInputStream in) throws IOException,
			ClassNotFoundException {
		System.out.println("read");
		in.defaultReadObject();

		DroolsObjectInputStream droolsIn = new DroolsObjectInputStream(
				(InputStream) in);
		this.knowledgeBase = (KnowledgeBase) droolsIn.readObject();

		Marshaller marshaller = createSerializableMarshaller(knowledgeBase);
		session = marshaller.unmarshall(droolsIn);
	}

	private Marshaller createSerializableMarshaller(KnowledgeBase
knowledgeBase) {
		ObjectMarshallingStrategyAcceptor acceptor = MarshallerFactory
				.newClassFilterAcceptor(new String[] { "*.*" });
		ObjectMarshallingStrategy strategy = MarshallerFactory
				.newSerializeMarshallingStrategy(acceptor);
		Marshaller marshaller = MarshallerFactory.newMarshaller(knowledgeBase,
				new ObjectMarshallingStrategy[] { strategy });
		return marshaller;
	}

Out of this class, I utilized the ordinary ObjectoutputStream to serialize
an instance of this class to a file. 

Unfortunately, I got the Exception.

Any idea or response will be appreciated, Thank you very much.

--
View this message in context: http://drools.46999.n3.nabble.com/Write-Error-when-Serializing-a-stateful-session-to-a-file-tp4018545.html
Sent from the Drools: User forum mailing list archive at Nabble.com.


More information about the rules-users mailing list