用Jolie存储工作流状态

时间:2018-12-18 10:28:00

标签: jolie

我试图了解Jolie如何实现工作流程的弹性。

  • Jolie是否存储正在运行的工作流程的状态?
  • 它是通过使用数据库还是文件系统来实现的?

1 个答案:

答案 0 :(得分:2)

您可以混合使用Jolie语言的三个组成部分来保存/加载工作流的状态和程序故障恢复代码:

  • Jolie变量,它们是树;
  • 一些标准库,用于支持Jolie树的编组和解组以及文件/数据库交互;
  • 用于处理特殊行为的语言fault handling mechanisms

Jolie微服务实例的状态是一棵树(类似于XML和JSON结构)。实际上,在Jolie a = 5回忆起其他语言中熟悉的变量赋值的同时,实际上发生的是,在执行赋值实例的状态下,我们创建了一个节点a并赋给{ {1}}值a。反之亦然,当我们在Jolie程序中写入5时,我们正在访问存储在节点a下的值。同样,a意味着在a.b = 6下创建一个子节点b并为其分配值a

在发送和接收结构化数据时,具有该语言的本机树数据结构非常有用,因为Jolie会自动将其树形变量转换为通过其端口与某些外部客户端/服务器通信的格式。但是,树形变量也相当容易编组/解组。例如,我们可以通过调用JSON(或XML)库并将FileDatabase库用于持久性来转换Jolie树变量的当前状态。

我在下面的一个简单示例中进行了阐述,以阐明我的观点。在示例中,我使用过程6saveState保存并加载存储在变量loadState下的值,变量process_state是包含工作流中所有相关值的根变量。工作流程从main块开始,我们在其中保存一些数据并打印以供参考(操作valueToPrettyStringprintln)。然后,我们保存当前状态(saveState)并继续进行stage1。由于变量process_state.c等于"bad",所以我们抛出一个错误(MyFault)。 install块捕获故障并执行过程recv_stage1。该过程将丢弃程序的先前错误状态,恢复保存在文件中的状态,并“修复”变量process_state.c。完成后,我们再次执行stage1

include "console.iol"
include "json_utils.iol"
include "string_utils.iol"
include "file.iol"

define saveState
{
  getJsonString@JsonUtils( process_state )( marshalled_state.content );
  writeFile@File( marshalled_state )();
  undef( marshalled_state.content )
}

define loadState {
  undef( process_state );
  readFile@File( marshalled_state )( marshalled_state.content );
  getJsonValue@JsonUtils( marshalled_state.content )( process_state );
  undef( marshalled_state.content )
}

define recv_stage1 {
  scope( recv_stage1 ){
     loadState;
     process_state.c = "fine";
     valueToPrettyString@StringUtils( process_state )( state_pretty_print );
     println@Console( state_pretty_print )()
  }
}

define stage1 {
  scope( stage1 ){
    install( MyFault => 
      println@Console( "MyFault, loading saved state" )(); recv_stage1; stage1 );
    if ( process_state.c == "bad" ){
      throw( MyFault )
    } else {
      println@Console( "Everything went " + process_state.c )()
    }
  }
}

main
{
  marshalled_state.filename = "instance_XXX.json";
  with ( process_state ){
    .a = 42;
    .b << "I" { .love = "very", .much = "jolie" };
    valueToPrettyString@StringUtils( process_state )( state_pretty_print );
    println@Console( state_pretty_print )();
    saveState;
    .c = "bad";
    stage1
  }
}

这种阶段还可以用于从崩溃中恢复(例如,通过指示进入最后阶段的变量)。

Jolie还提供了一些高级结构来处理工作流的termination and compensation,有助于避免保存损坏的阶段并强制执行交易行为。

参考

  • Fabrizio Montesi,Claudio Guidi和Gianluigi Zavattaro。 (2014)。 Jolie的面向服务的编程。在Web服务基金会(页81–107)中,A。Bouguettaya,Q。Z. Sheng和F. Daniel(编辑)。施普林格https://doi.org/10.1007/978-1-4614-7518-7_4
  • Fabrizio Montesi,Claudio Guidi,Ivan Lanese和Gianluigi Zavattaro。 (2008)。面向服务的应用程序的动态故障处理机制。 https://doi.org/10.1109/ECOWS.2008.20