Предложить постоянную стратегию для системы документооборота
Я нахожусь в процессе создания инструмента конфигурации пользовательского интерфейса для моего любимого проекта. Один из аспектов этого инструмента позволяет конечному пользователю определить свою оркестровку. Затем мне нужно сохранить это определение оркестровки в базе данных. Будет запущенная версия этого определения в работающей системе. Исполняемая версия создается динамически по требованию.
Идея состоит в том, чтобы отделить DEFINITION от EXECUTABLE версии, чтобы у меня была возможность выбрать версию времени исполнения среди BPMN или JPDL или решения для потока операций на основе POJO (BeanFlow).
Ограничение: я не могу использовать редакторы BPMN, которые поставляются с такими платформами, как jBPM, Activiti и т. Д., Так как я не хочу использовать свой собственный пользовательский интерфейс, специфичный для моего домена.
Мне нужны предложения, КАК ПРОДОЛЖИТЬ определение.
Должен ли я использовать таблицы rdbms? Если да, есть ли схема БД, которую я могу позаимствовать, близкая к концепции оркестровки?
Должен ли я сериализовать свое определение в документ экземпляра BPMN/JPDL XML?
Есть ли другие простые форматы, которые я могу использовать?
4 ответа
Под "оркестровкой" я предполагаю, что вы имеете в виду конечный автомат. Где текущее состояние диктует, какие переходы могут быть выполнены в другие состояния. Представление состояний и переходов в виде ребер и вершин часто приводит к созданию ориентированного ациклического графа, однако бывают циклы цикла (например, черновик - отправить на утверждение -> в ожидании утверждения - отклонить -> черновик).
На практике отделение определения от исполнения требует постоянного формата, который может легко приспособить настройку. По мере развития вашей системы вы обнаружите ряд непредвиденных крайних случаев, решение которых не должно требовать изменения схемы постоянства, только код. Это подразумевает XML или решение NoSQL - то, чья схема легко изменяется или не существует.
Теперь, написав собственное определение XML для этой цели (по неинтересным причинам, я исключу), я предлагаю использовать JPDL (или BPMN). Причина в том, что их определения, вероятно, включают в себя все, что вы рассматриваете сейчас, будете в будущем, и включите настройку - например, вывешивание произвольных данных или поведения на них в заданной точке. Вы также получаете преимущество уже созданных инструментов, а не только пользовательского интерфейса, для работы с обнаружением циклов и обеспечения, например, пути к завершению.
Я знаю, что JPDL обладает некоторыми интересными функциями, которые позволяют объединять разветвленные процессы, синхронизированные задачи (в том числе периодически повторяющиеся) и средства для отправки уведомлений. Этот последний пункт - уведомление - имеет некоторое дальнейшее изложение. Одна из вещей, которые я обнаружил в своей собственной системе, - это необходимость отправки настраиваемой электронной почты, содержимое которой основано на данных, проходящих через нее. Эти существующие механизмы делают это относительно легко, предоставляя способ вставлять переменные, например, в текст, который затем динамически оценивается во время выполнения перед передачей. Кроме того, они обеспечивают мосты между механизмом и любым хранилищем пользователей с целью отправки уведомлений группам людей, выполнения их задач и обеспечения соблюдения политики безопасности.
Наконец, в зависимости от области применения вашей системы, вы, вероятно, все еще будете использовать базу данных. То, что я предлагаю, - это сохранение XML и данных, которые оркестрируются в базу данных в сериализованном формате. Затем, если данные изменяются во время их выполнения, запишите сериализацию данных - и, возможно, рабочий процесс, если он также был изменен - в таблицу журнала / аудита.
Очень хороший вопрос! Вот мои два цента:
- СУБД: если вы сделаете это, вы сможете запросить экземпляры рабочего процесса, например, какие токены находятся в "узле X"?
- Хранение XML как clob: простота - это правда этого решения, но вы не можете запросить их, просто получите их по id
- NOSQL: есть много разных решений для разных задач. MongoDB - это популярное решение, обеспечивающее постоянное хранение документов.
Я бы НЕ использовал таблицы rdbms, или, если вы используете, храните определения в виде текстовых BLOB-объектов. Попытка сделать записи для определения - плохая идея, потому что это гораздо более негибко и со временем изменить ваше определение. Многие люди использовали бы разные подходы, но я бы использовал JSON или YAML и избегал XML. Мотивация для этого - сделать это как можно более простым. Попытка использовать XML, особенно формализованный специфический формат XML, заставит вас тратить гораздо больше времени на выполнение точной спецификации, которая на самом деле ничего не делает для того, чтобы вы пытались достичь. С JSON и YAML очень легко работать с точки зрения кода. YAML легче читается людьми и его легче редактировать, и он не так сложен для пунктуации и экранирования, как JSON. JSON более широко используется и меньше, чем YAML. У JSON также есть двоичный аналог, BSON, если важен размер документа.
Если у вас есть импортер / экспортер, который переходит к вашим внутренним объектам или из них в ваш формат данных, то сохранение с использованием RDBMS или других механизмов будет простым. Вы могли бы даже использовать CouchDB, который мог бы предложить другие преимущества для вашего приложения и мог бы отлично подойти.
Как насчет простой сериализации составного пользовательского интерфейса с использованием, например, XStream, а затем сохранить сериализованные биты в базе данных в виде двоичного столбца. Затем, когда пользователь входит в систему, получает связанные данные, десериализуется, инициализируется, если требуется, и отображает.