每个请求的 Drools 有状态会话

Posted

技术标签:

【中文标题】每个请求的 Drools 有状态会话【英文标题】:Drools stateful session per request 【发布时间】:2018-05-23 00:03:57 【问题描述】:

我们正在尝试使用 Drool 作为我们的规则引擎服务。下面列出了我们到目前为止所做的工作

Deployed workbench 7.2.Final Deployed KIE server 7.2.0.Final 配置了一些数据对象、规则,将更改部署到 KIE 服务器,我们能够使用 REST API 执行规则

无状态会话满足了我们的大部分需求(给出一组数据,执行规则并返回数据,就是这样)。但是使用无状态,我们不得不妥协 Drools 有状态会话提供的许多重要特性。

所以我们尝试对每个请求使用有状态会话。这意味着会话应在请求结束后立即处理。此外,即使会话名称相同,并行请求也不应相互干扰

我们发现容器运行时策略配置(Workbench > Deploy > any container > Process Configuration > Runtime strategy)

但即使将容器策略配置为 Per Request,它的行为仍然与 Singleton 相同(每次请求后会话不会被释放)

我们读它的地方很少,运行时策略只在 jBPM 中实现

我们向KIE服务器发出请求的方式如下所示

 Request: POST HOST/kie-server/services/rest/server/containers/instances/TestRequest_1.0.4 
 
   "lookup": "ab-session", //stateful session
   "commands": [
     
       "insert": 
         "out-identifier": "125",
         "object": 
           "com.myteam.testrequest.Product": 
            "id": "123",
            "name": "Hoo Hoo",
            "count": 0
           
         ,
         "return-object": "true"
       
     ,
     
       "insert": 
         "out-identifier": "126",
         "object": 
           "com.myteam.testrequest.Product": 
            "id": "123",
            "name": "Hoo Hoo",
            "count": 0
           
         ,
         "return-object": "true"
       
     ,
     "fire-all-rules": "hf2"
   ]
  

我们需要帮助来实现这一要求。另外,如果我们做错了什么,请帮助理解

【问题讨论】:

你能在哪里解决这个问题? 我们的一些理解是不对的。 drools 中的无状态会话实际上是有状态会话的按请求实现。这意味着有状态支持的所有命令也支持无状态。 (我们最初认为无状态会话不支持modify 之类的命令)如果您想针对每个请求策略进行回答,则仅在jBPM 中可用 【参考方案1】:

在 kmodule.xml 中你可以尝试添加“prototype”范围,因为默认是“singleton”:

<ksession name="SessionName" type="stateful" default="false" clockType="realtime" scope="prototype"/>

【讨论】:

以上是关于每个请求的 Drools 有状态会话的主要内容,如果未能解决你的问题,请参考以下文章

Drools:使用 Query 获取无状态会话结果

JSF 请求范围的 bean 不断在每个请求上重新创建新的有状态会话 bean?

雷林鹏分享:EJB有状态会话Bean

雷林鹏分享:EJB有状态会话Bean

Drools文档 用户手册

分布式技术专题「架构实践于案例分析」盘点分布式服务的(无状态有状态)认证实现方案