Я пишу небольшой встроенный веб-сервер Jetty, но у меня есть общий объект, который имеет дорогую конструкцию, и я не хочу, чтобы каждый отдельный запрос к сервлету перестраивал этот объект. К сожалению, способ добавления ресурса в Jetty - через конструктор ResourceConfig
, но это не позволяет мне делать ничего, кроме добавления имени класса:
// instantiate this expensive object
MyExpensiveSharedObjectClass myExpensiveSharedObject = new MyExpensiveSharedObjectClass();
String result = myExpensiveSharedObject.search("alpha");
// set up the service
final ResourceConfig resourceConfig = new ResourceConfig(MyService.class);
Тогда MyService.java
содержит ваши стандартные объявления, такие как:
@GET
@Path("/doSomething")
@Produces(MediaType.APPLICATION_JSON)
public String doSomething() {
// do stuff with myExpensiveSharedObject....except how do I get to it??
// String result = myExpensiveSharedObject.search("alpha");
В идеале я хочу, чтобы каждый раз, когда запрос поступал в /doSomething
, я мог выполнять методы для объекта myExpensiveSharedObject
, который я создал ранее.
Я полагаю, это довольно просто, но я не могу найти простой способ сделать это.
В качестве альтернативы - есть ли способ иметь некоторую форму пространства общей памяти в сервлете Jetty? Я заметил, что каждый отдельный запрос, по-видимому, создает новый экземпляр сервлета, поэтому я не могу, например, создать карту разделяемой памяти внутри объекта, которая может быть повторно использована всеми экземплярами класса. Я уверен, что это возможно, но я не могу понять, как это сделать.
По сути, я просто пытаюсь найти способ создать объект, который дорого построить, что было бы идеальным в методе конструктора или передано в сам сервлет, но в контексте этих сервлетов конструкторы вызывал каждый запрос, поэтому я не могу идти по этому пути.