使用Jersey和ActiveMQ的Java RESTful服务 - 在启动时加载与ActiveMQ的连接

时间:2014-12-27 19:11:41

标签: java web-services rest tomcat

我有一个使用Jersey和Tomcat的REST Web服务。如果客户端调用REST Web服务,它将向ActiveMQ队列服务器发送消息。为此,REST服务器必须创建连接,会话等,以便向ActiveMQ服务发送消息。此时,来自客户端的每个调用都将创建此连接和会话等。看看这个例子

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response getProducts() {
        ...
        session.start();
        connection.start();
        ...
        sendMessageToQueue();
        ...
        session.close();
        connection.close()

}

我想要的是创建一个表示已经启动连接,会话等的Messagehandler的类。使用messageHandler.sendMessage(),应该可以立即从REST getProducts方法发送消息。

我的问题是:如何实例化Tomcat服务器启动时始终运行的Handler? 我发现通过实现ServletContextListener和Listeners,可以在Tomcat运行之前加载一个类,但是如何在我的REST-Servlet-Classes中访问它?

谢谢

1 个答案:

答案 0 :(得分:0)

我发现了如何解决我的问题。 它可以通过使用我所谈到的ServletContexListener的想法来完成。只需实现ServletContexListener并将其添加到web.xml

即可
 <listener>
  <listener-class>path.class</listener-class>
 </listener>

在contextInitialized方法中,可以设置并启动连接

@Override
public void contextInitialized(ServletContextEvent sce) {

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl);

try {
    connection = connectionFactory.createConnection();
    connection.start();
    session = connection.createSession(transacted, ackMode);
    Destination destination = session.createQueue("queue");
    producer = session.createProducer(destination);

    ServletContext sc = sce.getServletContext();
    sc.setAttribute("ActiveMQSession", session);
    sc.setAttribute("ActiveMQProducer", producer);

} catch (JMSException e) {


}

}

    ServletContext sc = sce.getServletContext();
    sc.setAttribute("ActiveMQSession", session);
    sc.setAttribute("ActiveMQProducer", producer);

您可以全局设置属性,因此您可以通过任何其他servlet访问它。在我的球衣案例中:

public class GetQuote {

    @Context ServletContext context;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response getProducts() throws JMSException {

    MessageProducer producer = (MessageProducer) context
                .getAttribute("ActiveMQProducer");

    Session session = (Session) context.getAttribute(
            "ActiveMQSession");     

    }

泽西式架构仅用于在不扩展HttpServlet或其他东西的情况下使用POJO。如果使用httpservlets,则可以通过getContext()函数获取上下文而不是@Context注释

希望能帮到别人。