groovy原型监听ServletContext的属性变化
目前groovy原型是通过命令行执行TestScript的,见groovy原型增加收到jms消息后发送确认消息的示例。如果在Servlet容器中启动和关闭,部署将会很方便。经过研究,这里给出一个方案,可以既能通过容器启动关闭,也能命令行执行的办法。
命令行执行的方式已经实现,脚本结构不打算变化了。
如果servlet容器可以启动和关闭这个脚本就好了,这个容易办到,下一篇日志会演示如何实现。
这里需要解释的是servlet容器根据什么启动和关闭这个脚本,打算根据application作用域变量。比如设置变量a,值为true或者false,使用SerlvetContextAttributeListener监听这个变量的加入、修改和删除,这样就可以很容易的在web容器中控制对脚本操作的触发。
代码见:
package com.easymorse;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;import org.apache.log4j.Logger;
public class StartConsumerServlet extends HttpServlet implements
ServletContextAttributeListener {
/**
* Logger for this class
*/
private static final Logger logger = Logger
.getLogger(StartConsumerServlet.class);/**
*
*/
private static final long serialVersionUID = 1L;public static final String APPLICATON_ATTRIBUTE_NAME = "groovy.proto.start.consumer";
@Override
public void init() throws ServletException {
super.init();
this.getServletContext().setAttribute(APPLICATON_ATTRIBUTE_NAME, true);
}@Override
public void attributeAdded(ServletContextAttributeEvent event) {
if (event.getName().equals(APPLICATON_ATTRIBUTE_NAME)) {
if ((Boolean) event.getValue()) {
logger.error(">>>>start consumer.");
}
}
}@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
if (event.getName().equals(APPLICATON_ATTRIBUTE_NAME)) {
logger.error(">>>stop consumer.");
}
}@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
if (event.getName().equals(APPLICATON_ATTRIBUTE_NAME)) {
if (event.getServletContext().getAttribute(
APPLICATON_ATTRIBUTE_NAME).equals(true)) {
logger.error(">>>start consumer.");
}else{
logger.error(">>>stop consumer.");
}
}
}
}
需要在web.xml文件中部署,注意这里设置了启动容器就启动脚本(consumer),上面这个类既是Servlet也是监听器。
<listener>
<listener-class>com.easymorse.StartConsumerServlet</listener-class>
</listener>…
<servlet>
<servlet-name>StartConsumer</servlet-name>
<servlet-class>com.easymorse.StartConsumerServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
可通过test_listener.gsp文件测试:
application.setAttribute(‘groovy.proto.start.consumer’,false)
println ‘ok.’
将值改为true或者false,访问该页面。
09-11-19 21:19:55 ERROR (com.easymorse.StartConsumerServlet:37) – >>>>start consumer.
2009-11-19 21:19:55.355::INFO: Started SelectChannelConnector@0.0.0.0:9999
[INFO] Started Jetty Server
2009-11-19 21:20:09.281:/groovy.proto:INFO: Groovy servlet initialized on groovy.util.GroovyScriptEngine@1edd9b3.
09-11-19 21:20:12 ERROR (com.easymorse.StartConsumerServlet:56) – >>>stop consumer.
日志的样子,启动后start,然后执行test_listener.gsp关闭consumer。
源代码见:
这篇文章上的评论的 RSS feed TrackBack URI