powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Совет по архитектуре Spring MVC
69 сообщений из 69, показаны все 3 страниц
Совет по архитектуре Spring MVC
    #39867501
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Пишу бэкенд сервера для работы с кассами.
Стек технологий Java/Spring Boot/MySql
В качестве БД взял MySQL (ибо фронт уже на нем).
По сути сервер должен принимать задания в виде json, а кассы эти задания должны выполнять.
Внутри кассы нет очереди и работают они только в одном потоке, грубо говоря так:
Код: java
1.
2.
3.
4.
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 при создании воркеров. Но такое ощущение, что это кривое решение и могут быть проблемы с транзакциями(хотя и работает).
Репозитории внутри воркера нужны для обновления статуса девайса, таска и записи результата выполнения таска.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867558
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Апи для заданий асинхронное, т.е. снаружи прилетает post запрос, создается запись в таблице tasks игде обоснование нужности асинхронности?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867564
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228,
Post кто делает? Человек?
Тогда вариант без асинхронности - делает задание и вкладка кассы1 висит 15 сек. Вполне допустимо.
Надо быстрее, жмакает новую вкладку касса2 и тоже ждет.
Вариант асинхронный - 2 веб приложения.
Приложение А просто пишет в бд задание.
Приложение Б это демон или сервис без ГУИ круглосуточно их выполняет.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867568
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Асинхронность нужна, т.к. задания могут выполняться неопределенно долго. И если будет 5 одновременных заданий то последний зависнет больше чем на минуту, а это неприемлимо.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867569
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Post из фронта прилетает из браузера.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867574
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228PetroNotC Sharp,

Асинхронность нужна, т.к. задания могут выполняться неопределенно долго. И если будет 5 одновременных заданий то последний зависнет больше чемн на минуту, а это неприемлимо.контейнер веб сервера при занятом сервлете запускает новый экземпляр.
Значит 5 вкладок выполнятся вместе за 15 сек.
Проверь
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867578
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228,

в мире Java нет аналогов Hangfire ?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867588
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мухcapfreedom228,

в мире Java нет аналогов Hangfire ?в мире шарпа нет контейнера?
https://ru.m.wikipedia.org/wiki/Контейнер_сервлетов
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867594
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Каким компонентом спринга должен быть DeviceWorker в данной ситуации, чтобы было удобно инжектить внутрь него репозитории и нормально работали транзакции
Я бы попробовал обыкновенный спринговый bean с одним публичным методом и аннотацией Async - почитай про нее. Если кол-во девайсов число постоянное на момент старта, то просто настроить taskexecutor с пулом нужного размера
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867614
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228PetroNotC Sharp,

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

касса в 1 поток работает
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867615
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpashacapfreedom228Каким компонентом спринга должен быть DeviceWorker в данной ситуации, чтобы было удобно инжектить внутрь него репозитории и нормально работали транзакции
Я бы попробовал обыкновенный спринговый bean с одним публичным методом и аннотацией Async - почитай про нее. Если кол-во девайсов число постоянное на момент старта, то просто настроить taskexecutor с пулом нужного размера

хотелось иметь возможность добавлять кассы без рестарта
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867618
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228,
Не понял.
Касса синглетон или можно сделать
Kassa a = new Kassa(settings);
Kassa б = new Kassa(settings);
?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867619
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228,
Не понял.
Касса синглетон или можно сделать
Kassa a = new Kassa(settings);
Kassa б = new Kassa(settings);
?

сделать можно, но когда ты вызовешь a.open(); то b.open(); - выдаст ошибку подключения.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867623
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228выдаст ошибку подключения.то есть нужна асинхронность, но касса категорически однопоточна?
Фиктивная нужна? Зачем?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867624
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы касса не простаивала))))))))?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867625
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
Выяснили что аннотация не подходит
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867626
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC SharpЧтобы касса не простаивала))))))))?

Такое тз
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867628
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228PetroNotC SharpЧтобы касса не простаивала))))))))?

Такое тзтогда один вариант
Второй в 21980326
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867630
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228выдаст ошибку подключения.то есть нужна асинхронность, но касса категорически однопоточна?
Фиктивная нужна? Зачем?

