Повторное использование объектов в последующих запросах к динамическому бэкэнду Google App Engine - PullRequest
0 голосов
/ 07 января 2012

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

Это то, что я сделал: 1 / создаю файл 'backends.xml', определяющий динамический общедоступный бэкэнд с именем 'xslt' 2 / prepend 'xslt' к домену при вызове сервлета:

http://xslt.[appname].appspot.com/getCoordinates?[params]

Это работает!

Типичное поведение приложения заключается в том, что будет выполнен ряд вызовов этого сервлета 'getCoordinates'.Каждый запрос вызывает метод doGet этого сервлета getCoordinates, который выполняет инициализацию саксонского процессора, xsltCompiler, xsltExecutable и xsltTransformer, но все эти объекты могут быть повторно использованы в последующих запросах!

Мой вопрос: как мне запрограммировать разделить этот код инициализации в обработчик для запроса инициализации бэкэнда в '_ah / start'?

Если я просто создаю другой сервлет'startXslt', который отвечает на запрос '_ah / start' и инициализирует все универсальные объекты в методе doGet этого сервлета, как я смогу использовать объекты из метода doGet сервлета getCoordinates?

(Я не очень опытен в программировании Java-сервлетов, поэтому я считаю, что это может быть больше похоже на общий вопрос о программировании Java-сервлетов, а не на GAE, или это так?)

Ответы [ 2 ]

0 голосов
/ 10 января 2012

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

Таким образом, все сервлеты будут выполняться в одном и том же экземпляре JVM, и поэтому вы можете иметь общий объект, используя шаблон Singleton, как подсказывает splix для другого ответа.Я понимаю, ваш вопрос касается того, как вы могли бы подключиться к инициализации бэкэнда для инициализации ваших собственных объектов.Если это так, вы можете реализовать ServletContextListener и поместить свой код в метод contextInitialized(ServletContextEvent).

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

0 голосов
/ 07 января 2012

Да, это общие вопросы, и на самом деле есть сотни способов сделать это.Кстати, большинство проектов основаны на некоторой структуре, и это зависит от этого.Если вы начинаете с простых сырых сервлетов - я настоятельно рекомендую вам взглянуть на другие варианты.Для GAE есть Gaelyk .Или Spring MVC как наиболее популярная (не так ли?) Платформа общего использования.

Кстати, если вам нужно решение прямо сейчас, я могу порекомендовать одно из следующего:

  • init в методе init () (он будет вызываться при запуске приложения)
  • сохранить его в статическом поле класса , а init в static {}block (вызывается при инициализации класса, совместно используется экземплярами)
  • делает singleton для этих преобразователей (вы можете запустить его один раз при первом вызове)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...