我认为从Java发出HTTP SSE并处理这些连接应该没有那么复杂,但是我不知道该怎么做。
我有一个服务器(Java SE 11)和多个客户端(带有JavaScript的Web浏览器),它们开始侦听来自服务器的消息。 (我正在localhost上进行测试)
客户端非常简单:
var evtSource = new EventSource("localhost/javaapp");
evtSource.onmessage = function(e) {
console.log("message: " + e.data);
}
evtSource.onerror = function(e) {
console.log("sse failed");
}
但是对于服务器端,我不知道。经过一番调查,我发现我可能应该使用javax.ws.rs.sse
API,但是它所包含的只是接口,而您发现的示例代码片段使用了很多@Annotations,我想避免这些事情。 / p>
我什至需要此API吗?还是可以只创建带有适当标头的基本HTTP连接?但是,如何实现SSE的所有功能呢?自动保持活动状态等等...
目标是分别处理所有客户。他们订阅了服务器,并且如果某个事件发生了,服务器将向该服务器发送一条消息。因此,这与向所有人广播同一件事无关。
答案 0 :(得分:4)
使用Spring Web 您只需创建一个SseEmitter对象,然后向其发送数据即可。
,您可以直接从客户端接收数据。
@Controller
@RequestMapping(path = "api/person")
public class PersonController {
@Autowired
private PersonRepository personRepository;
private Optional<SseEmitter> sseEmitter = Optional.empty();
@PostMapping(path = "/add")
public @ResponseBody
String addPerson(@RequestBody Person person) {
personRepository.save(person);
sseEmitter.ifPresent(sseEmitter1 -> {
try {
sseEmitter1.send(person);
} catch (IOException e) {
e.printStackTrace();
}
}
);
return "Saved";
}
@GetMapping(path = "/onPersonAdded")
public SseEmitter onPersonAdded() {
sseEmitter = Optional.of(sseEmitter.orElse(new SseEmitter(-1L)));
return sseEmitter.get();
}
}