개발 중 삽질 과정을 기록하려고 한다.
재해 알림처럼 빠르게 전달해야하는 데이터가 있다... 이걸 알림으로 전달하면 제일 쉽겠으나 사용자가 알림을 거부하면 무용지물일 것이다. 어떻게 하지 끙끙거리다가 우선 sse로 개발해보기로 했다.
이렇게 보내서
package com.junge.api.controller.server;
import com.junge.api.Model.server.RealTimeData;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.http.MediaType;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;
import java.io.IOException;
@RestController
@RequestMapping("/server-events")
public class ServerEventsController {
private Sinks.Many<String> realTimeDataMany = Sinks.many().multicast().onBackpressureBuffer();
public void sendData(String data) {
this.realTimeDataMany.tryEmitNext(data);
}
@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> KafkaDataProcess() throws IOException {
return this.realTimeDataMany.asFlux();
}
@KafkaListener(topics = "topic1", groupId = "test") // 카프카로 정보를 받는다.
void listener(ConsumerRecord<String, String> record) throws IOException {
sendData(record.value());
}
}
이렇게 받는다.
import 'package:flutter/material.dart';
import 'package:sse_channel/sse_channel.dart';
void getData() {
final channel =
SseChannel.connect(Uri.parse('http://주소:8080/server-events'));
channel.stream.listen((data) {
print(data);
});
}
받기는 하나 build를 하니 앱이 죽으려고 한다. 아마 구글 지도나 여러가지를 최적화하지 않은 상태에서 연결을 하니 그런듯. 다른 걸 최적화하는 방법이 있지만 sse 라이브러리가 업데이트되는 것 같지 않아(공식 계정 sse 라이브러리가 http 0.13.5를 사용한다.) 다른 방법을 생각해보기로 했다.
유익한 글 잘 봤습니다, 감사합니다.