gpt4 book ai didi

java - SSE 发射器 : Manage timeouts and complete()

转载 作者:搜寻专家 更新时间:2023-11-01 02:03:14 26 4
gpt4 key购买 nike

我正在编写一个网络应用程序,其中多个监听器(Evcentsource SSE 客户端 JS)将连接到我的服务器。我想做的是

  1. 为每个连接的监听器存储 SSE 发射器:可以在内存中或通过为每个客户端分配 id 的任何其他方式完成,到目前为止我能够实现这一点
  2. 现在是问题;我如何向连接到我的网络应用程序的特定客户端发送响应/事件?在执行此操作时,存储的 SSEEmmiters 要么完成要么超时。我该如何防止这种情况?我如何保持 sseEmmiter 无限期打开(直到客户端关闭)并有选择地发送事件。

最佳答案

如果你想让 sseEmmiter 无限期打开,你可以简单地将超时设置为 -1L

并有选择地发送事件将所有 sseEmmiters 放入具有特定键的映射中,以便在您要发送事件时使用它 就像我在这段代码中所做的那样。

@Controller
@RequestMapping(path = "api/person")
public class PersonController {

@Autowired
private PersonRepository personRepository;
private Map<String, SseEmitter> onPersonAddedSseEmitters = new ConcurrentHashMap<>();

@PostMapping(path = "/add")
public @ResponseBody
String addPerson(@RequestBody Person person) {
person.setId(new Random().nextLong());
personRepository.save(person);
onPersonAddedSseEmitters.forEach((key, sseEmitter) -> {
try {
if (person.getName().startsWith(key.split("-")[0])) {
sseEmitter.send(person);
}
} catch (Exception ignored) {
sseEmitter.complete();
onPersonAddedSseEmitters.remove(key);
}
});
return "Saved";
}

@GetMapping(path = "/onPersonAdded/{prefix}")
public SseEmitter onPersonAdded(@PathVariable String prefix) {
SseEmitter sseEmitter = new SseEmitter(-1L);
onPersonAddedSseEmitters.put(prefix + "-" + new Random().nextLong(), sseEmitter);
return sseEmitter;
}
}

关于java - SSE 发射器 : Manage timeouts and complete(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40462780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com