[rules-users] External storage and timers

Mark Proctor mproctor at codehaus.org
Mon Jun 24 09:57:27 EDT 2013


the 6.0 stuff is not really ready for production use, many aspects do not work yet - such as serialisation of rules.

Mark
On 24 Jun 2013, at 11:01, didierC <didier.chevrere at gmail.com> wrote:

> Hi,
> 
> We want to use the external storage API for our Fusion project (Drools 6.0 -
> beta2).
> We have temporal based rules and when we load an existing session, we get:
> ...
> Caused by: java.lang.NullPointerException
> 	at
> org.drools.core.common.Scheduler$ActivationTimerInputMarshaller.deserialize(Scheduler.java:238)
> 	at
> org.drools.core.marshalling.impl.ProtobufInputMarshaller.readTimer(ProtobufInputMarshaller.java:627)
> 	at
> org.drools.core.marshalling.impl.ProtobufInputMarshaller.readSession(ProtobufInputMarshaller.java:282)
> 	at
> org.drools.core.marshalling.impl.ProtobufInputMarshaller.readSession(ProtobufInputMarshaller.java:154)
> 	at
> org.drools.core.marshalling.impl.ProtobufMarshaller.unmarshall(ProtobufMarshaller.java:114)
> 	at
> org.drools.core.marshalling.impl.ProtobufMarshaller.unmarshall(ProtobufMarshaller.java:56)
> 	at
> org.drools.persistence.SessionMarshallingHelper.loadSnapshot(SessionMarshallingHelper.java:83)
> 	... 35 more
> 
> I can reproduce the problem in a simple test case:
> 	
> public class TestStorage {
> 
> 	private SimpleKnowledgeSessionStorage storage;
> 
> 	@Before
> 	public void initStorage() {
> 		storage = new SimpleKnowledgeSessionStorage();
> 	}
> 
> 	@Test
> 	public void testStorageWithTimer() throws InterruptedException {
> 		KieSession session = getSession(null);
> 		int id = session.getId();
> 
> 		String rule = "package test\n";
> 		rule += "import erdf.poc.cep.*;\n";
> 		rule += "rule \"test\"\n";
> 		rule += "timer (cron:0/2 * * * * ?)\n";
> 		rule += "when\n";
> 		rule += "then\n";
> 		rule += "insert(\"test\"+System.currentTimeMillis());\n";
> 		rule += "end";
> 		addRule(session, rule);
> 
> 		session.fireAllRules();
> 		Thread.sleep(2000);
> 		session.fireAllRules();
> 		
> 		final int facts = session.getFactHandles().size();
> 		Assert.assertTrue(facts>=1);
> 		session.dispose();
> 
> 		Thread.sleep(2000);
> 		
> 		session = getSession(id);
> 		addRule(session, rule);
> 		session.fireAllRules();
> 		
> 		Assert.assertTrue(session.getFactHandles().size()>facts);
> 		session.dispose();
> 	}
> 
> 	private KieSession getSession(Integer i) {
> 		final Environment env = KnowledgeBaseFactory.newEnvironment();
> 		EnvironmentBuilder envBuilder = new
> KnowledgeSessionStorageEnvironmentBuilder(storage);
> 		env.set(EnvironmentName.TRANSACTION_MANAGER,
> envBuilder.getTransactionManager());
> 		env.set(EnvironmentName.PERSISTENCE_CONTEXT_MANAGER,
> envBuilder.getPersistenceContextManager());
> 		KieStoreServices storeS = KieServices.Factory.get().getStoreServices();
> 		final KieBase kieBase = KnowledgeBaseFactory.newKnowledgeBase();
> 		if (i != null) {
> 			return storeS.loadKieSession(i, kieBase, null, env);
> 		}
> 		return storeS.newKieSession(kieBase, null, env);
> 	}
> 
> 	private static class SimpleKnowledgeSessionStorage implements
> KnowledgeSessionStorage {
> 
> 		public Map<Integer, SessionInfo> ksessions = new HashMap<Integer,
> SessionInfo>();
> 		public Map<Long, WorkItemInfo> workItems = new HashMap<Long,
> WorkItemInfo>();
> 
> 		public SessionInfo findSessionInfo(Integer id) {
> 			return ksessions.get(id);
> 		}
> 
> 		public void saveOrUpdate(SessionInfo storedObject) {
> 			ksessions.put(storedObject.getId(), storedObject);
> 		}
> 
> 		public void saveOrUpdate(WorkItemInfo workItemInfo) {
> 			workItems.put(workItemInfo.getId(), workItemInfo);
> 		}
> 
> 		public Long getNextWorkItemId() {
> 			return new Long(workItems.size() + 1);
> 		}
> 
> 		public WorkItemInfo findWorkItemInfo(Long id) {
> 			return workItems.get(id);
> 		}
> 
> 		public void remove(WorkItemInfo workItemInfo) {
> 			workItems.remove(workItemInfo.getId());
> 		}
> 
> 		public Integer getNextStatefulKnowledgeSessionId() {
> 			return ksessions.size() + 1;
> 		}
> 	}
> }
> 
> Any idea ?
> 
> Thanks for your help
> Didier
> 
> 
> 
> 
> --
> View this message in context: http://drools.46999.n3.nabble.com/External-storage-and-timers-tp4024486.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users




More information about the rules-users mailing list