假设我有一个部署到TomEE的Web应用程序(Plume 7.0.2)。对于这个应用程序,我想创建一个负责通过JMS发送消息的中心类。我的第一个想法是创建一个没有映射的servlet,它可以获取所需的字段:
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);
}
}
但是,为了从应用程序的其余部分访问此方法,我需要使方法和字段静态或以某种方式获取该servlet的实例。由于我无法(或者不应该)在静态字段上执行依赖注入,因此我试图找到第二个选项的解决方案。这是我的尝试:
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");
}
}
由于我没有为这个servlet设置任何映射,并且它通过<load-on-startup/>
加载,因此它应该只存在一个实例。但我仍然对这个解决方案感到有点不舒服。它看起来很脏,至少因为getInstance
可以返回null。
放弃依赖注入以及使用JNDI获取ConnectionFactory
和Queue
会更清晰(如果可能)吗?还有其他更好的解决方案吗?
答案 0 :(得分:0)
为什么不使用带有injections和send(xxx)方法的JMSService类并在需要的地方注入此类(servlet,jaxrs服务,MDB,其他......)?
CDI会使其比依赖servlet更清洁IMO