实现groovy通过队列消息转换视频

上文实现转换视频的最简单groovy程序实现了简单的转换视频功能,只能根据参数做一次转换。需要实现的需求是,跑在后台,根据要求转换视频。

可以自己实现这样的生产者消费者模式,实现一个队列机制,然后启动线程阻塞在空队列上,有生产者放到队列里一条消息,比如转换test.mov为test.mp4,然后线程得到通知消费这个消息,并从队列中删除消息。

这个思路是好的,但是不需要自己写这些代码,可以借助第三方API,使用JMS,这里用到的是JMS的开源免费实现ActiveMQ。具体安装参见tomcat下部署activemq

好处是省去了自己写底层代码和相关的测试维护工作。而且,activemq自带web管理界面,我们可以先实现消费者(也就是转换视频功能),而通过web管理界面手工生成消息。

生成一条消息,消息正文很简单:

test.mov;test.mp4

分号隔开,前者是需要转换的视频文件路径,后者是转换的文件路径。

在activemq的web console中填写并发送这条消息。

image

然后,启动VideoConvertor.groovy,可以看到这样的日志:

marshal@ubuntu-desktop:~/workspace/vp/vp-backend/bin$ ./VideoConvertor.groovy
09-11-25 11:37:29  INFO (Convertor:?) – 启动视频转换器…
09-11-25 11:37:29  INFO (Convertor:?) – 视频转换器启动完毕。
09-11-25 11:37:52 DEBUG (Convertor:?) – 收到消息,正文是:test.mov;test.mp4
09-11-25 11:38:18 DEBUG (Convertor:?) – 生成test.mp4成功,耗时25905毫秒。
09-11-25 11:38:18 DEBUG (Convertor:?) – 提交会话。

 

如果再发送一条jms消息,会有类似的日志,VideoConvertor也不再是执行一次,而是一直监控jms队列,接收消息,转换视频。如果需要将VideoConvertor程序设置为后台应用,可以参照简化groovy原型的jms消费者部分中的做法。

VideoConvertor.groovy源代码:

#!/usr/bin/env groovy

import groovy.lang.Grab;
import org.apache.log4j.*
import javax.jms.*
import org.apache.activemq.ActiveMQConnectionFactory

@Grab(group="log4j",module="log4j",version="1.2.12")
@Grab(group="org.apache.activemq",module="activemq-core",version="5.3.0")
class Convertor implements MessageListener{
    private static Logger logger=Logger.getLogger(Convertor.class)
    static{
        PropertyConfigurator.configure("log4j.properties");               
    }
    def connection
    def session
    def start(){
        logger.info("启动视频转换器…")
        def connectionFactory=new ActiveMQConnectionFactory("tcp://localhost:61616")
        connection=connectionFactory.createConnection()
        connection.start()
        session=connection.createSession(true,Session.AUTO_ACKNOWLEDGE)
        def destination=session.createQueue("video_convert")
        def consumer=session.createConsumer(destination)
        consumer.setMessageListener(this)
        logger.info("视频转换器启动完毕。")
    }

    public void onMessage(Message message){
        logger.debug("收到消息,正文是:${message.text}")
        def parameters=message.text.split(";")
        convert(parameters[0],parameters[1])
        session.commit()
        logger.debug("提交会话。")
    }
    def convert(input,output){
        def time=new Date().time
        def file=new File(output)
        if(file.exists()){
            file.delete()
            logger.debug("删除已经存在的输出文件 ${output}。")
        }
        def process="ffmpeg -i ${input} ${output}".execute()
        process.waitFor()
        logger.debug("生成${output}成功,耗时${new Date().time-time}毫秒。")
    }
}

new Convertor().start()

 

可以在这里下载源代码:

http://easymorse.googlecode.com/svn/tags/vp_m0_2/

創建PDF格式    发送文章为PDF   

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

Leave a Reply