Чеки электронные и клиенту нет смысла ждать.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867631
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Чеки электронные и клиенту нет смысла ждать.все хуже. Касса синглетон.
Решение выше. Удачи.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867638
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashacapfreedom228Каким компонентом спринга должен быть DeviceWorker в данной ситуации, чтобы было удобно инжектить внутрь него репозитории и нормально работали транзакции
Я бы попробовал обыкновенный спринговый bean с одним публичным методом и аннотацией Async - почитай про нее. Если кол-во девайсов число постоянное на момент старта, то просто настроить taskexecutor с пулом нужного размера

Можно еще лоадбалансер настроить на пару тройку серверов, чтоб уж совсем все было хорошо.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867639
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228chpashaпропущено...

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

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

А параметром номер кассы никак нельзя передать?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867641
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergunkacapfreedom228пропущено...


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

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

В таске зафиксирован id кассы, т.е. каждый таск предназначен конкретной кассе.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867664
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Sergunkaпропущено...


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

В таске зафиксирован 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

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
	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) {
			}
		}
	}



Что там за таск такой? Код покажи?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867670
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Идея была следующая: храним кассы в таблице devices, задания в таблице tasks.
При старте сервера запускаем столько потоков, сколько девайсов в таблице devices.
Потоки с определенным периодом делают селект из таблицы с заданиями и поочередно их выполняют.
Апи для заданий асинхронное, т.е. снаружи прилетает post запрос, создается запись в таблице tasks и назад клиенту отдается id этого задания.
По id задания клиент может отследить прогресс и результат. (GET /task/{id})


ИМХО не делать брокер/очередь сообщений на БД, а воспользоваться соответствующим инструментом (MQ, Kafka и т.д.)
Результат отправлять так же по тому же брокеру сообщений.
Связь можно сделать, по CorellationID. Создается в сессии контролера и там же храниться, нужен чтобы получить соответствующий ответ.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867683
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergunka,
Он же говорит что райзе будет при одновременной работе двух экземпляров, а при async так и слуится.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867740
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgulcapfreedom228Идея была следующая: храним кассы в таблице devices, задания в таблице tasks.
При старте сервера запускаем столько потоков, сколько девайсов в таблице devices.
Потоки с определенным периодом делают селект из таблицы с заданиями и поочередно их выполняют.
Апи для заданий асинхронное, т.е. снаружи прилетает post запрос, создается запись в таблице tasks и назад клиенту отдается id этого задания.
По id задания клиент может отследить прогресс и результат. (GET /task/{id})


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

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

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

На счет свободной кассы:
В таске прописано на какой кассе оно должно быть выполнено, т.е. не свободную.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867765
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Шедулер выполняет действия с определенным периодом , ПО ВРЕМЕНИ карл!
Например, каждый вторник на 10 утра. Или запуск задачи через 10 минут после POST юзверя.
capfreedom228могу запустить на каждую кассу
Ты гоаорил что касса А Б не могут одновременно.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867768
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228На счет свободной кассы:
В таске прописано на какой кассе оно должно быть выполнено, т.е. не свободнуюэто ТЗ или твоя придумка?
Если ТЗ покажи цитату из первой страницы топика.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867771
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228На счет свободной кассы:
В таске прописано на какой кассе оно должно быть выполнено, т.е. не свободнуюэто ТЗ или твоя придумка?
Если ТЗ покажи цитату из первой страницы топика.

Это ТЗ, я забыл это написать в первом посте.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867772
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228Шедулер выполняет действия с определенным периодом , ПО ВРЕМЕНИ карл!
Например, каждый вторник на 10 утра. Или запуск задачи через 10 минут после POST юзверя.
capfreedom228могу запустить на каждую кассу
Ты гоаорил что касса А Б не могут одновременно.

Я говорил, что ты не можешь к одной и той же кассе подключиться одновременно разными потоками.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867776
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
capfreedom228PetroNotC Sharpпропущено...
ПО ВРЕМЕНИ карл!
Например, каждый вторник на 10 утра. Или запуск задачи через 10 минут после POST юзверя.
пропущено...

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

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

На счет ПО ВРЕМЕНИ - не вижу противоречия. Раз 5 секунд например будет делать селект из таблицы с заданиями и их выполнять.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867782
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Это ТЗ, я забыл это написать в первом посте.поэтому мы копаемся вторую страницу в детском вопросе

