2014-12-27 21 views
0

我有一个使用Jersey和Tomcat的REST webservice。如果客户端调用REST Web服务,它将向ActiveMQ队列服务器发送消息。为此,REST服务器必须创建一个连接,一个会话等来向ActiveMQ服务发送消息。此时,来自客户端的每个呼叫都将创建此连接和会话等。看下面这个例子使用Jersey和ActiveMQ的Java RESTful服务 - 在启动时加载到ActiveMQ的连接

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

} 

我要的是创造,它表示已经开始连接,会话等MessageHandler的一类。使用messageHandler.sendMessage(),应该可以立即从REST getProducts方法发送消息。

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

谢谢

回答

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");  

    } 

的球衣架构仅仅是使用POJO的不扩展的HttpServlet或别的东西。如果你使用httpservlets,你可能会通过getContext()函数获取上下文而不是@Context注释

希望能帮助别人。