Подписка Netflix DGS не вызывается после мутации
Я слежу за документами по подписке DGS вместе с по документамиподписке Apollo, чтобы сделать простой пример подписок в приложении React. Я тоже этим пользовался .
Веб-сокет и серверная часть могут нормально подключаться - я могу запрашивать данные, а также вызывать мутацию (используя GraphiQL). В самый первый раз, когда мутация вызывается, она проходит, данные сохраняются, возвращаются и отображаются в пользовательском интерфейсе, как и ожидалось. В любое время после этого при вызове мутации подписка не работает. Вызов мутации выполнен успешно, данные сохраняются и все такое, но никакие данные не возвращаются в пользовательский интерфейс. Я проверил консоль / сеть браузера - ничего (правда, первый вызов вижу).
Вот мой сборщик данных
@DgsQuery(field = "helloWorld")
public List<HelloWorldEntity> getHelloWorld() {
return helloWorldService.findAll();
}
@DgsMutation
public HelloWorldEntity addHelloWorld(@InputArgument AddHelloWorld addHelloWorld) {
return helloWorldService.save(addHelloWorld);
}
@DgsSubscription
public Publisher<HelloWorldEntity> helloWorldAdded() {
return helloWorldService.getHelloWorldPublisher();
}
Обслуживание:
@Autowired
private HelloWorldRepository helloWorldRepository;
private FluxSink<HelloWorldEntity> helloWorldStream;
private ConnectableFlux<HelloWorldEntity> helloWorldPublisher;
@PostConstruct
private void serviceConfig() {
Flux<HelloWorldEntity> publisher = Flux.create(emitter -> {
helloWorldStream = emitter;
});
helloWorldPublisher = publisher.publish();
helloWorldPublisher.connect();
}
@Override
public List<HelloWorldEntity> findAll() {
return helloWorldRepository.findAll();
}
@Override
public HelloWorldEntity save(AddHelloWorld addHelloWorld) {
HelloWorldEntity hwe = new HelloWorldEntity(addHelloWorld.getHello(), addHelloWorld.getWorld());
helloWorldRepository.save(hwe);
helloWorldStream.next(hwe);
return hwe;
}
@Override
public Publisher<HelloWorldEntity> getHelloWorldPublisher() {
return helloWorldPublisher;
}
и компонент реакции
const {loading, error, data: getHelloWorld } = useQuery(HELLO_WORLD);
const [listItems, setListItems] = useState<Array<any>>([]);
useEffect(() => {
if(undefined != getHelloWorld) {
setListItems(getHelloWorld.helloWorld);
}
}, [getHelloWorld])
const LatestHelloWorld : React.FC = () => {
const {error, data, loading } = useSubscription(
HELLO_WORLD_SUBSCRIPTION
);
if(undefined != data) {
return <HellowWorldListItem id={data.helloWorldAdded.id} hello={data.helloWorldAdded.hello} world={data.helloWorldAdded.world}/>;
} else {
return <div/>
}
}
let items = listItems.map((item) => (<HellowWorldListItem id={item.id} hello={item.hello} world={item.world}/>));
return (
<div>
Hello Responsive World
<div>
{items}
</div>
<LatestHelloWorld />
</div>
)