capfreedom228Я говорил, что ты не можешь к одной и той же кассе подключиться одновременно разными потоками.
Выше мой вопрос с ДВУМЯ ЭКЗЕМЛЯРАМИ var a =, var b= видим?
Ответь еще раз.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867783
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Не хотелось ради одной очереди тянуть какое то дополнительное ПО.

Тогда имплементация embedded MQ.
Есть еще Spring Integration... Но мне лично не очень понравилось, но вы можете посмотреть.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867784
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Раз 5 секунд например будет делать селект из таблицы с заданиями и их выполнять.да. Выше сказал, это приложение #2 демон в линукс.
Никакого отношения к приложению с post он не имеет.
Тогда согласен.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867785
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulcapfreedom228Не хотелось ради одной очереди тянуть какое то дополнительное ПО.

Тогда имплементация embedded MQ.
Есть еще Spring Integration... Но мне лично не очень понравилось, но вы можете посмотреть.это тоже дополнительное ПО
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867788
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228Это ТЗ, я забыл это написать в первом посте.поэтому мы копаемся вторую страницу в детском вопросе

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

Если делать так:
Код: java
1.
2.
3.
4.
Kassa a = new Kassa(settings1);
Kassa b = new Kassa(settings2);
a.open();
b.open();



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

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



т.е. оба экземпляра смотрят на одну кассу.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867792
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228
Код: java
1.
2.
Kassa a = new Kassa(settings);
Kassa b = new Kassa(settings);




т.е. оба экземпляра смотрят на одну кассу.ну ты даешь))))))
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867793
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228
Код: java
1.
2.
Kassa a = new Kassa(settings);
Kassa b = new Kassa(settings);




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

???
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867795
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228,
Если мне кто из java скажет что это было очевидно - посыплю голову пеплом))).
Mayton, это было очевидно?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867797
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228т.е. оба экземпляра смотрят на одну кассу.если Kassa синглтон
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867799
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В первом посте, я писал, что если сделать a.open(); то больше никто не может подключиться к этой кассе.
Извиняюсь, если расписал недостаточно подробно.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867804
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228В первом посте, я писал, что если сделать a.open(); то больше никто не может подключиться к этой кассе.
Извиняюсь, если расписал недостаточно подробно.проехали
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867806
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228
Код: java
1.
Kassa a = new Kassa(settings1);

получается, нас в контексте задачи не интересует параметер settings1 или 2...
Это твои проблемы.
ЗАЧЕМ ЗАДАНИЕ ПРИВЯЗЫВАТЬ К КАССЕ?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867807
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяcapfreedom228т.е. оба экземпляра смотрят на одну кассу.если Kassa синглтоннет). Если в переменной settings одна и та же КассаИменемПети)
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867810
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228
Код: java
1.
Kassa a = new Kassa(settings1);

получается, нас в контексте задачи не интересует параметер settings1 или 2...
Это твои проблемы.
ЗАЧЕМ ЗАДАНИЕ ПРИВЯЗЫВАТЬ К КАССЕ?

Я в курсе, что это мои проблемы. Клиент формирует задание для конкретной кассы, такова бизнес логика.
Заданием может быть например перезагрузка кассы, или обновление каких то настроек или печать чека, все это относится к конкретной кассе.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867812
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpнет). Если в переменной settings одна и та же КассаИменемПети)
ну да если
PetroNotC Sharpполучается, нас в контексте задачи не интересует параметер settings1 или 2...
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867823
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228,
Наконец то ты сформировал все ТЗ.
Решение в моем первом посте. Гадал на кофейной гуще.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867835
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228,
Наконец то ты сформировал все ТЗ.
Решение в моем первом посте. Гадал на кофейной гуще.

Спасибо, но это абстрактное решение.
В нем ни слова про Spring. Вопрос то был именно в том, чтобы выяснить, как в рамках спринга это красиво реализовать.
Или выяснить, что стандартные компоненты не подходят и надо либо искать другие, либо писать свои.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867838
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228В нем ни слова про Spring.а задача не для спринга))
Что поделать.
Тут противоречие. Либо просто и логично, либо спринг, будь он неладен))
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867839
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228,
Стоп. Спинг MVC это ГУИ.
Образец - Цветочный магазин.
И не мешай сюда свои кассы убогие.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867841
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergunkacapfreedom228пропущено...


