Singleton в Сервере приложений Java.. Как плохо идеи это?

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

Вы устанавливаете свои наблюдаемые, называя их значением.

// Do this
this.language("en");

// Instead of
// this.language = "en"; // <- Knockout won't know something's changed!

Вы читаете их, называя их без значения

// Do this 
if (this.language() === "pt") { }

// Instead of 
// if (this.language == "pt") { }

Например:

const dicts = {
  "en": { greeting: "Hello" },
  "de": { greeting: "Hallo" },
  "nl": { greeting: "Hoi" },
  "fr": { greeting: "Bonjour" }
};

const App = function() {
  this.languages = Object.keys(dicts);
  this.language = ko.observable("en");

  this.vm = ko.pureComputed(() =>
    dicts[this.language()] || dicts["en"]
  );
};

ko.applyBindings(new App());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div>
  <label>
    Select your language:
    <select data-bind="options: languages, value: language"></select>
    </label>
</div>

<div data-bind="with: vm">
  <h1 data-bind="text: greeting"></h1>
</div>
[116 ]

11
задан 14 revs 24 March 2009 в 18:38
поделиться

10 ответов

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

В таком сценарии у Вас есть несколько classloaders на нескольких JVMs, и Ваш sinlgeton шаблон повредится, поскольку у Вас будет несколько экземпляров того класса.

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

Я предлагаю проверить Ваше решение поставщика сервера приложений на эту проблему. Большинство, если не все поставщики, предоставляет некоторое решение для требований Вашего вида.

Специально для Glassfish, который Вы говорите, Вы используете, проверяете Singleton поддержка EJB Glassfish. Это могло бы быть столь же просто как добавление единственной аннотации.

15
ответ дан 3 December 2019 в 04:14
поделиться

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

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

2
ответ дан 3 December 2019 в 04:14
поделиться

Я сказал бы, что создание одиночного элемента является на самом деле единственной жизнеспособной идеей. Предполагая, что код в этом "черном квадрате", как известно, использует статические поля, абсолютно небезопасно создать два экземпляра этого фасада. Результаты непредсказуемы иначе.

3
ответ дан 3 December 2019 в 04:14
поделиться

Это должно работать, но существуют некоторые проблемы, с которыми Вам, вероятно, придется иметь дело.

Поточная обработка, как Вы упомянули. MDB выполняется в контейнере EJB, где Вы не можете создать свои собственные потоки, таким образом, у Вас есть потенциальная проблема там. Если у Вас есть доступ к фактическому коду (который он кажется, что Вы делаете), можно хотеть сделать некоторый рефакторинг, чтобы или устранить потоки или использовать "утвержденный" метод поточной обработки. CommonJ TimerManager будет, вероятно, работать в Вашем изложившем свои доводы, так как он выполняет некоторую задачу через определенный интервал. Существуют реализации, доступные для большинства серверов приложений (БЫЛ, и Weblogic включали его).

Classloading - Это зависит от Вас конфигурация. Если одиночный элемент будет создаваться и управляться от MDB в том же EAR, то Вы будете в порядке. Отделитесь EAR будет означать другой classloaders, и несколько инстанцируют Вас Singleton. Не может прокомментировать, было ли это проблемой в Вашем случае или не без большей информации.

2
ответ дан 3 December 2019 в 04:14
поделиться

Я упускаю суть? Вы упомянули, что 'код черного квадрата' содержит состояние. MDBs может быть ограничен 1 экземпляром на место назначения, но без надлежащей конфигурации Вы закончите с несколькими MDBs. Все они работающие с Вашим единственным экземпляром 'кода черного квадрата'. Для меня кажется, что это не хорошая идея, потому что один боб переопределит 'код черного квадрата', указывают, что другой боб создал несколько галочек прежде.

2
ответ дан 3 December 2019 в 04:14
поделиться

Мне кажется, что артефакт, что лучшими соответствиями к Вашему требованию является JBoss MBean. (Если Вы думаете на JBoss как кандидат AS).

Стандартный пример MBean

MBeans может также быть развернут как Одиночные элементы, в случае кластеризации JBoss.

Кластеризация с JBoss

Я надеюсь, что это полезно для Вас.

Rafa.

1
ответ дан 3 December 2019 в 04:14
поделиться

Исправьте код для избавлений от помех как можно скорее. Одиночные элементы не являются шагом в правильном направлении - они просто добавляют дополнительное неверное направление.

0
ответ дан 3 December 2019 в 04:14
поделиться

Не используйте Одиночные элементы, где состояние может измениться.

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

0
ответ дан 3 December 2019 в 04:14
поделиться

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

Ищите документы "объект области действия приложения" или "объект времени жизни приложения".

0
ответ дан 3 December 2019 в 04:14
поделиться

Почему бы не создать отдых взаимодействуют через интерфейс для пустой штуки поля и позволяют клиентам выполнить http вызовы?

0
ответ дан 3 December 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: