我正在使用drools服务器5.5 Final with Spring来配置知识会话以持久存储到数据库(mysql)并期望它会在服务器(tomcat)重启时重新加载会话。 代码段如下
<drools:resource-change-scanner id="s1" interval="5" enabled="true" />
<drools:grid-node id="node1"/>
<drools:kagent id="kagent1" kbase="kbase1" new-instance="false">
<drools:resources>
<drools:resource type="DRL" source="file:///tmp/test.drl"/>
</drools:resources>
</drools:kagent>
<drools:kbase id="kbase1" node="node1">
</drools:kbase>
<drools:ksession id="ksession1" type="stateful" kbase="kbase1" node="node1">
<drools:configuration>
<drools:jpa-persistence>
<drools:transaction-manager ref="txManager" />
<drools:entity-manager-factory ref="myEmf" />
</drools:jpa-persistence>
</drools:configuration>
</drools:ksession>
我可以看到它会在每次重启Tomcat时将会话信息插入到Mysql中
如果会话之前已保持会话,如何配置从数据库重新加载会话?
答案 0 :(得分:0)
最后,我们碰巧看到了KnowledgeSessionDefinitionParser的src代码 将解析spring配置文件 http://grepcode.com/file/repo1.maven.org/maven2/org.drools/drools-spring/5.5.0.Final/org/drools/container/spring/namespace/KnowledgeSessionDefinitionParser.java?av=f
在代码中,它将获取'load'属性的值并用作sessionId重新加载。所以我们测试添加load =“sessionId”,可以重新加载。但是如果将sessionId配置为DB中不存在的数字,它将抛出异常
<drools:ksession id="ksession1" type="stateful" kbase="kbase1" node="node1">
<drools:configuration>
<drools:jpa-persistence load="42011">
<drools:transaction-manager ref="txManager" />
<drools:entity-manager-factory ref="myEmf" />
</drools:jpa-persistence>
</drools:configuration>
</drools:ksession>
对于一个真正的应用程序,在进行src配置时,不可能知道sessionId,也没有发现drools为我们提供了预先设置sessionId的任何方法。
这是正确的解决方案吗? 任何人都有先进的意见吗?