Изменения документа Движок cccc1808. ProcessEngine
Редактировал(а) Alexandr Fokin 2026/04/27 13:28
От версии 31.3
отредактировано Alexandr Fokin
на 2026/04/27 13:28
на 2026/04/27 13:28
Изменить комментарий:
К данной версии нет комментариев
К версии 22.1
отредактировано Alexandr Fokin
на 2026/04/10 19:42
на 2026/04/10 19:42
Изменить комментарий:
Удаление картинки TransactionOutbox. Sequence.jpg
Сводка
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
-
Вложения (0 изменено, 1 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -1,12 +1,11 @@ 1 -|(% style="width:132px" %) |(% style="width:1301px" %)((( 2 - |Теги поиска|cccc1808. ProcessEngine, cccc1808.ProcessEngine, Process engine1 +|(% style="width:132px" %)Теги поиска|(% style="width:1301px" %)((( 2 +cccc1808. ProcessEngine, cccc1808.ProcessEngine 3 3 Очередь задач, Система обработки процессов, Движок обработки процессов. 4 4 [[Процесс>>doc:Архитектура и модели.Модели.Процесс.WebHome]] 5 -|Описание|Универсальный движок для выполнения процессов и очередей задач, позволяющий комбинировать несколько подходов к обработке (см особенности). 6 -|Термины|Процесс является единицей исполнения. В реализации может содержать машину состояний. 7 -Система триггеров используется для таймеров и передачи сигналов для процессов (с оптимизацией нагрузки). 8 -|Репозиторий|[[https:~~/~~/github.com/cccc1808/cccc1808.ProcessEngine>>https://github.com/cccc1808/cccc1808.ProcessEngine]] 9 9 ))) 6 +|(% style="width:132px" %) |(% style="width:1301px" %)Универсальный движок для выполнения процессов и очередей задач, позволяющий комбинировать несколько подходов к обработке (см особенности). 7 +|(% style="width:132px" %) |(% style="width:1301px" %)Процесс является единицей исполнения. В реализации может содержать машину состояний. 8 +Система триггеров используется для таймеров и передачи сигналов для процессов (с оптимизацией нагрузки). 10 10 |(% style="width:132px" %)Разветывание|(% style="width:1301px" %)((( 11 11 |(% style="width:150px" %)База данных|(% style="width:1177px" %)((( 12 12 Для надежного хранения данных процессов и триггеров. ... ... @@ -16,18 +16,16 @@ 16 16 17 17 Для текущей реализации в качестве хранилище может выступать БД, поддерживающая: 18 18 19 -* Транзакции: 20 -** Транзакции. 21 -** Savepoint. 18 +* Транзакции: транзакции. 19 +* Транзакции: savepoint. 22 22 (если используются, можно обрабатывать каждый шаг отдельной транзакцией или весь процесс без savepoint изоляции ошибок между шагами). 23 -* [[Блокировки>>doc:Разработка.Базы данных.SQL.Механизмы.Транзакции и блокировки.WebHome]]: 24 -** updatelock. 25 -** updatelock skip locked. 21 +* Блокировка: updatelock. 22 +* Блокировка: updatelock skip locked. 26 26 (частично можно обойтись без него). 27 -* *sharelock24 +* Блокировка: sharelock 28 28 (можно обойтись без него без сильного влияния) 29 -* [[Уровни изоляции>>doc:Разработка.Базы данных.SQL.Механизмы.Транзакциииблокировки.Уровни изоляции| Isolation levels.WebHome]]: работает на read committed, то что нужно блокируется руками.30 -* Для некоторых кейсов желательно возможность выполнить [[Upsert>>doc:Разработка.Базы данных.SQL.Сценарии и вопросы.Insert orupdate\. Upsert.WebHome]](insert on conflict).26 +* Уровень изоляции: работает на read committed, то что нужно блокируется руками. 27 +* Для некоторых кейсов желательно возможность выполнить upsert (insert on conflict). 31 31 ))) 32 32 |(% style="width:150px" %)Брокер сообщений|(% style="width:1177px" %)((( 33 33 Используется для накопления и доставки TriggerEvent. ... ... @@ -38,8 +38,8 @@ 38 38 ))) 39 39 ))) 40 40 |(% style="width:132px" %)Особенности|(% style="width:1301px" %)((( 41 -|(% style="width:159px" %) Пакетныетранзакции(батчинг).|(% style="width:1168px" %)(((42 -Возможность использовать и комбинировать типы выполнения для разных типов процессов:38 +|(% style="width:159px" %)Батчинг при выполнении.|(% style="width:1168px" %)((( 39 +Возможность использовать и комбинировать разные типы выполнения как 43 43 44 44 * (1 транзакция - 1 процесс), 45 45 * (1 транзакция - N процессов). ... ... @@ -63,7 +63,6 @@ 63 63 См. пример 2. 64 64 ))) 65 65 |(% style="width:159px" %)Перехват ошибок|(% style="width:1168px" %)Перехват и обработка ошибок, если процесс выкинул exception в движок. Реализацию простого retry с задержкой (создается триггер на следующую попытку). 66 -В случае пакетной транзакции движок не знает какой конкретно из процессов породил ошибку (если она не перехвачена вручную), то ошибка выставляется на все незавершенные процессы. 67 67 |(% style="width:159px" %)Параллельное выполнение|(% style="width:1168px" %)Допускается запуск нескольких раннеров (на разных нодах), работающих с одной таблицей процессов для распределения нагрузки между ними. 68 68 Допускается фильтрация типов процессов между нодами (чтобы нода выполняла только определенные типы процессов, в том числе по приоритету). 69 69 Доступно для раннеров процессов и триггеров. ... ... @@ -81,27 +81,49 @@ 81 81 ))) 82 82 |(% style="width:159px" %)Range preload process data|(% style="width:1168px" %)(Необязательно) возможность в начале сессии обработки пакетно предзагружать данные и бизнес сущности для процессов (Range query) из обрабатываемого батча для оптимизации чтения (если используется обработка пакета процессов в одной транзакции). 83 83 ))) 80 +|(% style="width:132px" %)Примеры|(% style="width:1301px" %)((( 81 +|(% style="width:32px" %)1|(% style="width:171px" %)Родительский процесс, N дочерних процессов.|(% style="width:1066px" %)((( 82 +|(% style="width:870px" %)((( 83 +В данном примере имеется в виду, что дочерние процессы могут выполняться параллельно другу и независимо друг от друга, но в конце должны оповестить родительский процесс о необходимости продолжения обработки. 84 +Если речь идет о каких-либо зависимостях порядка выполнения в дочерних процессах, то это может контролировать дочерний процесс (выделяя группу, которую сейчас можно запустить и ожидая окончания). 85 +))) 86 +|(% style="width:870px" %)((( 87 +1. Родительский процесс создает триггер со счетчиком N, создает и запускает дочерние процессы, засыпает. 88 +1. Дочерние процесс при завершении публикует TriggerEvent. 89 +1. TriggerConsumerRunner периодически считывает батч TriggerEvent, уменьшает считчик триггера и делает запись в БД. За счет агрегации событий завершения процессов мы уменьшаем нагрузку на БД. 90 +1. Когда все дочерние процессы отработали TriggerConsumerRunner получает значение счетчика 0 и взводит триггер. 91 +1. Триггер пробуждает родительский процесс для дальнейшего выполнения. 92 +))) 93 +|(% style="width:870px" %)TriggerEvent публикуются без использования TransactionOutbox напрямую в брокер после коммита транзакции (иначе мы бы нагружали БД). 94 +|(% style="width:870px" %)((( 95 +Предполагаем, что основную часть времени система работает стабильно, но допускается ситуация, что транзакция закоммитилась, но TriggerEvent не смогли опубликоваться (остановка сервиса без graceful shutdown, проблемы соединения или работы с брокером сообщений). 84 84 85 ----- 97 +Для таких случаев создается страхующий триггер (1 общий на тип процесса). Этот триггер запускается периодически и проходится по всем ожидающим процессам, проверяя условие (в реализации можно использовать keyset пагинацию) (в реализации можно использовать join для проверки условия). 98 +Этот триггер выполняется периодически с более крупной временной задержкой. В случае обнаружения потери TriggerEvent, он поднимет заклинивший родительский процесс и он будет обработан (но позже). Можно установить этому триггеру низкий приоритет. 99 +))) 100 +|(% style="width:870px" %)[[image:Родительский дочерний процесс. Sequence.jpg]] 101 +))) 102 +|(% style="width:32px" %)2|(% style="width:171px" %)Transaction outbox stream process.|(% style="width:1066px" %)[[image:TransactionOutbox. Sequence.jpg]] 103 +|(% style="width:32px" %)3|(% style="width:171px" %)Stream trigger|(% style="width:1066px" %)((( 104 +|(% style="width:94px" %) |(% style="width:1002px" %)Позволяет убрать лишние запросы пробуждения процесса (когда он и так запущен). 105 +Вводит 2 типа события, 1 сигнал о новом сообщении (содержит offset значение), 2 - процесс идет спать (содержит offset значение). 106 +|(% style="width:94px" %)Алгоритм триггера.|(% style="width:1002px" %)((( 107 +* При получении события о засыпании процесса: 108 +Фиксирует смещение процесса обработки и сравнивает со смещением сообщения. 109 +Если все сообщения обработаны, то не пробуждает процесс, иначе пробуждает процесс. 110 +* При получении события о новом сообщении: 111 +Фиксирует новое наибольшее смещение. 112 +Если процесс не спит (по флагу в триггере), то ничего не делает. 113 +Если процесс спит (по флагу), то пробуждает процесс. 86 86 87 -==== Внутренние ссылки: ==== 88 88 89 -====== Дочерние страницы: ====== 116 +Отслеживает смещение обработки процесса и последнего события. 117 +Ожидает от процесса события о том, что он все обработал, его последнее смещение и он идет спать. 118 +Если есть сообщения со смещением больше чем указал процесс, то делает гарантированное пробуждение процесса. 119 +Когда поступает сигнал о новом сообщении (от отправителя сообщения), то обновляет данные о максимальном смещении и пробуждает процесс, если он спит 120 +))) 121 +|(% style="width:94px" %) |(% style="width:1002px" %)TODO: 122 +))) 123 +))) 90 90 91 -{{children/}} 92 - 93 -====== Обратные ссылки: ====== 94 - 95 -{{velocity}} 96 -#set ($links = $doc.getBacklinks()) 97 -#if ($links.size() > 0) 98 - #foreach ($docname in $links) 99 - #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument()) 100 - * [[$escapetool.xml($rdoc.fullName)]] 101 - #end 102 -#else 103 - No back links for this page! 104 -#end 105 -{{/velocity}} 106 - 107 ----- 125 +
- Родительский дочерний процесс. Sequence.jpg
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.cccc1808 - Размер
-
... ... @@ -1,0 +1,1 @@ 1 +31.6 KB - Содержимое
-
... ... @@ -1,0 +1,506 @@ 1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 +<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> 3 + <!--Created by yEd 3.23.1--> 4 + <key attr.name="Description" attr.type="string" for="graph" id="d0"/> 5 + <key for="port" id="d1" yfiles.type="portgraphics"/> 6 + <key for="port" id="d2" yfiles.type="portgeometry"/> 7 + <key for="port" id="d3" yfiles.type="portuserdata"/> 8 + <key attr.name="url" attr.type="string" for="node" id="d4"/> 9 + <key attr.name="description" attr.type="string" for="node" id="d5"/> 10 + <key for="node" id="d6" yfiles.type="nodegraphics"/> 11 + <key for="graphml" id="d7" yfiles.type="resources"/> 12 + <key attr.name="url" attr.type="string" for="edge" id="d8"/> 13 + <key attr.name="description" attr.type="string" for="edge" id="d9"/> 14 + <key for="edge" id="d10" yfiles.type="edgegraphics"/> 15 + <graph edgedefault="directed" id="G"> 16 + <data key="d0"/> 17 + <node id="n0"> 18 + <data key="d5"/> 19 + <data key="d6"> 20 + <y:ShapeNode> 21 + <y:Geometry height="30.0" width="240.2240000000017" x="335.887999999999" y="439.28000000000003"/> 22 + <y:Fill color="#FFCC00" transparent="false"/> 23 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 24 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="234.478515625" x="2.872742187500876" xml:space="preserve" y="5.6494140625">Гарантированное пробудление процесса<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 25 + <y:Shape type="ellipse"/> 26 + </y:ShapeNode> 27 + </data> 28 + </node> 29 + <node id="n1"> 30 + <data key="d5"/> 31 + <data key="d6"> 32 + <y:ShapeNode> 33 + <y:Geometry height="30.0" width="51.75999999999999" x="433.1280000000017" y="102.96000000000016"/> 34 + <y:Fill color="#FFCC00" transparent="false"/> 35 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 36 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="46.80859375" x="2.4757031249999955" xml:space="preserve" y="5.6494140625">Триггер<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 37 + <y:Shape type="roundrectangle"/> 38 + </y:ShapeNode> 39 + </data> 40 + </node> 41 + <node id="n2"> 42 + <data key="d5"/> 43 + <data key="d6"> 44 + <y:ShapeNode> 45 + <y:Geometry height="30.0" width="66.47999999999999" x="86.31200000000163" y="102.96000000000018"/> 46 + <y:Fill color="#FFCC00" transparent="false"/> 47 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 48 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.501953125" x="1.4890234374999807" xml:space="preserve" y="5.6494140625">Отправить<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 49 + <y:Shape type="roundrectangle"/> 50 + </y:ShapeNode> 51 + </data> 52 + </node> 53 + <node id="n3"> 54 + <data key="d5"/> 55 + <data key="d6"> 56 + <y:ShapeNode> 57 + <y:Geometry height="49.20000000000002" width="279.6" x="-20.24799999999837" y="265.2319999999994"/> 58 + <y:Fill color="#FFCC00" transparent="false"/> 59 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 60 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="272.072265625" x="3.7638671875000114" xml:space="preserve" y="7.898828124999994">Отправка сообщения через TransactionalOutbox 61 +(транзакционная запись в БД)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 62 + <y:Shape type="ellipse"/> 63 + </y:ShapeNode> 64 + </data> 65 + </node> 66 + <node id="n4"> 67 + <data key="d5"/> 68 + <data key="d6"> 69 + <y:ShapeNode> 70 + <y:Geometry height="30.0" width="146.47999999999996" x="46.312000000001674" y="355.0480000000008"/> 71 + <y:Fill color="#FFCC00" transparent="false"/> 72 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 73 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="125.0078125" x="10.73609374999998" xml:space="preserve" y="5.6494140625">Отправка triggerEvent<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 74 + <y:Shape type="ellipse"/> 75 + </y:ShapeNode> 76 + </data> 77 + </node> 78 + <node id="n5"> 79 + <data key="d5"/> 80 + <data key="d6"> 81 + <y:ShapeNode> 82 + <y:Geometry height="30.0" width="30.0" x="440.9999999999999" y="351.33600000000155"/> 83 + <y:Fill color="#FFFFFF" transparent="false"/> 84 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 85 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="13.0" y="13.0"> 86 + <y:LabelModel> 87 + <y:SmartNodeLabelModel distance="4.0"/> 88 + </y:LabelModel> 89 + <y:ModelParameter> 90 + <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> 91 + </y:ModelParameter> 92 + </y:NodeLabel> 93 + <y:Shape type="ellipse"/> 94 + </y:ShapeNode> 95 + </data> 96 + </node> 97 + <node id="n6"> 98 + <data key="d5"/> 99 + <data key="d6"> 100 + <y:ShapeNode> 101 + <y:Geometry height="30.0" width="122.80000000000007" x="710.2040000000015" y="102.96000000000018"/> 102 + <y:Fill color="#FFCC00" transparent="false"/> 103 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 104 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="88.041015625" x="17.37949218750009" xml:space="preserve" y="5.6494140625">Outbox process<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 105 + <y:Shape type="roundrectangle"/> 106 + </y:ShapeNode> 107 + </data> 108 + </node> 109 + <node id="n7"> 110 + <data key="d5"/> 111 + <data key="d6"> 112 + <y:ShapeNode> 113 + <y:Geometry height="30.0" width="66.47999999999999" x="86.31200000000163" y="709.7220000000023"/> 114 + <y:Fill color="#FFCC00" transparent="false"/> 115 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 116 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.501953125" x="1.489023437500009" xml:space="preserve" y="5.6494140625">Отправить<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 117 + <y:Shape type="roundrectangle"/> 118 + </y:ShapeNode> 119 + </data> 120 + </node> 121 + <node id="n8"> 122 + <data key="d5"/> 123 + <data key="d6"> 124 + <y:ShapeNode> 125 + <y:Geometry height="30.0" width="30.0" x="756.6040000000016" y="439.28000000000003"/> 126 + <y:Fill color="#FFFFFF" transparent="false"/> 127 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 128 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="13.0" y="13.0"> 129 + <y:LabelModel> 130 + <y:SmartNodeLabelModel distance="4.0"/> 131 + </y:LabelModel> 132 + <y:ModelParameter> 133 + <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> 134 + </y:ModelParameter> 135 + </y:NodeLabel> 136 + <y:Shape type="ellipse"/> 137 + </y:ShapeNode> 138 + </data> 139 + </node> 140 + <node id="n9"> 141 + <data key="d5"/> 142 + <data key="d6"> 143 + <y:ShapeNode> 144 + <y:Geometry height="30.0" width="210.80000000000007" x="666.2040000000015" y="617.216000000002"/> 145 + <y:Fill color="#FFCC00" transparent="false"/> 146 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 147 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="209.65234375" x="0.573828125000091" xml:space="preserve" y="5.6494140625">Обработка скопившихся сообщений.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 148 + <y:Shape type="ellipse"/> 149 + </y:ShapeNode> 150 + </data> 151 + </node> 152 + <node id="n10"> 153 + <data key="d5"/> 154 + <data key="d6"> 155 + <y:ShapeNode> 156 + <y:Geometry height="30.0" width="132.80000000000098" x="967.4200000000045" y="99.2480000000009"/> 157 + <y:Fill color="#FFCC00" transparent="false"/> 158 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 159 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="120.09765625" x="6.351171875000546" xml:space="preserve" y="5.6494140625">Страхующий триггер<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 160 + <y:Shape type="roundrectangle"/> 161 + </y:ShapeNode> 162 + </data> 163 + </node> 164 + <node id="n11"> 165 + <data key="d5"/> 166 + <data key="d6"> 167 + <y:ShapeNode> 168 + <y:Geometry height="30.0" width="132.80000000000098" x="967.4200000000045" y="709.7220000000023"/> 169 + <y:Fill color="#FFCC00" transparent="false"/> 170 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 171 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="120.09765625" x="6.351171875000432" xml:space="preserve" y="5.6494140625">Страхующий триггер<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 172 + <y:Shape type="roundrectangle"/> 173 + </y:ShapeNode> 174 + </data> 175 + </node> 176 + <node id="n12"> 177 + <data key="d5"/> 178 + <data key="d6"> 179 + <y:ShapeNode> 180 + <y:Geometry height="90.95999999999992" width="246.68" x="910.4800000000049" y="526.2560000000021"/> 181 + <y:Fill color="#FFCC00" transparent="false"/> 182 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 183 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="48.103515625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="212.65234375" x="17.013828125000032" xml:space="preserve" y="21.428242187500018">Пробуждает родительский процесс. 184 +Но это произойдет позже, 185 +чем это сделал бы основной триггер.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 186 + <y:Shape type="ellipse"/> 187 + </y:ShapeNode> 188 + </data> 189 + </node> 190 + <node id="n13"> 191 + <data key="d5"/> 192 + <data key="d6"> 193 + <y:ShapeNode> 194 + <y:Geometry height="145.68000000000006" width="374.863999999998" x="846.388000000006" y="329.81372800000196"/> 195 + <y:Fill color="#FFCC00" transparent="false"/> 196 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 197 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="48.103515625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="414.91796875" x="-20.026984375001007" xml:space="preserve" y="48.78824218750003">Обнаружил что есть необработанные сообщения, 198 +но transactionanOutbox процесс спит и давно не брался в обработку. 199 +Считает, что были утеряны TriggerEvent, поэтому необходимо пробудить<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 200 + <y:Shape type="diamond"/> 201 + </y:ShapeNode> 202 + </data> 203 + </node> 204 + <node id="n14"> 205 + <data key="d5"/> 206 + <data key="d6"> 207 + <y:GenericNode configuration="BevelNode"> 208 + <y:Geometry height="30.0" width="374.863999999998" x="1053.820000000005" y="147.99000000000058"/> 209 + <y:Fill color="#FF9900" transparent="false"/> 210 + <y:BorderStyle hasColor="false" type="line" width="1.0"/> 211 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="364.603515625" x="5.130242187498993" xml:space="preserve" y="-1.701171875">Запускается периодически и использует более тяжелый запрос. 212 +Проверяет всю таблицу или индекс.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 213 + </y:GenericNode> 214 + </data> 215 + </node> 216 + <node id="n15"> 217 + <data key="d5"/> 218 + <data key="d6"> 219 + <y:ShapeNode> 220 + <y:Geometry height="30.0" width="30.0" x="756.6040000000016" y="556.7360000000022"/> 221 + <y:Fill color="#FFFFFF" transparent="false"/> 222 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 223 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="13.0" y="13.0"> 224 + <y:LabelModel> 225 + <y:SmartNodeLabelModel distance="4.0"/> 226 + </y:LabelModel> 227 + <y:ModelParameter> 228 + <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> 229 + </y:ModelParameter> 230 + </y:NodeLabel> 231 + <y:Shape type="ellipse"/> 232 + </y:ShapeNode> 233 + </data> 234 + </node> 235 + <node id="n16"> 236 + <data key="d5"/> 237 + <data key="d6"> 238 + <y:ShapeNode> 239 + <y:Geometry height="30.0" width="122.80000000000007" x="710.2040000000015" y="709.7220000000023"/> 240 + <y:Fill color="#FFCC00" transparent="false"/> 241 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 242 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="88.041015625" x="17.37949218750009" xml:space="preserve" y="5.6494140625">Outbox process<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 243 + <y:Shape type="roundrectangle"/> 244 + </y:ShapeNode> 245 + </data> 246 + </node> 247 + <node id="n17"> 248 + <data key="d5"/> 249 + <data key="d6"> 250 + <y:ShapeNode> 251 + <y:Geometry height="30.0" width="51.75999999999999" x="430.1199999999999" y="709.7220000000023"/> 252 + <y:Fill color="#FFCC00" transparent="false"/> 253 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 254 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="46.80859375" x="2.4757031249999955" xml:space="preserve" y="5.6494140625">Триггер<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 255 + <y:Shape type="roundrectangle"/> 256 + </y:ShapeNode> 257 + </data> 258 + </node> 259 + <node id="n18"> 260 + <data key="d5"/> 261 + <data key="d6"> 262 + <y:ShapeNode> 263 + <y:Geometry height="44.07999999999993" width="463.28" x="224.3599999999999" y="523.489000000002"/> 264 + <y:Fill color="#FFCC00" transparent="false"/> 265 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> 266 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="426.173828125" x="18.553085937499986" xml:space="preserve" y="5.338828124999964">Выставляет небольшую задержку, чтобы если поступит новое сообщение, 267 +то воркер и так скорее всего выполняется и смысла запроса нет.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> 268 + <y:Shape type="ellipse"/> 269 + </y:ShapeNode> 270 + </data> 271 + </node> 272 + <edge id="e0" source="n4" target="n5"> 273 + <data key="d9"/> 274 + <data key="d10"> 275 + <y:PolyLineEdge> 276 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 277 + <y:LineStyle color="#000000" type="line" width="1.0"/> 278 + <y:Arrows source="none" target="standard"/> 279 + <y:BendStyle smoothed="false"/> 280 + </y:PolyLineEdge> 281 + </data> 282 + </edge> 283 + <edge id="e1" source="n2" target="n3"> 284 + <data key="d9"/> 285 + <data key="d10"> 286 + <y:PolyLineEdge> 287 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 288 + <y:LineStyle color="#000000" type="line" width="1.0"/> 289 + <y:Arrows source="none" target="standard"/> 290 + <y:BendStyle smoothed="false"/> 291 + </y:PolyLineEdge> 292 + </data> 293 + </edge> 294 + <edge id="e2" source="n3" target="n4"> 295 + <data key="d9"/> 296 + <data key="d10"> 297 + <y:PolyLineEdge> 298 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 299 + <y:LineStyle color="#000000" type="line" width="1.0"/> 300 + <y:Arrows source="none" target="standard"/> 301 + <y:BendStyle smoothed="false"/> 302 + </y:PolyLineEdge> 303 + </data> 304 + </edge> 305 + <edge id="e3" source="n4" target="n7"> 306 + <data key="d9"/> 307 + <data key="d10"> 308 + <y:PolyLineEdge> 309 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 310 + <y:LineStyle color="#000000" type="line" width="1.0"/> 311 + <y:Arrows source="none" target="standard"/> 312 + <y:BendStyle smoothed="false"/> 313 + </y:PolyLineEdge> 314 + </data> 315 + </edge> 316 + <edge id="e4" source="n1" target="n5"> 317 + <data key="d9"/> 318 + <data key="d10"> 319 + <y:PolyLineEdge> 320 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 321 + <y:LineStyle color="#000000" type="dashed" width="1.0"/> 322 + <y:Arrows source="none" target="standard"/> 323 + <y:BendStyle smoothed="false"/> 324 + </y:PolyLineEdge> 325 + </data> 326 + </edge> 327 + <edge id="e5" source="n0" target="n8"> 328 + <data key="d9"/> 329 + <data key="d10"> 330 + <y:PolyLineEdge> 331 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 332 + <y:LineStyle color="#000000" type="line" width="1.0"/> 333 + <y:Arrows source="none" target="standard"/> 334 + <y:BendStyle smoothed="false"/> 335 + </y:PolyLineEdge> 336 + </data> 337 + </edge> 338 + <edge id="e6" source="n6" target="n8"> 339 + <data key="d9"/> 340 + <data key="d10"> 341 + <y:PolyLineEdge> 342 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 343 + <y:LineStyle color="#000000" type="dashed" width="1.0"/> 344 + <y:Arrows source="none" target="standard"/> 345 + <y:BendStyle smoothed="false"/> 346 + </y:PolyLineEdge> 347 + </data> 348 + </edge> 349 + <edge id="e7" source="n13" target="n12"> 350 + <data key="d9"/> 351 + <data key="d10"> 352 + <y:PolyLineEdge> 353 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> 354 + <y:Point x="1238.3762880000015" y="397.053728000002"/> 355 + <y:Point x="1238.3762880000015" y="571.7360000000022"/> 356 + </y:Path> 357 + <y:LineStyle color="#000000" type="line" width="1.0"/> 358 + <y:Arrows source="none" target="standard"/> 359 + <y:BendStyle smoothed="false"/> 360 + </y:PolyLineEdge> 361 + </data> 362 + </edge> 363 + <edge id="e8" source="n12" target="n11"> 364 + <data key="d9"/> 365 + <data key="d10"> 366 + <y:PolyLineEdge> 367 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 368 + <y:LineStyle color="#000000" type="line" width="1.0"/> 369 + <y:Arrows source="none" target="standard"/> 370 + <y:BendStyle smoothed="false"/> 371 + </y:PolyLineEdge> 372 + </data> 373 + </edge> 374 + <edge id="e9" source="n13" target="n12"> 375 + <data key="d9"/> 376 + <data key="d10"> 377 + <y:PolyLineEdge> 378 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 379 + <y:LineStyle color="#000000" type="dashed" width="1.0"/> 380 + <y:Arrows source="none" target="standard"/> 381 + <y:BendStyle smoothed="false"/> 382 + </y:PolyLineEdge> 383 + </data> 384 + </edge> 385 + <edge id="e10" source="n10" target="n13"> 386 + <data key="d9"/> 387 + <data key="d10"> 388 + <y:PolyLineEdge> 389 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 390 + <y:LineStyle color="#000000" type="line" width="1.0"/> 391 + <y:Arrows source="none" target="standard"/> 392 + <y:BendStyle smoothed="false"/> 393 + </y:PolyLineEdge> 394 + </data> 395 + </edge> 396 + <edge id="e11" source="n12" target="n15"> 397 + <data key="d9"/> 398 + <data key="d10"> 399 + <y:PolyLineEdge> 400 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 401 + <y:LineStyle color="#000000" type="line" width="1.0"/> 402 + <y:Arrows source="none" target="standard"/> 403 + <y:BendStyle smoothed="false"/> 404 + </y:PolyLineEdge> 405 + </data> 406 + </edge> 407 + <edge id="e12" source="n8" target="n15"> 408 + <data key="d9"/> 409 + <data key="d10"> 410 + <y:PolyLineEdge> 411 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 412 + <y:LineStyle color="#000000" type="line" width="1.0"/> 413 + <y:Arrows source="none" target="standard"/> 414 + <y:BendStyle smoothed="false"/> 415 + </y:PolyLineEdge> 416 + </data> 417 + </edge> 418 + <edge id="e13" source="n9" target="n16"> 419 + <data key="d9"/> 420 + <data key="d10"> 421 + <y:PolyLineEdge> 422 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 423 + <y:LineStyle color="#000000" type="line" width="1.0"/> 424 + <y:Arrows source="none" target="standard"/> 425 + <y:BendStyle smoothed="false"/> 426 + </y:PolyLineEdge> 427 + </data> 428 + </edge> 429 + <edge id="e14" source="n15" target="n9"> 430 + <data key="d9"/> 431 + <data key="d10"> 432 + <y:PolyLineEdge> 433 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 434 + <y:LineStyle color="#000000" type="line" width="1.0"/> 435 + <y:Arrows source="none" target="standard"/> 436 + <y:BendStyle smoothed="false"/> 437 + </y:PolyLineEdge> 438 + </data> 439 + </edge> 440 + <edge id="e15" source="n12" target="n13"> 441 + <data key="d9"/> 442 + <data key="d10"> 443 + <y:PolyLineEdge> 444 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> 445 + <y:Point x="806.244000000001" y="545.1420000000005"/> 446 + <y:Point x="806.244000000001" y="402.653728000002"/> 447 + </y:Path> 448 + <y:LineStyle color="#000000" type="line" width="1.0"/> 449 + <y:Arrows source="none" target="standard"/> 450 + <y:BendStyle smoothed="false"/> 451 + </y:PolyLineEdge> 452 + </data> 453 + </edge> 454 + <edge id="e16" source="n18" target="n17"> 455 + <data key="d9"/> 456 + <data key="d10"> 457 + <y:PolyLineEdge> 458 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 459 + <y:LineStyle color="#000000" type="dashed" width="1.0"/> 460 + <y:Arrows source="none" target="standard"/> 461 + <y:BendStyle smoothed="false"/> 462 + </y:PolyLineEdge> 463 + </data> 464 + </edge> 465 + <edge id="e17" source="n5" target="n0"> 466 + <data key="d9"/> 467 + <data key="d10"> 468 + <y:PolyLineEdge> 469 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 470 + <y:LineStyle color="#000000" type="line" width="1.0"/> 471 + <y:Arrows source="none" target="standard"/> 472 + <y:BendStyle smoothed="false"/> 473 + </y:PolyLineEdge> 474 + </data> 475 + </edge> 476 + <edge id="e18" source="n18" target="n5"> 477 + <data key="d9"/> 478 + <data key="d10"> 479 + <y:PolyLineEdge> 480 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"> 481 + <y:Point x="197.1040000000018" y="545.529000000002"/> 482 + <y:Point x="197.1040000000018" y="391.66200000000015"/> 483 + </y:Path> 484 + <y:LineStyle color="#000000" type="line" width="1.0"/> 485 + <y:Arrows source="none" target="standard"/> 486 + <y:BendStyle smoothed="false"/> 487 + </y:PolyLineEdge> 488 + </data> 489 + </edge> 490 + <edge id="e19" source="n0" target="n18"> 491 + <data key="d9"/> 492 + <data key="d10"> 493 + <y:PolyLineEdge> 494 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> 495 + <y:LineStyle color="#000000" type="line" width="1.0"/> 496 + <y:Arrows source="none" target="standard"/> 497 + <y:BendStyle smoothed="false"/> 498 + </y:PolyLineEdge> 499 + </data> 500 + </edge> 501 + </graph> 502 + <data key="d7"> 503 + <y:Resources/> 504 + </data> 505 +</graphml> 506 +