У меня есть приложение JAX-RS (работает Джерси 2 на Tomcat), которое полагается на супертяжелое соединение с HBase. Я хочу инициализировать и повторно использовать это соединение во всем приложении для нескольких ресурсов. Я установил Binder, который связывает соединение как Singleton, и использовал аннонт @Inject, чтобы вставить это соединение в мой ресурс. Однако, поскольку инъекция не происходит до первого вызова службы, соединение не инициализируется до тех пор.Как инициализировать введенное значение перед вызовом REST?
Применение:
public class MyApplication extends ResourceConfig {
public MyApplication() {
super(MyResource.class);
register(new HbaseBinder());
}
}
Связующее:
public class HbaseBinder extends AbstractBinder {
@Override
protected void configure() {
bindAsContract(HbaseConnection.class).in(Singleton.class);
bind(new HbaseConnection()).to(HbaseConnection.class);
}
}
инъекции:
@Path("/myResource")
public class MyResource {
@Inject
private HbaseConnection hbaseConnection;
...
}
HBase соединения:
@Singleton
public class HbaseConnection {
public Connection getConnection() throws IOException {
...
}
...
}
Что я хотел бы сделать, это инициализировать Singleton при времени развертывания приложения, чтобы он был готов перейти к первому вызову службы. Каков правильный способ сделать это?
Я бы предположил, что он инициализируется при его создании. Это потому, что все приложение Джерси не загружается до первого запроса, или просто соединение не загружается до первого запроса? –
Я знаю, что приложение загружается, потому что мне удалось добавить ServletContextListener, и он запускается во время развертывания. Но соединение HBase не получает экземпляр до времени впрыска, который не будет до первого вызова конечной точки myResource. –
Попытайтесь использовать [Immediate Scope] (http://stackoverflow.com/a/28123656/2587435) –