【问题标题】:Java RESTful Service with Jersey and ActiveMQ - loading Connection to ActiveMQ on Startup带有 Jersey 和 ActiveMQ 的 Java RESTful 服务 - 在启动时加载到 ActiveMQ 的连接
【发布时间】:2015-02-24 13:30:16
【问题描述】:

我有一个带有 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 服务器启动时始终运行的处理程序? 我发现通过实现 ServletContextListener 和 Listeners,可以在 Tomcat 运行之前加载一个类,但是如何在我的 REST-Servlet-Classes 中访问它?

谢谢

【问题讨论】:

    标签: java web-services rest tomcat


    【解决方案1】:

    我找到了解决问题的方法。 这可以通过使用我谈到的 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");     
    
        }
    

    jersey 架构仅用于使用 POJO,而不扩展 HttpServlet 或其他东西。如果你使用 httpservlets,你可以通过 getContext() 函数而不是 @Context 注解来获取上下文

    希望对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2015-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2018-08-08
      相关资源
      最近更新 更多