Java 服务器使用Spring发送了事件,其中线程已从请求中释放

Java 服务器使用Spring发送了事件,其中线程已从请求中释放,java,spring,server-sent-events,Java,Spring,Server Sent Events,我需要展示一个服务器发送事件的示例。我在一次春季讲座中了解到了这一点。人们用Webflux来展示反应性原理。我理解了这将如何释放线程资源的部分,因为在作业完成并且服务器返回响应之前,请求线程不会被阻塞 我这里有一个例子,但实际上我不知道如何让这个线程资源的例子足够清晰 我不想在这里使用WebFlux框架。只需要知道在这里把什么放到一个单独的线程中-如果有必要的话 如您所见,我有一个GetMapping来订阅事件流。然后我有一个GetMapping,可以启动一个事件。这个例子确实很快,但应该被认为

我需要展示一个服务器发送事件的示例。我在一次春季讲座中了解到了这一点。人们用Webflux来展示反应性原理。我理解了这将如何释放线程资源的部分,因为在作业完成并且服务器返回响应之前,请求线程不会被阻塞

我这里有一个例子,但实际上我不知道如何让这个线程资源的例子足够清晰

我不想在这里使用WebFlux框架。只需要知道在这里把什么放到一个单独的线程中-如果有必要的话

如您所见,我有一个GetMapping来订阅事件流。然后我有一个GetMapping,可以启动一个事件。这个例子确实很快,但应该被认为是一个繁重的数据库调用

所以我实际上需要把整个逻辑在另一个线程中分开,对吗?那么请求线程是否尽快空闲

@RestController
public class EventStreamRequestHandler {

  @Autowired
  ObjectMapper objectMapper;
  SseEmitter sseEmitter = new SseEmitter(1000000L);

  @GetMapping("/get/event/stream")
  public SseEmitter getStream() {
    return this.sseEmitter;
  }


  @GetMapping("/launch/event")
  public void fireEvent() throws IOException {
    Person peter = new Person("Peter", "25");
    String valueAsString = objectMapper.writeValueAsString(peter);

    SseEmitter.SseEventBuilder sseEventBuilder = SseEmitter.event()
            .id("foo") 
            .name("awesome-event") 
            .data(valueAsString); 

    sseEmitter.send(sseEventBuilder);
  }
}

是的,服务器发送的事件应该异步向客户端发送消息,而不需要客户端继续轮询消息

从客户端到服务器的消息发送需要异步完成。用你做这件事的方式。当GET请求发送到
/GET/event/stream
时,将创建一个SSEEmiter,但只有当GET请求发送到
/launch/event
时,才会发送消息。而
/launch/event
的GET请求线程将用于发送消息

不久前,我写了一封信,用不同的线程发送SSE消息。我希望这有帮助


但我不建议将
SseEmitter
存储在实例变量中,因为它将被多个请求覆盖。您必须至少使其成为
ThreadLocal

啊,好的!因为Get请求总是为此创建一个新线程,对吗?但是我不需要将此范围更改为
请求
吗?因为取消设置将导致
单例
?或者我在这里出错了吗?get请求将有一个请求线程,通常由Tomcat之类的Web容器分配。您的应用程序将不会有新线程。