Синглтон сервлет? - PullRequest
       9

Синглтон сервлет?

1 голос
/ 22 февраля 2009

Если я объявлю синглтон-сервлет вроде

открытый статический класс SomeServlet расширяет HttpServlet {.....

Выдает ошибку, указывающую, что статический модификатор здесь не разрешен в NetBeans.

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

Заранее спасибо, Mahes

Ответы [ 5 ]

6 голосов
/ 22 февраля 2009
  • static не имеет отношения к выполнению только одним потоком в любой момент времени.
  • вы можете иметь статические классы в качестве внутренних классов, но это не поможет вашей проблеме из-за первого пункта
  • Если я правильно помню, существует только один экземпляр сервлета, поэтому нет необходимости создавать синглтоны. Обновление: я не запомнил правильно , как указал DefLog
  • для этого синхронизация в методе (doGet, doPost, service или вашем методе реализации) update: не справится с задачей

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

Обновление: см. Комментарии к этому ответу, почему вы действительно не хотите попадать в синхронизированный . Вы можете (например) хотеть, чтобы несколько сервлетов обращались к одной и той же функции по одному . Кроме того, вы можете столкнуться с серьезными проблемами масштабирования, если синхронизируете на уровне сервлета. Это определенно неподходящее место для решения проблем параллелизма.

3 голосов
/ 22 февраля 2009

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

1 голос
/ 22 февраля 2009

Реализация SingleThreadModel. Но обратите внимание: это устарело, оно может ничего не делать / не иметь смысла, это глупая вещь (очень похожая на одиночные игры).

0 голосов
/ 22 февраля 2009

Я склонен думать, что синглтоны используются слишком часто и часто указывают на недостатки базовой архитектуры решения. Предполагая, что вы сделали достаточно анализа, чтобы доказать, что вам нужен Singleton, вы можете использовать более старый шаблон Singleton, который не зависит от статической инициализации. Вот пример:

public SomeServlet extends HttpServlet {

    private instance = null;

    private SomeServlet() {
        // Construction code here
    }

    public synchronized SomeServlet getInstance() {
        if(instance == null) {
            instance = SomeServlet();
        }
        return instance;
    }

    // Servlet methods here

}

Я вижу две потенциальные проблемы:

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

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

0 голосов
/ 22 февраля 2009

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

С сервлетами обычно будет один, но возможно больше экземпляров того сервлета, который обрабатывает запросы одновременно. Так что, возможно, вы на самом деле не хотите снижать параллелизм на этом уровне, или вы бы использовали фильтры сервлетов или инфраструктуру, такую ​​как Spring Security, которая может ограничивать количество одновременных сеансов.

...