useEffect(() => {
if(!account) {
return;
}
console.log("read events", account, timestamp);
const eventSource = new EventSource(sol_api + `/events/${account}`);
eventSource.onerror = (e) => {console.log("Event Source Error!", e);eventSource.close();setError(true);};
eventSource.onmessage = (e) => addEvent(JSON.parse(e.data));
return () => {
console.log("close eventSource", eventSource);
eventSource.close();
};
}, [account, timestamp]);
@GetMapping("/hooks/{account}/new_game")
public Mono<TableauDto> publisher(@PathVariable String account) {
return Mono.defer(() -> {
var currentStartBlock = service
.load(account)
.map(session -> session.getStartBlock())
.orElse(0l);
try {
Thread.sleep(3000);
for (int i = 0; i < 4; i++) {
var tempSession = service.load(account);
if (tempSession.isPresent()) {
log.info("tempSession is present {}", tempSession.get().getStartBlock());
if (currentStartBlock < tempSession.get().getStartBlock()) {
log.info("return new session {}", tempSession.get().getStartBlock());
var dto = tempSession.get().getTableau().dto();
dto.setStartBlock(tempSession.get().getStartBlock());
return Mono.just(dto);
}
}
log.info("wait 3000");
Thread.sleep(3000);
}
} catch (Exception e) {
log.error("error waiting new game", e);
}
return Mono.empty();
});
}
Очевидно вы не соблюдаете принцип единой ответственности
public void run() {
if(!doScan) {
return;
}
long currentBlock = stateService.getCurrentBlock();
long headBlock = api.getDynamicGlobalProperties().orElseThrow().getHeadBlockNumber();
if(currentBlock == 0) {
currentBlock = headBlock - 2;
}
while(++currentBlock < headBlock) {
log.info("process block {}", currentBlock);
var block = api.getBlock(currentBlock).orElseThrow();
blockProcessor.process(currentBlock, block);
}
}
Вот тут можно посмотреть, как в bootstrap это сделано. Там несколько брекпоинтов, и они не под физический размер экрана, а просто сделано под большинство размеров экранов.
https://getbootstrap.com/docs/5.0/layout/breakpoints/