Java Drools持久事实句柄
我正在使用封送拆收器序列化和反序列化DROOLS会话。它似乎在按预期工作。但是,我注意到,以前创建的事实句柄在尝试在反序列化会话上检索事实时不再有效 下面的测试失败,因为事实变量等于null。请注意,下面的代码是伪代码,只是为了传达想法Java Drools持久事实句柄,java,drools,Java,Drools,我正在使用封送拆收器序列化和反序列化DROOLS会话。它似乎在按预期工作。但是,我注意到,以前创建的事实句柄在尝试在反序列化会话上检索事实时不再有效 下面的测试失败,因为事实变量等于null。请注意,下面的代码是伪代码,只是为了传达想法 Customer c = new Customer(); KieSession kSession = kContainer.newKieSession(); FactHandle h = kSession.insert(c); byte[] bytes =
Customer c = new Customer();
KieSession kSession = kContainer.newKieSession();
FactHandle h = kSession.insert(c);
byte[] bytes = marshaller.marshall(kSession);
KieSession restoredSession = marshaller.unmarshall(bytes);
Object fact = restoredSession.getObject(h);
Assert.assertEquals(c, fact);
我之所以希望保留/重用句柄,是为了能够在分布式环境中以一致的方式检索事实
你知道我怎样才能做到这一点吗
更新:
我也试过普罗霍罗夫先生的建议
Customer c = new Customer();
KieSession kSession = kContainer.newKieSession();
FactHandle originalHandle = kSession.insert(c);
String externalHandle = h.toExternalForm();
byte[] bytes = marshaller.marshall(kSession);
KieSession restoredSession = marshaller.unmarshall(bytes);
FactHandle restoredHandle = DefaultFactHandle.createFromExternalFormat(externalHandle)
Object fact = restoredSession.getObject(restoredHandle);
Assert.assertEquals(c, fact);
谢谢可能是个愚蠢的问题,但是:什么是
客户
,它是否覆盖equals()
?客户是域对象/事实。它实现了serializable并实现了自己的等式,即equals和hashcode。我能够对会话进行序列化/反序列化,只是无法使用原始句柄检索事实。啊,我错过了fact
变量isnull
。句柄可能以某种方式绑定到会话对象(我不知道,因为我这里只看Javadocs)。我建议您尝试在原始句柄上调用到externalform()
,然后在返回的字符串上使用DefaultFactHandle.createFromExternalFormat
。谢谢您的建议。我已经完全按照你的建议做了尝试,但仍然没有成功。似乎在创建DefaultFactHandle时,它使用System.identityHashCode(对象)来创建事实handel identityHashCode。会话反序列化后,事实句柄将具有新的identityHashCode。希望这是有道理的。这对我来说是有道理的,而且很糟糕。我没有任何进一步的建议,让我们看看其他人是否有答案。