Изменения документа Примеры

Редактировал(а) Alexandr Fokin 2026/08/26 19:05

От версии 8.23
отредактировано Alexandr Fokin
на 2026/06/18 22:06
Изменить комментарий: Update document after refactoring.
К версии 8.26
отредактировано Alexandr Fokin
на 2026/07/27 03:26
Изменить комментарий: К данной версии нет комментариев

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -44,7 +44,7 @@
44 44  Также решает проблему, если дочерний процесс содержит ожидание (например асинхронный запрос-ответ), тут будет конкуренция сигнала от хендлера ответа к родительскому процессу.
45 45  )))
46 46  |(((
47 -Вариант N4:
47 +Вариант 4:
48 48  
49 49  SimpleStreamTrigger + Timer (один из лучших вариантов).
50 50  
... ... @@ -61,7 +61,24 @@
61 61  но пишущей нагрузки будет меньше чем в варианте 1 (запись - только на активации новым сигналом).
62 62  * Если сигналов нет, то нет пустых срабатываний в отличие от варианта 2 (т.к. нет поступления сигнала от дочерних процессов).
63 63  )))
64 +|(((
65 +|Вариант №5: Trigger + Счетчик в Redis.
66 +|Дочерний процесс уменьшает счетчик. И публикует событие только если счетчик достиг 0.
67 +|(((
68 +Проблема: изменение счетчика не привязано к основной транзакции БД.
69 +
70 +Возможно:
71 +
72 +1. До коммита транзакции уменьшаем счетчик и записываем id дочернего процесса в redis hashset. Если счетчик 0, то публикуем triggerEvent через TransactionalOutbox.
73 +(На старте транзакции проверить и удалить из HashSet и если удалили, то увеличить счетчик на 1 - значит была упавшая транзакция).
74 +1. После коммита транзакции удаляем id дочернего процесса из redis hashset.
75 +1. Trigger при получении события смотрит значение счетчика и HashSet.
76 +Если счетчик 0 и HashSet пустой, то скорее всего все корректно и триггер может активироваться.
77 +Иначе если HashSet не пустой, то можно попытаться проверить статус процесса (если он завершен, то можно удалить значение из HashSet).
64 64  )))
79 +|Проблемы: Потеря счетчика целиком или искажения значения в случае падения Redis.
80 +)))
81 +)))
65 65  |2|(% style="width:188px" %)Transaction outbox stream process.|(% style="width:1268px" %)[[image:TransactionOutbox. Sequence.jpg]]
66 66  |3|(% style="width:188px" %)Stream trigger|(% style="width:1268px" %)(((
67 67  | |(((
... ... @@ -100,3 +100,27 @@
100 100  |(% style="width:888px" %)Родительский процесс ожидает завершения дочерних процессов (см. пример 1).|(% style="width:266px" %)
101 101  )))
102 102  )))
120 +
121 +----
122 +
123 +==== Внутренние ссылки: ====
124 +
125 +====== Дочерние страницы: ======
126 +
127 +{{children/}}
128 +
129 +====== Обратные ссылки: ======
130 +
131 +{{velocity}}
132 +#set ($links = $doc.getBacklinks())
133 +#if ($links.size() > 0)
134 + #foreach ($docname in $links)
135 + #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument())
136 + * [[$escapetool.xml($rdoc.fullName)]]
137 + #end
138 +#else
139 + No back links for this page!
140 +#end
141 +{{/velocity}}
142 +
143 +----