В таске зафиксирован 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

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
	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) {
			}
		}
	}



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

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

Вот например задание на печать чека:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
{
  "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
      }
    ]
  }
}
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867862
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228как в рамках спринга это красиво реализовать
что мешает заинжектить applicationcontext и инстанциировать нужное кол-во бинов-касс?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867952
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpashacapfreedom228как в рамках спринга это красиво реализовать
что мешает заинжектить applicationcontext и инстанциировать нужное кол-во бинов-касс?

Думаю ничего не мешает, я только толкового примера не нашел как это делать.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867960
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharpcapfreedom228,
Стоп. Спинг MVC это ГУИ.
Образец - Цветочный магазин.
И не мешай сюда свои кассы убогие.

Если ГУИ в твоем мире выглядит как json, то да ГУИ.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39867965
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228PetroNotC Sharp,
Post из фронта прилетает из браузера.
capfreedom228Если ГУИ в твоем мире выглядит как json, то да ГУИ.
У меня с памятью все отлично. А у вас?
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39868003
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
capfreedom228Думаю ничего не мешает, я только толкового примера не нашел как это делать
1) scope = prototype у бина
2) инжектим ApplicationContext в то место, где бины создавать надо, context.getBean(DeviceWorker.class)
дальше как по архитектуре удобнее - либо с помощью async, либо вручную с помощью Executors
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39868067
capfreedom228
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpashacapfreedom228Думаю ничего не мешает, я только толкового примера не нашел как это делать
1) scope = prototype у бина
2) инжектим ApplicationContext в то место, где бины создавать надо, context.getBean(DeviceWorker.class)
дальше как по архитектуре удобнее - либо с помощью async, либо вручную с помощью Executors

Спасибо, попробую.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39868130
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashacapfreedom228Думаю ничего не мешает, я только толкового примера не нашел как это делать
1) scope = prototype у бина
2) инжектим ApplicationContext в то место, где бины создавать надо, context.getBean(DeviceWorker.class)
дальше как по архитектуре удобнее - либо с помощью async, либо вручную с помощью Executors

Это антипаттерн, дети, не делайте так. Для просветления смотреть Жеку Борисова
YouTube Video
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39868187
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerЭто антипаттерн, дети
с удовольствием посмотрю на более кошерный способ создать N экземпляров в рантайме. дядя.

fixxerДля просветления смотреть
какая минута?

fixxerЖеку Борисова
Жеке привет
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39868206
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

YouTube Video
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39868222
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerсороковая минутаобъяснение про контекст имело смысл во времена xml - говорить о том, что у нас в классе появилась явная зависимость от spring при наличии N аннотаций того же спринга в этом же классе, серьезно? Но метод с абстрактным классом действительно неплох. Я даже когда-то о нем помнил
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39868405
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashafixxerсороковая минутаобъяснение про контекст имело смысл во времена xml - говорить о том, что у нас в классе появилась явная зависимость от spring при наличии N аннотаций того же спринга в этом же классе, серьезно? Но метод с абстрактным классом действительно неплох. Я даже когда-то о нем помнил
Вообще method-injection был с первой версии спринга (когда он еще назывался interface21). За 13 лет использования спринга в проектах, мне такой способ di ни разу не понадобился. Написания собственного скопа так же ни разу не понадобилось, вполне хватало (protoype, singleton) + 3 которые добавлены в SpringMVC.

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

Ну и вариант с переопределением scope, тоже так себе. В Spring-е такое можно сделать кучей способов. Я бы наверно выбрал просто реализовав @Component ColorProvider и просто заинжектил бы его.
...
Рейтинг: 0 / 0
Совет по архитектуре Spring MVC
    #39868416
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел кстати еще 2 вариации на тему lookup-метода, собственно @Lookup анотация (по сути тоже самое без явного конфига) и паттерн Provider (через ObjectFactoryCreatingFactoryBean или ProviderCreatingFactoryBean). Последний вариант мне нравится больше всего, т.к. в нем меньше всего магии.

когда видишь вариант с Lookup год спустя
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@Component
public class MyServices {
 
    @Lookup
    public MyObject createObject() {
        return null;
    }
}


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

К счастью случай действительно довольно редкий.
...
Рейтинг: 0 / 0
69 сообщений из 69, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Совет по архитектуре Spring MVC
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]