Скажем, у меня есть веб-приложение, которое я развертываю в TomEE (Plume 7.0.2). Для этого приложения я хочу создать центральный класс, ответственный за отправку сообщений через JMS. Моя первая мысль была создать сервлет без отображения, который получает необходимые поля впрыскиваются:Как создать центральный класс, отправляющий сообщения через JMS в веб-приложении в TomEE?
public class JMSSendingServlet extends HttpServlet {
@Resource(mappedName = "jms/logging")
private Queue loggingQueue;
@Resource
private ConnectionFactory connectionFactory;
public void sendMessage(String text) throws JMSException {
Connection connection = connectionFactory.createConnection();
//and so on...
producer.send(message);
}
}
Однако для того, чтобы получить доступ к этому методу из остальной части приложения я бы нужен либо сделать метод и поле статическим или каким-то образом получить экземпляр этого сервлета. Поскольку я не могу (или не должен) выполнять инъекцию зависимостей в статических полях, я пытаюсь найти решение для второго варианта. Вот моя попытка:
public class JMSSendingServlet extends HttpServlet {
private static JMSSendingServlet instance;
//...
@Override
public void init(ServletConfig config) throws ServletException {
instance = this;
super.init(config);
}
public static JMSSendingServlet getInstance() {
return instance;
}
}
//usage:
public class SomeClass {
public void someMethod() {
JMSSendingServlet.getInstance().sendMessage("Hello");
}
}
Поскольку у меня нет каких-либо отображения для этого сервлета и загружается его через <load-on-startup/>
должен существовать только один экземпляр. Но я все еще чувствую себя некомфортно с этим решением. Мне кажется грязным, по крайней мере потому, что getInstance
может вернуть null.
Было бы проще (если возможно) отказаться от инъекции зависимостей и использовать JNDI для получения ConnectionFactory
и Queue
? Могут ли быть другие решения?
Какую версию TomEE вы используете? –
@SteveC Последний стабильный Plume 7.0.2 –