如何在TomEE中的Web应用程序中创建通过JMS发送消息的中心类?

时间:2017-02-05 17:36:25

标签: java-ee jms jndi tomee tomee-7

假设我有一个部署到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获取ConnectionFactoryQueue会更清晰(如果可能)吗?还有其他更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

为什么不使用带有injections和send(xxx)方法的JMSService类并在需要的地方注入此类(servlet,jaxrs服务,MDB,其他......)?

CDI会使其比依赖servlet更清洁IMO