В настоящее время я разрабатываю простую веб-приложение Spring с использованием Spring Integration Framework. Я прочитал о шаблонах интеграции предприятия, целях, преимуществах ... Я избавился от ServiceLayer и делегировал рабочий процесс приложения в инфраструктуру интеграции. Но я столкнулся с некоторыми проблемами дизайна, где я застрял, и я был бы признателен за некоторый свет с точки зрения дизайна. Ниже я попытаюсь объяснить их, спасибо заранее.Весенняя интеграция Сомнения: операции CRUD и обмен событиями между компонентами
1. CRUD операции с Spring Integration Framework
Допустим, у вас есть 2 конечных точек, соединенных через прямой канал, 1 конечная точка принимает запросы, а другой обрабатывает эти запросы. Я не хочу говорить с точки зрения реализации, но из проекта (как я уже говорил ранее), но для того, чтобы прояснить это, изображение, которое вы реализуете принимающей конечной точкой как RestController, подключенный к шлюзу, и другую конечную точку как ServiceActivator подключен к адаптеру DB. Теперь есть 4 основных операции, которые пользователь может запросить, создать, прочитать, обновить и удалить (базовый CRUD). Поскольку конечная точка приемника может только выполнить один метод (метод handleMessage), каков правильный способ мультиплексирования 4 операций?
- Добавление какого-либо тега в заголовок сообщения? Мне кажется уродливым для меня, и кроме того, конечный пункт получателя должен будет реализовать блок if-else. Было бы проще просто подключить контроллер к интерфейсу и вызвать методы и избавиться от интеграции с пружиной.
- Создать 4 ServiceActivator, подключенный к той же БД? Мне тоже это не нравится, представьте, было ли у вас 30 операций вместо 4.
- Любое другое решение, которого я еще не нашел? Например, отправьте каждую операцию через другой канал, чтобы у вас было 4 канала. Вы можете сделать это с точки зрения шлюза, но проблема в том, что ServiceActivator может иметь только один входящий канал.
2. Обмен событие между конечными точками с Spring Integration Framework
Допустит, у вас есть шлюз подключен к трансформатору Transformer.The inits нити, в которой разбирают некоторые данные и отправить его к следующей конечной точке когда заканчивается. Теперь клиент шлюза должен знать статус запроса, который он отправил по каналу (поскольку Gateway ничего не знает о Transformer или его реализации, они ничего не должны рассказывать). Как это можно сделать, поскольку трансформатор имеет только 1 входящий канал и 1 выходной канал, и нет возможности публиковать результаты через третий канал? В сущности, вопрос заключается в том, как вы обмениваетесь событиями без связи с конечными точками или разрушением архитектуры шаблонов интеграции? P.D.: Пожалуйста, избегайте чистых ответов, таких как статические общие объекты, спасибо.
Спасибо, Артем, очень полезный ответ. Я понял первую часть, но не получил вторую. Из того, что я понимаю, трансформатор может иметь только один метод, поэтому невозможно отправить сообщение, уведомляющее состояние потока, которое выполняется внутри трансформатора, посредством публикации/подписки. Подводя итог, я получил контроллер -> gateway -> transformer -> исходящий адаптер. В трансформаторе есть задача. Мне нужно опросить процент задачи от контроллера, чтобы показать его в виде html. Как это можно сделать? Моя другая проблема - это область этого потока. Благодаря! – Quark
Ну, вы можете опубликовать процент от этого потока к некоторому 'QueueChannel', и когда ваш контроллер придет, чтобы проверить состояние, он будет просто опросить сообщения из этого' QueueChannel'. Или ... Вы можете просто использовать 'AtomicReference', чтобы разместить последние достижения, и контроллер просто взглянет на это значение на' AtomicReference.get() '. –
Еще раз спасибо Артем. Я не знал, что вы можете вводить каналы непосредственно на классы. Я думал, что все это автоматизировано с аннотациями и что у вас нет контроля над объектом канала. Я нарушаю архитектуру, если трансформатор публиковал другие сообщения, поскольку у него было бы более одной ответственности (трансформации)? Кроме того, если в трансформаторе есть задача в каждом сеансе контроллера, как я могу распознать эту задачу? Кроме того, как я могу обновить канал до правильного потока сеанса? Должен ли я использовать заголовки сообщений или, возможно, @Session при создании каналов/конечных точек/задач? – Quark