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。

源代码见:

http://easymorse.googlecode.com/svn/tags/groovy.proto.1.5

PDF下載    发送文章为PDF   

这篇文章上的评论的 RSS feed TrackBack URI

Leave a Reply