使用createBackgroundTaskDialog执行异步任务时,控制台报错

使用createBackgroundTaskDialog执行异步任务时,控制台报错

 BackgroundTask<Integer, Void> task = new UploadTask(fileRef.getFileName(), fileUtils.getStorageFilePath(fileRef.getPath()), this.organizationName);
        dialogs.createBackgroundTaskDialog(task)
                .withHeader("同步中")
                .withText(fileRef.getFileName())
                .withTotal(100)
                .withShowProgressInPercentage(true)
                .withCancelAllowed(false)
                .open();
private class UploadTask extends BackgroundTask<Integer, Void> {
        private final String title;
        private final String filePath;
        private final String tags;

        public UploadTask(String title, String filePath, String tags) {
            super(10, TimeUnit.MINUTES, CourseDetailView.this);
            this.title = title;
            this.filePath = filePath;
            this.tags = tags;
        }

        @Override
        public Void run(TaskLifeCycle<Integer> taskLifeCycle) throws Exception {
            aliyunVodUtils.uploadVideo(title, filePath, tags, (videoId, playUrl) -> {
                Course course = getEditedEntity();
                course.setVideoId(videoId);
                course.setVideoPlayUrl(playUrl);
            }, (message) -> {
                notifications.create("同步发生错误", message).withThemeVariant(NotificationVariant.LUMO_ERROR).show();
            }, (bytes, total, percent) -> {
                taskLifeCycle.publish(percent);
            });

            return null;
        }

        public void done(Void result) {
            CourseDetailView.this.closeWithSave();
        }
    }

报错信息:

