简化groovy原型的jms消费者部分
在groovy原型监听ServletContext的属性变化中,jms消费者部分,被复杂化了。另外,groovy原型增加收到jms消息后发送确认消息的示例中的关闭消费者进程的方式也复杂了。现在做了一个改善这个的原型。
基本思路就是消费者还是单起进程处理,并且可以通过操作系统普通的方式杀掉这个进程。和web应用部分没有直接的耦合关系。
由于这两个应用程序,分别扮演着生产者和消费者的角色,即独立又有关联,比如类库依赖基本一样。因此考虑使用maven的多模块方式,即在一个maven项目中包含多个子项目,父项目包含子项目都需要的类库依赖关系和其他共享信息。
在本示例中,有一个父项目,两个子项目,分别是front-end,用于web应用,back-end,用于消费者部分。
有关多模块maven项目的创建和配置,可参见创建支持eclipse的多模块maven项目。
本文示例源代码见:
下载这个代码:
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线程释放资源。
这篇文章上的评论的 RSS feed TrackBack URI