【问题标题】:Spring Boot SSEEmitter send HttpStatus.ok when its doneSpring Boot SSEEmitter 完成后发送 HttpStatus.ok
【发布时间】:2021-11-17 11:43:36
【问题描述】:

我有一些服务方法正在执行 3 秒。我想在处理开始时(HTTPStatus.PROCESSING)和完成(HTTPSTATUS.OK)后(3秒)向客户端发送信息。现在我有了这个。无法意识到如何改善。它不能正常工作

控制器

@RestController
public class MainController {

    private ExecutorService nonBlockingService = Executors
            .newCachedThreadPool();


 @Async
    @CrossOrigin
    @GetMapping("/sse")
    public SseEmitter handleSse() throws IOException, InterruptedException {
        SseEmitter emitter = new SseEmitter();
        emitter.send(HttpStatus.PROCESSING);
        TestService.doSMG();
        emitter.send(HttpStatus.OK);
        return emitter;
    }
}

服务

public class TestService {
    public static void doSMG() throws InterruptedException {
        TimeUnit.SECONDS.sleep(1);
    }
}

客户

<html>
<head>
<script>

var sse = new EventSource('http://localhost:8080/sse');
sse.onmessage = function (evt) {
    var el = document.getElementById('sse');
    el.appendChild(document.createTextNode(evt.data));
    el.appendChild(document.createElement('br'));
};
</script>

</head>
<body>
<p id = "sse">
</p>
</body>
</html>

【问题讨论】:

  • 您需要返回 SseEmitter 并将其传递给 TestService.doMSMG 消息,以便完成后它可以发送消息。或者执行 TestService.doSMG() 方法 async 然后发送消息。目前它直接做所有事情。还要记住,发射器保持打开状态,因此在发送最后一条消息后,您还需要对其调用 complete 方法,以便它可以进行清理。
  • @M.Deinum 感谢您的回答。可以举个例子吗?

标签: javascript java spring spring-boot asynchronous


【解决方案1】:

您当前的解决方案是完全顺序的,这意味着它会按顺序执行所有操作。您应该尽快返回SseEmitter 并在后台线程中运行其他所有内容。

要在后台线程中运行,您需要注入 TaskExecutor 甚至更好的是 AsyncTaskExecutor,这样您就可以向它提交任务以供以后执行(一旦有线程可用于处理)。

这看起来像这样

@RestController
public class MainController {

  private final AsyncTaskExecutor taskExecutor;
  
  public MainController(AsyncTaskExecutor taskExecutor) {
    this.tashExecutor=taskExecutor;
  }  

  @CrossOrigin
  @GetMapping("/sse")
  public SseEmitter handleSse() throws IOException, InterruptedException {
    SseEmitter emitter = new SseEmitter();
    taskExecutor.submit(() -> {
        emitter.send(HttpStatus.PROCESSING);
        TestService.doSMG();
        emitter.send(HttpStatus.OK);
    });
    return emitter;
  }
}

这将在后台执行任务,同时立即返回SseEmitter

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2016-12-14
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多