Синглтон и синхронизированный сервлет - PullRequest
0 голосов
/ 30 ноября 2011

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

Есть предложения?

Ответы [ 2 ]

5 голосов
/ 30 ноября 2011

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

Вместо этого вы могли бы написать класс, который обрабатывает доступ к порту, инкапсулируя управление, предоставляя доступ только одному потоку за раз. Затем вам нужно будет решить, как должны вести себя параллельные запросы к сервлету (заблокировать, вернуть какое-то сообщение об ошибке «используется последовательный порт» и т. Д.).

1 голос
/ 30 ноября 2011

Предложение: не делай этого.Оставьте управление сервлетом в контейнере и используйте свой собственный синглтон для обработки последовательного порта.

Решение: вы не можете, так как не можете контролировать конструктор.Однако, что вы можете сделать (и что очень плохо - никому не говорите, что я это сказал), это иметь статическое поле в сервлете, сохраняя ссылку на первый экземпляр.Таким образом, все экземпляры сервлета смогут делегировать обработку этому самому первому экземпляру.

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

...