最近有个需求,就是在用户上传文件后,对文件的格式进行转换。如用户上传一个mpg格式的视频文件,需要将其转换为flv格式的视频文件。我最初的想法是,当用户上传视频文件后,如果该视频文件不是flv格式的,另起一个线程,对该视频文件进行格式转换。具体实现如下:    public void upLoadFile() {  
      //upload the file here ...  
    ...  
      // 文件上传成功后,得到文件的后缀名suffix  
      if(!suffix.toLowerCase().equals(".flv")) {  
          // 另起线程进行格式转换  
          new Thread(new Runnable() {  
               public void run() {  
                       FormatConvert fc = new FormatConvert("文件路径");  
                       fc.runConvert();  
                           
               }  
          }).start();  
      }  
      
      //  将上传的文件信息插入数据库中,并返回信息到前端  
    ...  其中FormatConvert类是自定义的格式转换类,使用Jave包将不是flv格式的视频文件转换为flv格式的视频文件。该程序不能正常运行,单步调试的时候,会在DefaultActionInvocation.class中说source not found,然而如果
不在run方法里new FormatConvert类,只是简单的打印一些信息的话,程序是可以运行的。另外,我在eclipse上使用java application测试运行上述代码是可以成功的,能够实现将mpg格式的视频转为flv
格式。所以我觉得可能是struts的使用问题,不知道在struts2中启动新的线程是不是会有限制?初次使用struts2,不是特别懂,希望大虾们给指导指导,谢谢了! 

解决方案 »

  1.   

    Struts2中无需在Action中启动新线程,Tomcat会为每一个连接请求发起一个Action线程进行回应。
    换句话说,你的Action本来就是个独立线程。如果是担心转换视频耗时影响到对客户端的响应速度,可以编写一个独立的文件转换池类。Action把接收到的文件丢给转换池就返回。转换池类接收所有Action丢来的文件并专责转换。
      

  2.   

    谢谢~对于这个问题,如果将格式转换的代码不放在action里,就没有什么问题。因为项目是使用ssh的框架,文件上传成功后会调用service层得方法将新上传的记录插入数据库中,所以我选择将格式转换的代码也service层里,当系统在将新的记录插入数据库时开启一个新的线程进行视频格式转换,这样就能正常运行了。