异步推送更新Vaadin Progressbar

时间:2018-02-22 21:12:57

标签: spring websocket push vaadin8

我在计算文件的散列时有一个问题,例如:md5,sha1,sha256通过异步过程在progressBar中设置进度

感谢 Alejandro Duarte ,他们展示了一个非常实用的例子

https://github.com/newUserRepo/testbar/blob/issueBar/vaadin-upload/src/main/java/com/example/vaadinupload/ProcessingService.java#L44

我能让它工作的唯一方法是在方法第75行,我用4毫秒来处理任务并更新了条形图,但它太慢了。

是的,我没有睡眠线程,应用程序没有正确执行推送,并且更改未正确反映给客户端。

实际工作的另一种方法是使用Runnable接口并在run()方法中执行繁重的任务

@Override
public void run() {
    calcularHash();
}

public void calcularHash() {

    System.out.println("Path tmp archivo: " + 
        tmpPath.toFile().getAbsolutePath());

    for(int f=0; f<hashType.size(); f++) {
        try (InputStream bis = new 
                  BufferedInputStream(Files.newInputStream(tmpPath))) {
            t.initTime();
            byte[] buffer = new byte[1024];
            MessageDigest messageDigest = 
             MessageDigest.getInstance(hashType.get(f));
            int dataRead = 0;
            long largo = tmpPath.toFile().length();
            Long acum = 0L;
            while ((dataRead = bis.read(buffer)) != -1) {
                messageDigest.update(buffer, 0, dataRead);
                acum += dataRead;
                Float per = ((float) acum / largo);
                bar.setValue(per);
                System.out.println(per * 100);
                //textFieldPercent.setValue(Types.formatPercentaje(per * 
           100));
            }
            final byte[] bytesDigest = messageDigest.digest();
            final StringBuilder sb = new StringBuilder();
            for (int c = 0; c < bytesDigest.length; c++) {
                sb.append(Integer.toString((bytesDigest[c] & 0xFF) + 0x100, 
               16).substring(1));
            }
            final String hashObtenido = sb.toString();
            t.finishTime();
            final String totalTime = t.getFinalTimeSec() + "seg " + 
                 t.getFinalTimeMs() + "ms";
            final String large = Types.getLargeFileFormat(largo);
            System.out.println(hashObtenido);
            ui.access(() -> {
                checksumTransactions.initData(messageDigest.getAlgorithm(), 
                                            sb.toString(),large, totalTime);
            });

           //Files.delete(tmpPath); //fixme borrar desde el grid o UI
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

在目前的图片中,我使用了一个简单的public void run(),并且Progressbar已经很好地更新了

enter image description here

但是我们知道应用程序可能有内存泄漏并且不是一个好习惯,理想的是知道如何执行后台线程

我仍然不知道实现这个目标的最佳方法:$

0 个答案:

没有答案