Activiti Java服务任务:钝化不需要接收任务

时间:2016-05-10 12:55:44

标签: scala asynchronous task activiti

这已经得到了回答,但解决方案并没有为我解决。

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。

那么,我在这里做错了什么?我怎样才能实现我想要的行为?

2 个答案:

答案 0 :(得分:1)

我没有看到任何具体的内容,我会说你需要扩展一个实现SignalableActivityBehavior的类,但我认为TaskActivityBehavior实际上是这样做的。

虽然堆栈表明NPE来自离开(),我很困惑为什么离开是在呼叫&#34;采取&#34;因为take是一个转换事件,实际上只应发生在标记为同步的任务上。

我所能提供的是,Camunda有一个类似于你的场景的示例实现。您可以使用它来帮助您:

https://github.com/camunda/camunda-bpm-examples/tree/master/servicetask/service-invocation-asynchronous

答案 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上下文中注入信号。全部清洁并按预期工作。