0

假设我有一个部署到 TomEE (Plume 7.0.2) 的 Web 应用程序。对于这个应用程序,我想创建一个负责通过 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 获取 aConnectionFactory和 a会更干净(如果可能的话)Queue吗?还有其他可能更好的解决方案吗?

4

1 回答 1

0

为什么没有一个带有注入和 send(xxx) 方法的 JMSService 类,并在您需要的地方注入这个类(servlet、jaxrs 服务、MDB、其他......)?

CDI 将使 IMO 比依赖 servlet 更干净

于 2017-02-07T09:00:13.017 回答