Struts2:如何监控SERVER SIDE Action流的进度?

时间:2015-06-27 01:39:18

标签: java struts2 stream

我有一个Struts 2 Action,Struts 2在SERVER SIDE,允许用户从我的应用程序下载文件。

文件存储在数据库中(我知道......但保持焦点)。 用户访问操作,我从数据库获取文件并使用Stream发送给用户。

@Action(value="getFile", results= {  
        @Result(name="ok", type="stream", params = {
                "contentType", "application/octet-stream",
                "inputName", "fileInputStream",
                "contentDisposition", "filename=\"${fileName}\"",
                "bufferSize", "1024"
        }) }
)  

...

public class GetFileAction {
    private String fileName;
    private Integer idFile;
    private ByteArrayInputStream fileInputStream;

    public String execute () {
            ...
            try {
                FileService fs = new FileService();
                if ( (idFile != null) && ( idFile > -1 ) ) {
                    file = fs.getFile( idFile );
                }

                if ( file != null ) {
                    byte[] theFile = file.getFile();

                    fileInputStream = new ByteArrayInputStream( theFile );
                    fileName = file.getFileName();
                } else {
                    //
                }

            } catch ( Exception e ) {
                //
            }
...

一切正常,但我希望从服务器端监控(从我的Tomcat容器 - 服务器端,而不是用户的浏览器)用户下载的进度......

有可能吗?

感谢。

2 个答案:

答案 0 :(得分:2)

如果要监视服务器上的用户下载,则需要定义自己的流结果类型。由于struts流结果类不记录或生成这些数据。

您可以延长StreamResult。请查看doExecute方法。你可以看到

 while (-1 != (iSize = inputStream.read(oBuff))) {
                oOutput.write(oBuff, 0, iSize);
  }

您可以在此处查找从文件中读取的数据量。你可以在这里放一些日志。 while循环重复每个缓冲区大小(默认为2048)。此循环中的一个简单计数器将显示您已阅读的数据量

 int totalBlock = 0 ;
 while (-1 != (iSize = inputStream.read(oBuff))) {
           oOutput.write(oBuff, 0, iSize);
           totalBlock ++;
          log.debug( totalBlock * 2048  + "  is read so far");
      }

答案 1 :(得分:2)

好的伙计们。我在这里找到了诀窍:

http://www.java2s.com/Code/Android/File/InputStreamthatnotifieslistenersofitsprogress.htm

刚刚实现了我自己的监听器:

public class ProgressListener implements OnProgressListener {

    @Override
    public void onProgress(int percentage, Object tag) {
        System.out.println( (String)tag + " " + percentage + "%" );

    }

}

并将我的Struts 2 Action更改为:

@Action(value="getFile", results= {  
        @Result(name="ok", type="stream", params = {
                "contentType", "application/octet-stream",
                "inputName", "fileInputStream",
                "contentDisposition", "filename=\"${fileName}\"",
                "bufferSize", "1024"
        }) }
)   

@ParentPackage("default")
public class GetFileAction extends BasicActionClass {
    private String fileName;
    private Integer idFile;
    private ProgressAwareInputStream fileInputStream;

    public String execute () {
        cmabreu.sagitarii.persistence.entity.File file = null;

        try {
            FileService fs = new FileService();
            if ( (idFile != null) && ( idFile > -1 ) ) {
                file = fs.getFile( idFile );
            }

            if ( file != null ) {
                fileName = file.getFileName();
                byte[] theFile = file.getFile();

                ProgressAwareInputStream pais = new ProgressAwareInputStream( new ByteArrayInputStream( theFile ), 
                        theFile.length, fileName );

                pais.setOnProgressListener( new ProgressListener() );

                fileInputStream = pais; 

            } else {
                //
            }

        } catch ( Exception e ) {
            //
        }

        return "ok";
    }

    ... getters and setters .

}

当我转到http://myapplication:8080/getFile?idFile=1234时的结果打印在Tomcat控制台上(暂时):

6FB377291.g6.txt.dot.gif 21%
6FB377291.g6.txt.dot.gif 42%
6FB377291.g6.txt.dot.gif 63%
6FB377291.g6.txt.dot.gif 84%
6FB377291.g6.txt.dot.gif 100%

听起来很完美!