groovy原型增加接收消息示例

前文groovy开发原型增加jms发送消息示例已经增加了发送消息的示例。一般jms应用,采取的是同步的发送,异步的接收。这里考虑通过单独的进程实现异步接收jms消息功能。

使用groovy脚本,类似sh脚本,在操作系统下可直接启动运行,实现这些,需要:

异步接收进程会在后台启动,一直监听队列的消息,收到消息后做后续处理。那么如何关闭该进程呢?这里采用一个简单的办法,创建一个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().time

println """
获取到sql连接对象:${biz.sql},数据库正常。
获取到消息服务器工厂对象:${biz.connectionFactory},消息服务器正常。
"""

biz.runConsume()

println """
耗时:${new Date().time-time}       
"""

 

使用这个代码,需要先设置为可执行权限:

chmod +x ./TestScript.groovy

然后,需要在该目录下执行,因为代码内部使用的是相对路径:

./TestScript.groovy

执行效果类似这样:

image

当向shutdown topic发送任意消息,该进程关闭。

image

这里还碰到一个问题,就是类加载问题。独立的进程,无法享受到Servlet容器提供的类加载支持。需要自行解决。groovy在这方面有一些方法,但都不是很方便。比如有自动加载的脚本,见:

http://groovy.codehaus.org/Auto+setup+and+download+dependencies+jars

在这个原型中,本身已经使用了maven,所以打算直接利用maven的自动类库依赖加载机制,执行命令:

mvn dependency:copy-dependencies

在项目的target/dependency目录下,将生成所有依赖类库的拷贝。然后,根据groovy脚本的类加载,将该目录设置到groovy类加载配置文件中即可。

源代码见:

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

PDF    发送文章为PDF   

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

Leave a Reply