1

В настоящее время я разрабатываю простую веб-приложение Spring с использованием Spring Integration Framework. Я прочитал о шаблонах интеграции предприятия, целях, преимуществах ... Я избавился от ServiceLayer и делегировал рабочий процесс приложения в инфраструктуру интеграции. Но я столкнулся с некоторыми проблемами дизайна, где я застрял, и я был бы признателен за некоторый свет с точки зрения дизайна. Ниже я попытаюсь объяснить их, спасибо заранее.Весенняя интеграция Сомнения: операции CRUD и обмен событиями между компонентами

1. CRUD операции с Spring Integration Framework

Допустим, у вас есть 2 конечных точек, соединенных через прямой канал, 1 конечная точка принимает запросы, а другой обрабатывает эти запросы. Я не хочу говорить с точки зрения реализации, но из проекта (как я уже говорил ранее), но для того, чтобы прояснить это, изображение, которое вы реализуете принимающей конечной точкой как RestController, подключенный к шлюзу, и другую конечную точку как ServiceActivator подключен к адаптеру DB. Теперь есть 4 основных операции, которые пользователь может запросить, создать, прочитать, обновить и удалить (базовый CRUD). Поскольку конечная точка приемника может только выполнить один метод (метод handleMessage), каков правильный способ мультиплексирования 4 операций?

  1. Добавление какого-либо тега в заголовок сообщения? Мне кажется уродливым для меня, и кроме того, конечный пункт получателя должен будет реализовать блок if-else. Было бы проще просто подключить контроллер к интерфейсу и вызвать методы и избавиться от интеграции с пружиной.
  2. Создать 4 ServiceActivator, подключенный к той же БД? Мне тоже это не нравится, представьте, было ли у вас 30 операций вместо 4.
  3. Любое другое решение, которого я еще не нашел? Например, отправьте каждую операцию через другой канал, чтобы у вас было 4 канала. Вы можете сделать это с точки зрения шлюза, но проблема в том, что ServiceActivator может иметь только один входящий канал.

2. Обмен событие между конечными точками с Spring Integration Framework

Допустит, у вас есть шлюз подключен к трансформатору Transformer.The inits нити, в которой разбирают некоторые данные и отправить его к следующей конечной точке когда заканчивается. Теперь клиент шлюза должен знать статус запроса, который он отправил по каналу (поскольку Gateway ничего не знает о Transformer или его реализации, они ничего не должны рассказывать). Как это можно сделать, поскольку трансформатор имеет только 1 входящий канал и 1 выходной канал, и нет возможности публиковать результаты через третий канал? В сущности, вопрос заключается в том, как вы обмениваетесь событиями без связи с конечными точками или разрушением архитектуры шаблонов интеграции? P.D.: Пожалуйста, избегайте чистых ответов, таких как статические общие объекты, спасибо.

ответ

2

M-m-m. Ваша озабоченность почему-то непонятна.

Когда у вас был ServiceLayer раньше, я уверен, что многие методы для конкретной операции вас не беспокоят. Поэтому не знаете, почему вы так беспокоитесь о том, что канал сообщений отличается от операций при переключении на архитектуру Messaging.

В то же время я думаю, что @Cotroller с GET, POST, DELETE и т.д. @RequestMapping для его методы не относятся к вам снова.

Это немного неудобно иметь дополнительные объекты в вашем приложении в лице MessageChannel s между вашими конечными точками. Но в то же время это бонус, когда вы начинаете думать о своем приложении как о потоке сообщений, где каждый из них отделен от моего MessageChannel, и вы можете изменить любой поток, не влияющий на какой-либо другой. Кроме того, не забывайте, что с помощью MessageChannel вы можете просто перейти в распределенный режим, когда ваша бизнес-логика будет одинаковой, но сообщения перемещаются по сети для целевых служб или в других целях.

Итак, у IMO у меня есть @MessagingGateway для звонка с @Controller, и каждый метод шлюза будет отображаться на конкретный MessageChannel.

Благодаря аннотации модели вы могли иметь только один целевой сервис, но с помощью метода для каждой операции CRUD с @ServiceActivator для конкретного MessageChannel отметили:

@MessagingGateway 
public interface CrudGateway { 

    @Gateway(requestChannel = "getChannel") 
    Object get(Object id); 

    @Gateway(requestChannel = "saveChannel") 
    Object save(Object object); 

    @Gateway(requestChannel = "deleteChannel") 
    boolean delete(Object object); 

} 

... 

@Service 
public class CrudService { 

    @ServiceActivator(inputChannel = "getChannel") 
    public Object get(Object id) { 
     // SELECT 
    } 

    @ServiceActivator(inputChannel = "saveChannel") 
    public Object save(Object object) { 
     // INSERT or UPDATE 
    } 

    @ServiceActivator(inputChannel = "deleteChannel") 
    public boolean delete(Object object) { 
     // DELETE 
    } 

} 

Для вашего второго вопроса есть какой-то ответ, как хорошо.

Рассмотрите возможность использования PublishSubscribeChannel в качестве вывода этого transformer.

С другой стороны, есть RecipientListRouter для распространения входящего сообщения нескольким получателям - каналам, конечно.

+0

Спасибо, Артем, очень полезный ответ. Я понял первую часть, но не получил вторую. Из того, что я понимаю, трансформатор может иметь только один метод, поэтому невозможно отправить сообщение, уведомляющее состояние потока, которое выполняется внутри трансформатора, посредством публикации/подписки. Подводя итог, я получил контроллер -> gateway -> transformer -> исходящий адаптер. В трансформаторе есть задача. Мне нужно опросить процент задачи от контроллера, чтобы показать его в виде html. Как это можно сделать? Моя другая проблема - это область этого потока. Благодаря! – Quark

+1

Ну, вы можете опубликовать процент от этого потока к некоторому 'QueueChannel', и когда ваш контроллер придет, чтобы проверить состояние, он будет просто опросить сообщения из этого' QueueChannel'. Или ... Вы можете просто использовать 'AtomicReference', чтобы разместить последние достижения, и контроллер просто взглянет на это значение на' AtomicReference.get() '. –

+0

Еще раз спасибо Артем. Я не знал, что вы можете вводить каналы непосредственно на классы. Я думал, что все это автоматизировано с аннотациями и что у вас нет контроля над объектом канала. Я нарушаю архитектуру, если трансформатор публиковал другие сообщения, поскольку у него было бы более одной ответственности (трансформации)? Кроме того, если в трансформаторе есть задача в каждом сеансе контроллера, как я могу распознать эту задачу? Кроме того, как я могу обновить канал до правильного потока сеанса? Должен ли я использовать заголовки сообщений или, возможно, @Session при создании каналов/конечных точек/задач? – Quark

 Смежные вопросы

  • Нет связанных вопросов^_^