Вы можете смешать три компонента языка Джоли для сохранения / загрузки состояния рабочего процесса и кода восстановления после сбоя программы:
- Переменные Джоли, которые являются деревьями;
- некоторые стандартные библиотеки для поддержки маршалинга и демаршаллинга деревьев Джоли и взаимодействий файлов и баз данных;
- язык механизмы обработки ошибок для обработки исключительных поведений.
Состояниеэкземпляром микросервиса Джоли является дерево (аналогично структурам XML и JSON).На практике, хотя в Jolie a = 5
вспоминается знакомое назначение переменных, найденное в других языках, в действительности происходит то, что в состоянии экземпляра, выполняющего назначение, мы создаем узел a
и присваиваем a
значение5
.И наоборот, когда мы пишем a
в программе Jolie, мы получаем доступ к значению, хранящемуся в узле a
.Точно так же a.b = 6
означает создание подузла b
в a
и присвоение ему значения 6
.
Наличие собственных структур данных дерева на языке очень полезно при отправке и получении структурированных данных., поскольку Джоли автоматически преобразует свои древовидные переменные в формат, используемый для связи с некоторым внешним клиентом / сервером через его порты.Тем не менее, переменные в форме дерева также довольно легко маршалировать / демаршалировать.Например, мы можем преобразовать текущий статус переменной дерева Джоли, вызвав библиотеку JSON (или XML) и использовать библиотеки File или Database дляпостоянство.
Я собрал ниже простой пример, чтобы проиллюстрировать мою точку зрения.В этом примере я использую процедуры saveState
и loadState
для сохранения и загрузки значений, хранящихся в переменной process_state
, которая является корневой переменной, содержащей все соответствующие значения, используемые в рабочем процессе.Рабочий процесс начинается с блока main
, где мы сохраняем некоторые данные и печатаем их для справки (операции valueToPrettyString
и println
).Затем мы сохраняем текущее состояние (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
}
}
Этот тип подготовки может использоваться также для восстановления после сбоев (например, путем указания переменной, которая была достигнута на последнем этапе).
Джоли также предлагает несколько продвинутых конструкций для обработки прекращения и компенсации рабочих процессов, полезных для предотвращения сохранения поврежденных этапов и обеспечения поведения транзакций.
Ссылки
- Фабрицио Монтези, Клаудио Гуиди и Джанлуиджи Заваттаро.(2014).Сервис-ориентированное программирование с Джоли.В A. Bouguettaya, QZ Sheng & F. Daniel (Eds.), Фонды веб-сервисов (стр. 81–107).Springer https://doi.org/10.1007/978-1-4614-7518-7_4
- Фабрицио Монтези, Клаудио Гуиди, Иван Ланезе и Джанлуиджи Заваттаро.(2008).Динамические механизмы обработки ошибок для сервис-ориентированных приложений.https://doi.org/10.1109/ECOWS.2008.20