Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 Совет по архитектуре Spring MVC  [new]
capfreedom228
Member

Откуда:
Сообщений: 25
Добрый день!
Пишу бэкенд сервера для работы с кассами.
Стек технологий Java/Spring Boot/MySql
В качестве БД взял MySQL (ибо фронт уже на нем).
По сути сервер должен принимать задания в виде json, а кассы эти задания должны выполнять.
Внутри кассы нет очереди и работают они только в одном потоке, грубо говоря так:
Kassa a = new Kassa(settings);
a.open(); // в этот момент больше никто к кассе не может подключиться, open может выполняться несколько секунд
Result r = a.processTask("some json"); // может выполняться несколько секунд
a.close();


Идея была следующая: храним кассы в таблице devices, задания в таблице tasks.
При старте сервера запускаем столько потоков, сколько девайсов в таблице devices.
Потоки с определенным периодом делают селект из таблицы с заданиями и поочередно их выполняют.
Апи для заданий асинхронное, т.е. снаружи прилетает post запрос, создается запись в таблице tasks и назад клиенту отдается id этого задания.
По id задания клиент может отследить прогресс и результат. (GET /task/{id})

В результате получились следующие классы:
Контроллеры - спринговые @RestControllerы:
  • DeviceController
  • TaskController
    Модели - стандартные Entity:
  • Device
  • Task
    Репозитории - спринговые JpaRepository:
  • DeviceRepository
  • TaskRepository
    Сервис:
  • DeviceService - спринговый @Service, при инициализации сервис читает из базы список касс и создает на каждую по потоку (экземпляр DeviceWorker) и запускает их.
    Worker:
  • DeviceWorker - собственно класс наследник thread, который получает и задания из базы и работает с кассой.

    Каким компонентом спринга должен быть DeviceWorker в данной ситуации, чтобы было удобно инжектить внутрь него репозитории и нормально работали транзакции. Я читал и про спринговые TaskExecutor и про Scheduler, но так и не смог понять как их применить в данной ситуации.
    Сейчас я передаю экземпляры репозиториев через конструктор из DeviceService при создании воркеров. Но такое ощущение, что это кривое решение и могут быть проблемы с транзакциями(хотя и работает).
    Репозитории внутри воркера нужны для обновления статуса девайса, таска и записи результата выполнения таска.
  • 26 сен 19, 18:53    [21980229]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    Апи для заданий асинхронное, т.е. снаружи прилетает post запрос, создается запись в таблице tasks и
    где обоснование нужности асинхронности?
    26 сен 19, 21:41    [21980315]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228,
    Post кто делает? Человек?
    Тогда вариант без асинхронности - делает задание и вкладка кассы1 висит 15 сек. Вполне допустимо.
    Надо быстрее, жмакает новую вкладку касса2 и тоже ждет.
    Вариант асинхронный - 2 веб приложения.
    Приложение А просто пишет в бд задание.
    Приложение Б это демон или сервис без ГУИ круглосуточно их выполняет.
    26 сен 19, 22:00    [21980326]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp,

    Асинхронность нужна, т.к. задания могут выполняться неопределенно долго. И если будет 5 одновременных заданий то последний зависнет больше чем на минуту, а это неприемлимо.
    26 сен 19, 22:18    [21980335]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp,

    Post из фронта прилетает из браузера.
    26 сен 19, 22:19    [21980336]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    PetroNotC Sharp,

    Асинхронность нужна, т.к. задания могут выполняться неопределенно долго. И если будет 5 одновременных заданий то последний зависнет больше чемн на минуту, а это неприемлимо.
    контейнер веб сервера при занятом сервлете запускает новый экземпляр.
    Значит 5 вкладок выполнятся вместе за 15 сек.
    Проверь
    26 сен 19, 22:23    [21980341]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    Дмитрий Мух
    Member

    Откуда: Зеленоград
    Сообщений: 2343
    capfreedom228,

    в мире Java нет аналогов Hangfire?
    26 сен 19, 22:26    [21980346]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    Дмитрий Мух
    capfreedom228,

    в мире Java нет аналогов Hangfire?
    в мире шарпа нет контейнера?
    https://ru.m.wikipedia.org/wiki/Контейнер_сервлетов
    26 сен 19, 22:35    [21980356]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    chpasha
    Member

    Откуда:
    Сообщений: 8441
    capfreedom228
    Каким компонентом спринга должен быть DeviceWorker в данной ситуации, чтобы было удобно инжектить внутрь него репозитории и нормально работали транзакции

    Я бы попробовал обыкновенный спринговый bean с одним публичным методом и аннотацией Async - почитай про нее. Если кол-во девайсов число постоянное на момент старта, то просто настроить taskexecutor с пулом нужного размера
    26 сен 19, 22:53    [21980364]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    PetroNotC Sharp,

    Асинхронность нужна, т.к. задания могут выполняться неопределенно долго. И если будет 5 одновременных заданий то последний зависнет больше чемн на минуту, а это неприемлимо.
    контейнер веб сервера при занятом сервлете запускает новый экземпляр.
    Значит 5 вкладок выполнятся вместе за 15 сек.
    Проверь


    касса в 1 поток работает
    26 сен 19, 23:20    [21980386]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    chpasha
    capfreedom228
    Каким компонентом спринга должен быть DeviceWorker в данной ситуации, чтобы было удобно инжектить внутрь него репозитории и нормально работали транзакции

    Я бы попробовал обыкновенный спринговый bean с одним публичным методом и аннотацией Async - почитай про нее. Если кол-во девайсов число постоянное на момент старта, то просто настроить taskexecutor с пулом нужного размера


    хотелось иметь возможность добавлять кассы без рестарта
    26 сен 19, 23:21    [21980387]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228,
    Не понял.
    Касса синглетон или можно сделать
    Kassa a = new Kassa(settings);
    Kassa б = new Kassa(settings);
    ?
    26 сен 19, 23:24    [21980390]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228,
    Не понял.
    Касса синглетон или можно сделать
    Kassa a = new Kassa(settings);
    Kassa б = new Kassa(settings);
    ?


    сделать можно, но когда ты вызовешь a.open(); то b.open(); - выдаст ошибку подключения.
    26 сен 19, 23:26    [21980391]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    выдаст ошибку подключения.
    то есть нужна асинхронность, но касса категорически однопоточна?
    Фиктивная нужна? Зачем?
    26 сен 19, 23:32    [21980395]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    Чтобы касса не простаивала))))))))?
    26 сен 19, 23:33    [21980396]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    chpasha,
    Выяснили что аннотация не подходит
    26 сен 19, 23:34    [21980398]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    Чтобы касса не простаивала))))))))?


    Такое тз
    26 сен 19, 23:34    [21980399]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    PetroNotC Sharp
    Чтобы касса не простаивала))))))))?


    Такое тз
    тогда один вариант
    Второй в 21980326
    26 сен 19, 23:37    [21980401]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    выдаст ошибку подключения.
    то есть нужна асинхронность, но касса категорически однопоточна?
    Фиктивная нужна? Зачем?


    Чеки электронные и клиенту нет смысла ждать.
    26 сен 19, 23:39    [21980403]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    Чеки электронные и клиенту нет смысла ждать.
    все хуже. Касса синглетон.
    Решение выше. Удачи.
    26 сен 19, 23:46    [21980404]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    Sergunka
    Member

    Откуда: Bay Area, CA
    Сообщений: 1967
    chpasha
    capfreedom228
    Каким компонентом спринга должен быть DeviceWorker в данной ситуации, чтобы было удобно инжектить внутрь него репозитории и нормально работали транзакции

    Я бы попробовал обыкновенный спринговый bean с одним публичным методом и аннотацией Async - почитай про нее. Если кол-во девайсов число постоянное на момент старта, то просто настроить taskexecutor с пулом нужного размера


    Можно еще лоадбалансер настроить на пару тройку серверов, чтоб уж совсем все было хорошо.
    27 сен 19, 00:10    [21980417]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    Sergunka
    Member

    Откуда: Bay Area, CA
    Сообщений: 1967
    capfreedom228
    chpasha
    пропущено...

    Я бы попробовал обыкновенный спринговый bean с одним публичным методом и аннотацией Async - почитай про нее. Если кол-во девайсов число постоянное на момент старта, то просто настроить taskexecutor с пулом нужного размера


    хотелось иметь возможность добавлять кассы без рестарта


    А параметром номер кассы никак нельзя передать?
    27 сен 19, 00:12    [21980418]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    Sergunka
    capfreedom228
    пропущено...


    хотелось иметь возможность добавлять кассы без рестарта


    А параметром номер кассы никак нельзя передать?


    В таске зафиксирован id кассы, т.е. каждый таск предназначен конкретной кассе.
    27 сен 19, 00:32    [21980421]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    Sergunka
    Member

    Откуда: Bay Area, CA
    Сообщений: 1967
    capfreedom228
    Sergunka
    пропущено...


    А параметром номер кассы никак нельзя передать?


    В таске зафиксирован id кассы, т.е. каждый таск предназначен конкретной кассе.


    Как то уж совсем тупенько. Вот к примеру мой учебный пример на основе пулэкзекьютора написанный пятью годам ранее. Классическая задача Дейкстры - спящий парикмахер

    https://vyatkins.wordpress.com/2013/12/21/sleeping-barber-problem/

    https://github.com/SVyatkin/KafkaSleepingBarberProblem/blob/master/src/main/java/com/sleeping/barber/blockingQueue/BlockingQueueSleepingBarbersPoolExecutor.java

    Нет там большой проблемы передать параметр

    	class Barber extends Thread {
    		BlockingQueue<Integer> queue = null;
    		private String name;
    
    		public Barber(BlockingQueue<Integer> queue, String name) {
    			this.name = name;
    			this.queue = queue;
    		}
    
    		public void run() {
    			while (true) { // runs in an infinite loop
    
    				try {
    					Integer i = this.queue.poll(OFFICE_CLOSE,
    							TimeUnit.MILLISECONDS);
    					if (i == null)
    						break; // barber slept for long time (OFFICE_CLOSE) no
    								// more clients in the queue - close office
    					this.cutHair(i); // cutting...
    
    				} catch (InterruptedException e) {
    				}
    			}
    		}
    
    		public void cutHair(Integer i) {
    			System.out.println("The barber " + this.name
    					+ " is cutting hair for customer #" + i);
    			try {
    				sleep(BARBER_TIME);
    			} catch (InterruptedException ex) {
    			}
    		}
    	}
    


    Что там за таск такой? Код покажи?
    27 сен 19, 04:33    [21980445]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    mad_nazgul
    Member

    Откуда:
    Сообщений: 4838
    capfreedom228
    Идея была следующая: храним кассы в таблице devices, задания в таблице tasks.
    При старте сервера запускаем столько потоков, сколько девайсов в таблице devices.
    Потоки с определенным периодом делают селект из таблицы с заданиями и поочередно их выполняют.
    Апи для заданий асинхронное, т.е. снаружи прилетает post запрос, создается запись в таблице tasks и назад клиенту отдается id этого задания.
    По id задания клиент может отследить прогресс и результат. (GET /task/{id})


    ИМХО не делать брокер/очередь сообщений на БД, а воспользоваться соответствующим инструментом (MQ, Kafka и т.д.)
    Результат отправлять так же по тому же брокеру сообщений.
    Связь можно сделать, по CorellationID. Создается в сессии контролера и там же храниться, нужен чтобы получить соответствующий ответ.
    27 сен 19, 07:00    [21980455]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    Sergunka,
    Он же говорит что райзе будет при одновременной работе двух экземпляров, а при async так и слуится.
    27 сен 19, 08:03    [21980474]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    mad_nazgul
    capfreedom228
    Идея была следующая: храним кассы в таблице devices, задания в таблице tasks.
    При старте сервера запускаем столько потоков, сколько девайсов в таблице devices.
    Потоки с определенным периодом делают селект из таблицы с заданиями и поочередно их выполняют.
    Апи для заданий асинхронное, т.е. снаружи прилетает post запрос, создается запись в таблице tasks и назад клиенту отдается id этого задания.
    По id задания клиент может отследить прогресс и результат. (GET /task/{id})


    ИМХО не делать брокер/очередь сообщений на БД, а воспользоваться соответствующим инструментом (MQ, Kafka и т.д.)
    Результат отправлять так же по тому же брокеру сообщений.
    Связь можно сделать, по CorellationID. Создается в сессии контролера и там же храниться, нужен чтобы получить соответствующий ответ.


    Не хотелось ради одной очереди тянуть какое то дополнительное ПО.
    27 сен 19, 11:17    [21980635]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228,
    Очередь либо в базе, либо в аппСервере чере ПО.
    Больше никак.
    В базе свою очередь сделать элементарно.
    27 сен 19, 11:20    [21980642]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    Попробую использовать подход из этой статьи
    https://thebackendguy.com/spring-schedule-tasks-or-cron-jobs-dynamically/
    27 сен 19, 11:27    [21980656]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    Попробую использовать подход из этой статьи
    https://thebackendguy.com/spring-schedule-tasks-or-cron-jobs-dynamically/
    шедулер это будильник. А тебе надо загрузить зданиями СВОБОДНУЮ кассу.
    Периодичности тут нет.
    Не выйдет. Либо ТЗ коряво описал.
    27 сен 19, 11:35    [21980681]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    Попробую использовать подход из этой статьи
    https://thebackendguy.com/spring-schedule-tasks-or-cron-jobs-dynamically/
    шедулер это будильник. А тебе надо загрузить зданиями СВОБОДНУЮ кассу.
    Периодичности тут нет.
    Не выйдет. Либо ТЗ коряво описал.


    Шедулер выполняет действия с определенным периодом, в моем случае действия - селект из базы заданий для конкретной кассы и их выполнение.
    Соответственно могу запустить на каждую кассу по такому шедулеру.
    27 сен 19, 11:42    [21980691]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    Попробую использовать подход из этой статьи
    https://thebackendguy.com/spring-schedule-tasks-or-cron-jobs-dynamically/
    шедулер это будильник. А тебе надо загрузить зданиями СВОБОДНУЮ кассу.
    Периодичности тут нет.
    Не выйдет. Либо ТЗ коряво описал.


    На счет свободной кассы:
    В таске прописано на какой кассе оно должно быть выполнено, т.е. не свободную.
    27 сен 19, 11:43    [21980695]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    Шедулер выполняет действия с определенным периодом,
    ПО ВРЕМЕНИ карл!
    Например, каждый вторник на 10 утра. Или запуск задачи через 10 минут после POST юзверя.
    capfreedom228
    могу запустить на каждую кассу

    Ты гоаорил что касса А Б не могут одновременно.
    27 сен 19, 11:46    [21980702]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    На счет свободной кассы:
    В таске прописано на какой кассе оно должно быть выполнено, т.е. не свободную
    это ТЗ или твоя придумка?
    Если ТЗ покажи цитату из первой страницы топика.
    27 сен 19, 11:49    [21980709]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    На счет свободной кассы:
    В таске прописано на какой кассе оно должно быть выполнено, т.е. не свободную
    это ТЗ или твоя придумка?
    Если ТЗ покажи цитату из первой страницы топика.


    Это ТЗ, я забыл это написать в первом посте.
    27 сен 19, 11:53    [21980717]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    Шедулер выполняет действия с определенным периодом,
    ПО ВРЕМЕНИ карл!
    Например, каждый вторник на 10 утра. Или запуск задачи через 10 минут после POST юзверя.
    capfreedom228
    могу запустить на каждую кассу

    Ты гоаорил что касса А Б не могут одновременно.


    Я говорил, что ты не можешь к одной и той же кассе подключиться одновременно разными потоками.
    27 сен 19, 11:54    [21980718]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    capfreedom228
    PetroNotC Sharp
    пропущено...
    ПО ВРЕМЕНИ карл!
    Например, каждый вторник на 10 утра. Или запуск задачи через 10 минут после POST юзверя.
    пропущено...

    Ты гоаорил что касса А Б не могут одновременно.


    Я говорил, что ты не можешь к одной и той же кассе подключиться одновременно разными потоками.


    На счет ПО ВРЕМЕНИ - не вижу противоречия. Раз 5 секунд например будет делать селект из таблицы с заданиями и их выполнять.
    27 сен 19, 11:57    [21980726]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    Это ТЗ, я забыл это написать в первом посте.
    поэтому мы копаемся вторую страницу в детском вопросе

    capfreedom228
    Я говорил, что ты не можешь к одной и той же кассе подключиться одновременно разными потоками.

    Выше мой вопрос с ДВУМЯ ЭКЗЕМЛЯРАМИ var a =, var b= видим?
    Ответь еще раз.
    27 сен 19, 12:12    [21980743]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    mad_nazgul
    Member

    Откуда:
    Сообщений: 4838
    capfreedom228
    Не хотелось ради одной очереди тянуть какое то дополнительное ПО.


    Тогда имплементация embedded MQ.
    Есть еще Spring Integration... Но мне лично не очень понравилось, но вы можете посмотреть.
    27 сен 19, 12:13    [21980745]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    Раз 5 секунд например будет делать селект из таблицы с заданиями и их выполнять.
    да. Выше сказал, это приложение #2 демон в линукс.
    Никакого отношения к приложению с post он не имеет.
    Тогда согласен.
    27 сен 19, 12:14    [21980747]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    mad_nazgul
    capfreedom228
    Не хотелось ради одной очереди тянуть какое то дополнительное ПО.


    Тогда имплементация embedded MQ.
    Есть еще Spring Integration... Но мне лично не очень понравилось, но вы можете посмотреть.
    это тоже дополнительное ПО
    27 сен 19, 12:15    [21980749]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    Это ТЗ, я забыл это написать в первом посте.
    поэтому мы копаемся вторую страницу в детском вопросе

    capfreedom228
    Я говорил, что ты не можешь к одной и той же кассе подключиться одновременно разными потоками.

    Выше мой вопрос с ДВУМЯ ЭКЗЕМЛЯРАМИ var a =, var b= видим?
    Ответь еще раз.


    Если делать так:
    Kassa a = new Kassa(settings1);
    Kassa b = new Kassa(settings2);
    a.open();
    b.open();
    


    то конфликта не будет, разные кассы могут работать одновременно(что мне казалось очевидным).

    В твоем примере было так:
    Kassa a = new Kassa(settings);
    Kassa b = new Kassa(settings);
    


    т.е. оба экземпляра смотрят на одну кассу.
    27 сен 19, 12:24    [21980756]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    Kassa a = new Kassa(settings);
    Kassa b = new Kassa(settings);
    



    т.е. оба экземпляра смотрят на одну кассу.
    ну ты даешь))))))
    27 сен 19, 12:28    [21980761]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    Kassa a = new Kassa(settings);
    Kassa b = new Kassa(settings);
    



    т.е. оба экземпляра смотрят на одну кассу.
    ну ты даешь))))))


    ???
    27 сен 19, 12:28    [21980762]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228,
    Если мне кто из java скажет что это было очевидно - посыплю голову пеплом))).
    Mayton, это было очевидно?
    27 сен 19, 12:34    [21980765]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    вадя
    Member

    Откуда: Екатеринбург
    Сообщений: 16686
    capfreedom228
    т.е. оба экземпляра смотрят на одну кассу.
    если Kassa синглтон
    27 сен 19, 12:36    [21980767]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    В первом посте, я писал, что если сделать a.open(); то больше никто не может подключиться к этой кассе.
    Извиняюсь, если расписал недостаточно подробно.
    27 сен 19, 12:39    [21980771]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    В первом посте, я писал, что если сделать a.open(); то больше никто не может подключиться к этой кассе.
    Извиняюсь, если расписал недостаточно подробно.
    проехали
    27 сен 19, 12:44    [21980778]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    Kassa a = new Kassa(settings1);
    
    получается, нас в контексте задачи не интересует параметер settings1 или 2...
    Это твои проблемы.
    ЗАЧЕМ ЗАДАНИЕ ПРИВЯЗЫВАТЬ К КАССЕ?
    27 сен 19, 12:46    [21980782]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    вадя
    capfreedom228
    т.е. оба экземпляра смотрят на одну кассу.
    если Kassa синглтон
    нет). Если в переменной settings одна и та же КассаИменемПети)
    27 сен 19, 12:48    [21980783]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228
    Kassa a = new Kassa(settings1);
    
    получается, нас в контексте задачи не интересует параметер settings1 или 2...
    Это твои проблемы.
    ЗАЧЕМ ЗАДАНИЕ ПРИВЯЗЫВАТЬ К КАССЕ?


    Я в курсе, что это мои проблемы. Клиент формирует задание для конкретной кассы, такова бизнес логика.
    Заданием может быть например перезагрузка кассы, или обновление каких то настроек или печать чека, все это относится к конкретной кассе.
    27 сен 19, 12:52    [21980788]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    вадя
    Member

    Откуда: Екатеринбург
    Сообщений: 16686
    PetroNotC Sharp
    нет). Если в переменной settings одна и та же КассаИменемПети)

    ну да если
    PetroNotC Sharp
    получается, нас в контексте задачи не интересует параметер settings1 или 2...
    27 сен 19, 12:53    [21980790]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228,
    Наконец то ты сформировал все ТЗ.
    Решение в моем первом посте. Гадал на кофейной гуще.
    27 сен 19, 13:04    [21980803]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228,
    Наконец то ты сформировал все ТЗ.
    Решение в моем первом посте. Гадал на кофейной гуще.


    Спасибо, но это абстрактное решение.
    В нем ни слова про Spring. Вопрос то был именно в том, чтобы выяснить, как в рамках спринга это красиво реализовать.
    Или выяснить, что стандартные компоненты не подходят и надо либо искать другие, либо писать свои.
    27 сен 19, 13:19    [21980825]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    В нем ни слова про Spring.
    а задача не для спринга))
    Что поделать.
    Тут противоречие. Либо просто и логично, либо спринг, будь он неладен))
    27 сен 19, 13:25    [21980830]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228,
    Стоп. Спинг MVC это ГУИ.
    Образец - Цветочный магазин.
    И не мешай сюда свои кассы убогие.
    27 сен 19, 13:27    [21980831]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    Sergunka
    capfreedom228
    пропущено...


    В таске зафиксирован id кассы, т.е. каждый таск предназначен конкретной кассе.


    Как то уж совсем тупенько. Вот к примеру мой учебный пример на основе пулэкзекьютора написанный пятью годам ранее. Классическая задача Дейкстры - спящий парикмахер

    https://vyatkins.wordpress.com/2013/12/21/sleeping-barber-problem/

    https://github.com/SVyatkin/KafkaSleepingBarberProblem/blob/master/src/main/java/com/sleeping/barber/blockingQueue/BlockingQueueSleepingBarbersPoolExecutor.java

    Нет там большой проблемы передать параметр

    	class Barber extends Thread {
    		BlockingQueue<Integer> queue = null;
    		private String name;
    
    		public Barber(BlockingQueue<Integer> queue, String name) {
    			this.name = name;
    			this.queue = queue;
    		}
    
    		public void run() {
    			while (true) { // runs in an infinite loop
    
    				try {
    					Integer i = this.queue.poll(OFFICE_CLOSE,
    							TimeUnit.MILLISECONDS);
    					if (i == null)
    						break; // barber slept for long time (OFFICE_CLOSE) no
    								// more clients in the queue - close office
    					this.cutHair(i); // cutting...
    
    				} catch (InterruptedException e) {
    				}
    			}
    		}
    
    		public void cutHair(Integer i) {
    			System.out.println("The barber " + this.name
    					+ " is cutting hair for customer #" + i);
    			try {
    				sleep(BARBER_TIME);
    			} catch (InterruptedException ex) {
    			}
    		}
    	}
    


    Что там за таск такой? Код покажи?


    Заданием может быть например перезагрузка кассы, или обновление каких то настроек или печать чека, все это относится к конкретной кассе.

    Вот например задание на печать чека:
    {
      "inn": "1111111111", // по инн однозначно определяется касса
      "request": {
        "type": "sell",
        "taxationType": "osn",
        "ignoreNonFiscalPrintErrors": false,
        "electronically": false,
        "operator": {
          "name": "Иванов",
          "vatin": "123654789507"
        },
        "clientInfo": {
          "emailOrPhone": "+7912345678"
        },
        "items": [
          {
            "type": "position",
            "name": "Бананы",
            "price": 1.0,
            "quantity": 1.0,
            "amount": 1.0,
            "paymentObject": "commodity",
            "tax": {
              "type": "vat18"
            }
          },
          {
            "type": "position",
            "name": "Апельсины",
            "price": 1.0,
            "quantity": 1.0,
            "amount": 1.0,
            "paymentObject": "commodity",
            "tax": {
              "type": "vat18"
            }
          }
        ],
        "payments": [
          {
            "type": "cash",
            "sum": 2.00
          }
        ]
      }
    }
    
    27 сен 19, 13:30    [21980834]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    chpasha
    Member

    Откуда:
    Сообщений: 8441
    capfreedom228
    как в рамках спринга это красиво реализовать

    что мешает заинжектить applicationcontext и инстанциировать нужное кол-во бинов-касс?
    27 сен 19, 13:54    [21980878]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    chpasha
    capfreedom228
    как в рамках спринга это красиво реализовать

    что мешает заинжектить applicationcontext и инстанциировать нужное кол-во бинов-касс?


    Думаю ничего не мешает, я только толкового примера не нашел как это делать.
    27 сен 19, 15:44    [21981042]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    PetroNotC Sharp
    capfreedom228,
    Стоп. Спинг MVC это ГУИ.
    Образец - Цветочный магазин.
    И не мешай сюда свои кассы убогие.


    Если ГУИ в твоем мире выглядит как json, то да ГУИ.
    27 сен 19, 15:49    [21981052]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    PetroNotC Sharp
    Member

    Откуда:
    Сообщений: 2089
    capfreedom228
    PetroNotC Sharp,
    Post из фронта прилетает из браузера.

    capfreedom228
    Если ГУИ в твоем мире выглядит как json, то да ГУИ.

    У меня с памятью все отлично. А у вас?
    27 сен 19, 15:53    [21981060]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    chpasha
    Member

    Откуда:
    Сообщений: 8441
    capfreedom228
    Думаю ничего не мешает, я только толкового примера не нашел как это делать

    1) scope = prototype у бина
    2) инжектим ApplicationContext в то место, где бины создавать надо, context.getBean(DeviceWorker.class)
    дальше как по архитектуре удобнее - либо с помощью async, либо вручную с помощью Executors
    27 сен 19, 16:22    [21981111]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    capfreedom228
    Member

    Откуда:
    Сообщений: 25
    chpasha
    capfreedom228
    Думаю ничего не мешает, я только толкового примера не нашел как это делать

    1) scope = prototype у бина
    2) инжектим ApplicationContext в то место, где бины создавать надо, context.getBean(DeviceWorker.class)
    дальше как по архитектуре удобнее - либо с помощью async, либо вручную с помощью Executors


    Спасибо, попробую.
    27 сен 19, 17:51    [21981193]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    fixxer
    Member

    Откуда:
    Сообщений: 720
    chpasha
    capfreedom228
    Думаю ничего не мешает, я только толкового примера не нашел как это делать

    1) scope = prototype у бина
    2) инжектим ApplicationContext в то место, где бины создавать надо, context.getBean(DeviceWorker.class)
    дальше как по архитектуре удобнее - либо с помощью async, либо вручную с помощью Executors


    Это антипаттерн, дети, не делайте так. Для просветления смотреть Жеку Борисова [url=]Spring the Reaper[/url].
    27 сен 19, 19:55    [21981289]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    chpasha
    Member

    Откуда:
    Сообщений: 8441
    fixxer
    Это антипаттерн, дети

    с удовольствием посмотрю на более кошерный способ создать N экземпляров в рантайме. дядя.

    fixxer
    Для просветления смотреть

    какая минута?

    fixxer
    Жеку Борисова

    Жеке привет
    27 сен 19, 22:16    [21981382]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    fixxer
    Member

    Откуда:
    Сообщений: 720
    chpasha,

    [url=
    Ссылка на позицию в клипе: https://youtu.be/cou_qomYLNU?t=2440
    ][/url] сороковая минута
    27 сен 19, 23:01    [21981403]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    chpasha
    Member

    Откуда:
    Сообщений: 8441
    fixxer
    сороковая минута
    объяснение про контекст имело смысл во времена xml - говорить о том, что у нас в классе появилась явная зависимость от spring при наличии N аннотаций того же спринга в этом же классе, серьезно? Но метод с абстрактным классом действительно неплох. Я даже когда-то о нем помнил Картинка с другого сайта.
    28 сен 19, 00:13    [21981427]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    vas0
    Member

    Откуда: Таможенный союз (Россия, Казахстан)
    Сообщений: 1279
    chpasha
    fixxer
    сороковая минута
    объяснение про контекст имело смысл во времена xml - говорить о том, что у нас в классе появилась явная зависимость от spring при наличии N аннотаций того же спринга в этом же классе, серьезно? Но метод с абстрактным классом действительно неплох. Я даже когда-то о нем помнил Картинка с другого сайта.
    Вообще method-injection был с первой версии спринга (когда он еще назывался interface21). За 13 лет использования спринга в проектах, мне такой способ di ни разу не понадобился. Написания собственного скопа так же ни разу не понадобилось, вполне хватало (protoype, singleton) + 3 которые добавлены в SpringMVC.

    Вообщем просветления при просмотре не наступило. Вообще если бы в проекте было бы > 50 бинов с method-injection, то я бы как раз такой вариант посчитал за антипатерн. Конфигурационного кода много, а только от него близко к нулю.

    Ну и вариант с переопределением scope, тоже так себе. В Spring-е такое можно сделать кучей способов. Я бы наверно выбрал просто реализовав @Component ColorProvider и просто заинжектил бы его.
    28 сен 19, 14:47    [21981658]     Ответить | Цитировать Сообщить модератору
     Re: Совет по архитектуре Spring MVC  [new]
    chpasha
    Member

    Откуда:
    Сообщений: 8441
    Нашел кстати еще 2 вариации на тему lookup-метода, собственно @Lookup анотация (по сути тоже самое без явного конфига) и паттерн Provider (через ObjectFactoryCreatingFactoryBean или ProviderCreatingFactoryBean). Последний вариант мне нравится больше всего, т.к. в нем меньше всего магии.

    когда видишь вариант с Lookup год спустя
    @Component
    public class MyServices {
     
        @Lookup
        public MyObject createObject() {
            return null;
        }
    }
    

    то можно слегка прифигеть, что за чудеса тут творятся. с абстрактным методом чутка лучше, т.к. можно скакнуть к его имплементации и понять, что происходит. Но имхо лучший вариант, если мы инжектим фабрику объектов.

    К счастью случай действительно довольно редкий.
    28 сен 19, 15:49    [21981674]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3      [все]
    Все форумы / Java Ответить