这已经得到了回答,但解决方案并没有为我解决。
Activiti异步行为相当简单,只允许用户启用一个标志,告诉activiti引擎将这样的任务插入执行队列(管理线程池)。
我想要的不是在池中插入我的java服务任务,而是钝化其行为,只在收到外部信号和/或调用回调时才完成此任务。
我的尝试:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div id="target">Target</div>
<table>
<tbody>
<tr><td>Cell</td></tr>
</tbody>
</table>
在我之前的代码示例中,我已经注册了一个scala future callback,当被调用时将终止当前活动并移动到下一个。
我还有一个信号方法,它构建一个基于processId的自定义信号,一个名称将调用execution.take并进行适当的转换。
在这两种情况下,我都收到以下错误(底部堆栈稍有变化)
class customAsyncTask extends TaskActivityBehavior {
override def execute(execution: ActivityExecution): Unit = {
val future = Future {
println(s"Executing customAsyncTask -> ${execution.getCurrentActivityName}, ${cur}")
}
future.onComplete {
case Success(result) => leave(execution)
case _ => // whatever
}
}
def signal(processInstanceId : String, transition : String) = {
val commandExecutor = main.processEngine.getProcessEngineConfiguration.asInstanceOf[ProcessEngineConfigurationImpl].getCommandExecutor
val command = new customSignal(processInstanceId, transition)
commandExecutor.execute(command)
}
}
不幸的是,即使没有调用complete / leave / take,引擎很可能在执行方法返回时擦除有关执行的信息。即使我的回调在上下文中有执行对象,当我使用其进程ID查询信息时,我收到的所有内容都是null。
那么,我在这里做错了什么?我怎样才能实现我想要的行为?
答案 0 :(得分:1)
我没有看到任何具体的内容,我会说你需要扩展一个实现SignalableActivityBehavior的类,但我认为TaskActivityBehavior实际上是这样做的。
虽然堆栈表明NPE来自离开(),我很困惑为什么离开是在呼叫&#34;采取&#34;因为take是一个转换事件,实际上只应发生在标记为同步的任务上。
我所能提供的是,Camunda有一个类似于你的场景的示例实现。您可以使用它来帮助您:
答案 1 :(得分:0)
似乎activiti使用线程局部变量,这意味着当从scala线程(scala Executor Context)调用方法时,它们将毫无意义,因为它们不共享上下文。
要从我的回调中解决所有必须做的事情就是拨打信号,就像我从远程系统呼叫一样。唯一的区别是我不需要保存我的流程实例标识符。
代码如下:
Select
HEADER_ID,
CASE
WHEN MIN(OPPTY_HEADER_ID) THEN STATCD='SP66'ELSE STATCD AS STACD,
TYPE, NL_IND
FROM nl_dups_load
基本上,myobject持有runTimeEngine并将在ThreadLocal上下文中注入信号。全部清洁并按预期工作。