groovy原型增加接收消息示例
前文groovy开发原型增加jms发送消息示例已经增加了发送消息的示例。一般jms应用,采取的是同步的发送,异步的接收。这里考虑通过单独的进程实现异步接收jms消息功能。
使用groovy脚本,类似sh脚本,在操作系统下可直接启动运行,实现这些,需要:
- 在操作系统中安装groovy,比如在ubuntu下手工安装groovy
- 编写脚本文件,参考ubuntu建立简单的groovy环境的编写groovy脚本部分
异步接收进程会在后台启动,一直监听队列的消息,收到消息后做后续处理。那么如何关闭该进程呢?这里采用一个简单的办法,创建一个shutdown主题(topic),该进程订阅这个主题,如果从主题收到消息,就立即关闭进程。
主要源代码见:TestScript.groovy
#!/usr/bin/env groovy
import groovy.sql.Sql;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;class MyBiz implements MessageListener{
def classloader=new GroovyClassLoader()
def connectionFactory=classloader.parseClass(new File("JMSService.groovy")).newInstance().connectionFactory
def sql=classloader.parseClass(new File("DBService.groovy")).newInstance().sql
def connection
def session
def consumer
def destination
def shutdownDestination
def shutdownConsumer
def runConsume(){
println "启动监听器"
connection=connectionFactory.createConnection()
connection.start()
session=connection.createSession(true,javax.jms.Session.AUTO_ACKNOWLEDGE)destination=session.createQueue("myqueue")
consumer=session.createConsumer(destination)
consumer.setMessageListener(this)shutdownDestination=session.createTopic("shutdownTopic")
shutdownConsumer=session.createConsumer(shutdownDestination)
shutdownConsumer.setMessageListener(this)
}public void onMessage(Message message) {
if(message.destination.equals(destination)){
println """
收到消息:${message.text}
"""
session.commit()
}else if (message.destination.equals(shutdownDestination)){
print (‘shutdown …’)
session.commit()
connection.close()
println (‘ok.’)
}
}
}def biz=new MyBiz()
def time=new Date().timeprintln """
获取到sql连接对象:${biz.sql},数据库正常。
获取到消息服务器工厂对象:${biz.connectionFactory},消息服务器正常。
"""biz.runConsume()
println """
耗时:${new Date().time-time}
"""
使用这个代码,需要先设置为可执行权限:
chmod +x ./TestScript.groovy
然后,需要在该目录下执行,因为代码内部使用的是相对路径:
./TestScript.groovy
执行效果类似这样:
当向shutdown topic发送任意消息,该进程关闭。
这里还碰到一个问题,就是类加载问题。独立的进程,无法享受到Servlet容器提供的类加载支持。需要自行解决。groovy在这方面有一些方法,但都不是很方便。比如有自动加载的脚本,见:
http://groovy.codehaus.org/Auto+setup+and+download+dependencies+jars
在这个原型中,本身已经使用了maven,所以打算直接利用maven的自动类库依赖加载机制,执行命令:
mvn dependency:copy-dependencies
在项目的target/dependency目录下,将生成所有依赖类库的拷贝。然后,根据groovy脚本的类加载,将该目录设置到groovy类加载配置文件中即可。
源代码见:
这篇文章上的评论的 RSS feed TrackBack URI