我有一个使用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中访问它?
谢谢
答案 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注释
希望能帮到别人。