java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Authentication is not set. Use SystemAuthenticator in non-user requests like schedulers or asynchronous calls.
	at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:na]
	at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) ~[na:na]
	at com.vaadin.flow.server.FutureAccess.get(FutureAccess.java:62) ~[flow-server-24.3.8.jar:24.3.8]
	at com.vaadin.flow.server.VaadinService.runPendingAccessTasks(VaadinService.java:2085) ~[flow-server-24.3.8.jar:24.3.8]
	at com.vaadin.flow.server.VaadinSession.unlock(VaadinSession.java:708) ~[flow-server-24.3.8.jar:24.3.8]
	at com.vaadin.flow.server.VaadinService.ensureAccessQueuePurged(VaadinService.java:2047) ~[flow-server-24.3.8.jar:24.3.8]
	at com.vaadin.flow.server.VaadinService.accessSession(VaadinService.java:2014) ~[flow-server-24.3.8.jar:24.3.8]
	at com.vaadin.flow.server.VaadinSession.access(VaadinSession.java:1012) ~[flow-server-24.3.8.jar:24.3.8]
	at com.vaadin.flow.component.UI.access(UI.java:561) ~[flow-server-24.3.8.jar:24.3.8]
	at com.vaadin.flow.component.UI.access(UI.java:544) ~[flow-server-24.3.8.jar:24.3.8]
	at io.jmix.flowui.backgroundtask.impl.BackgroundWorkerImpl$TaskExecutorImpl.handleProgress(BackgroundWorkerImpl.java:248) ~[jmix-flowui-2.2.3.jar:na]
	at io.jmix.flowui.backgroundtask.impl.BackgroundWorkerImpl$TaskExecutorImpl$2.publish(BackgroundWorkerImpl.java:222) ~[jmix-flowui-2.2.3.jar:na]
	at com.gense.ips.view.edu.course.CourseDetailView$UploadTask.lambda$run$2(CourseDetailView.java:182) ~[main/:na]
	at com.gense.ips.util.AliyunVodUtils$ProgressListener.progressChanged(AliyunVodUtils.java:99) ~[main/:na]
	at com.aliyun.oss.event.ProgressPublisher.publishByteCountEvent(ProgressPublisher.java:65) ~[aliyun-sdk-oss-3.10.2.jar:na]
	at com.aliyun.oss.event.ProgressPublisher.publishRequestBytesTransferred(ProgressPublisher.java:49) ~[aliyun-sdk-oss-3.10.2.jar:na]
	at com.aliyun.vod.upload.oss.OSSUploadOperation$Task.call(OSSUploadOperation.java:416) ~[aliyun-java-vod-upload-1.4.15.jar:na]
	at com.aliyun.vod.upload.oss.OSSUploadOperation$Task.call(OSSUploadOperation.java:374) ~[aliyun-java-vod-upload-1.4.15.jar:na]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: java.lang.IllegalStateException: Authentication is not set. Use SystemAuthenticator in non-user requests like schedulers or asynchronous calls.
	at io.jmix.core.security.impl.CurrentAuthenticationImpl.getAuthentication(CurrentAuthenticationImpl.java:50) ~[jmix-core-2.2.3.jar:na]
	at io.jmix.core.security.impl.CurrentAuthenticationImpl.getLocale(CurrentAuthenticationImpl.java:76) ~[jmix-core-2.2.3.jar:na]
	at io.jmix.core.impl.MessagesImpl.getMessage(MessagesImpl.java:100) ~[jmix-core-2.2.3.jar:na]
	at io.jmix.core.impl.MessagesImpl.formatMessage(MessagesImpl.java:136) ~[jmix-core-2.2.3.jar:na]
	at io.jmix.flowui.impl.DialogsImpl$BackgroundTaskDialogBuilderImpl.updateProgress(DialogsImpl.java:1034) ~[jmix-flowui-2.2.3.jar:na]
	at io.jmix.flowui.impl.DialogsImpl$BackgroundTaskDialogBuilderImpl$1.onProgress(DialogsImpl.java:1013) ~[jmix-flowui-2.2.3.jar:na]
	at io.jmix.flowui.backgroundtask.impl.BackgroundWorkerImpl$TaskExecutorImpl.process(BackgroundWorkerImpl.java:256) ~[jmix-flowui-2.2.3.jar:na]
	at io.jmix.flowui.backgroundtask.impl.BackgroundWorkerImpl$TaskExecutorImpl.lambda$handleProgress$720cdb40$1(BackgroundWorkerImpl.java:248) ~[jmix-flowui-2.2.3.jar:na]
	at com.vaadin.flow.component.UI.accessSynchronously(UI.java:489) ~[flow-server-24.3.8.jar:24.3.8]
	at com.vaadin.flow.component.UI$2.execute(UI.java:564) ~[flow-server-24.3.8.jar:24.3.8]
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
	at com.vaadin.flow.server.VaadinService.runPendingAccessTasks(VaadinService.java:2082) ~[flow-server-24.3.8.jar:24.3.8]
	... 18 common frames omitted
在此处键入或粘贴代码

你好,这个问题我没有重现。在你抛异常的这几个方法中,我的代码是能拿到 currentAuthentication 的。

你可以尝试跟一下下面代码中的几个方法,看看是哪里的问题。如果需要的话,可以用SystemAuthenticator bean 在系统认证的上下文中执行需要安全检查的逻辑:认证 :: Jmix 文档

image

在抛出异常的代码中,使用systemAuthenticator,异常不再出现了。

        @Override
        public Void run(TaskLifeCycle<Integer> taskLifeCycle) throws Exception {
            aliyunVodUtils.uploadVideo(title, filePath, tags, (videoId, playUrl) -> {
                Course course = getEditedEntity();
                course.setVideoId(videoId);
                course.setVideoPlayUrl(playUrl);
            }, (message) -> {
                notifications.create("同步发生错误", message).withThemeVariant(NotificationVariant.LUMO_ERROR).show();
            }, (bytes, total, percent) -> {
                systemAuthenticator.withSystem(() -> {
                    try {
                        taskLifeCycle.publish(percent);
                    } catch (InterruptedException ignored) {}
                    return null;
                });
            });

            return null;
        }

1 个赞