如何配置在使用Spring重启服务器(tomcat)时重新加载drools知识会话

时间:2014-02-21 07:38:03

标签: spring session drools

我正在使用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中

如果会话之前已保持会话,如何配置从数据库重新加载会话?

1 个答案:

答案 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的任何方法。

这是正确的解决方案吗? 任何人都有先进的意见吗?