简化groovy原型的jms消费者部分

groovy原型监听ServletContext的属性变化中,jms消费者部分,被复杂化了。另外,groovy原型增加收到jms消息后发送确认消息的示例中的关闭消费者进程的方式也复杂了。现在做了一个改善这个的原型。

基本思路就是消费者还是单起进程处理,并且可以通过操作系统普通的方式杀掉这个进程。和web应用部分没有直接的耦合关系。

由于这两个应用程序,分别扮演着生产者和消费者的角色,即独立又有关联,比如类库依赖基本一样。因此考虑使用maven的多模块方式,即在一个maven项目中包含多个子项目,父项目包含子项目都需要的类库依赖关系和其他共享信息。

在本示例中,有一个父项目,两个子项目,分别是front-end,用于web应用,back-end,用于消费者部分。

有关多模块maven项目的创建和配置,可参见创建支持eclipse的多模块maven项目

本文示例源代码见:

http://easymorse.googlecode.com/svn/tags/sms-service_1.0/

下载这个代码:

svn co http://easymorse.googlecode.com/svn/tags/sms-service_1.0/

然后进入项目目录:

cd sms-service_1.0

生成eclipse项目:

mvn eclipse:eclipse

注意,两个子项目都会级联生成eclipse项目文件。然后,可以通过eclipse的导入已存在项目的功能一次导入进来。

导入的两个项目会共享相同的类库依赖,很方便。但是,要想运行back-end中的脚本,需要在sms-service_1.0目录下执行:

mvn dependency:copy-dependencies

然后,将target/dependency目录设置到groovy的类库加载配置文件中,和groovy原型增加接收消息示例中的配置类似。

执行脚本需要进入back-end/bin目录下再执行,因为脚本中使用了相对路径。执行前需要给脚本文件增加可执行权限:

chmod +x ./ConsumerService.groovy

然后,可以直接Ctrl+c关闭该脚本。可以看到会执行释放资源的代码并有日志提示。

marshal@ubuntu-desktop:~/workspace/sms-service/back-end/bin$ ./ConsumerService.groovy
09-11-20 23:20:22 DEBUG (JMSConsumer:?) – start consumer…
09-11-20 23:20:23 DEBUG (JMSConsumer:?) – start ok.
^C09-11-20 23:21:29 DEBUG (ShutdownThread:?) – shutdown consumer…
09-11-20 23:21:29 DEBUG (ShutdownThread:?) – shutdown succesful.

 

这是因为脚本中使用了钩子线程,当进程关闭的时候会被执行。

Runtime.runtime.addShutdownHook(new ShutdownThread(consumer))

class ShutdownThread extends Thread{
    private static final Logger logger=Logger.getLogger(ShutdownThread.class)
    def consumer
    ShutdownThread(consumer){
        this.consumer=consumer
    }
    public void run(){
        logger.debug("shutdown consumer…")
        this.consumer.connection.close()
        logger.debug("shutdown succesful.")
    }
}

 

如果想后台执行代码,可以这样:

nohup ./ConsumerService.groovy &

关闭这个脚本进程,需要先找到进程号:

ps -ef|grep groovy

然后,这样杀掉进程:

kill -15 your_pid

这样,进程会调用shutdown线程正常释放和关闭进程。这里不能使用-9参数杀进程,这会立即杀掉进程,不能执行shutdown线程释放资源。

PDF格式創作    发送文章为PDF   

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

Leave a Reply