Saya mencoba memberi tahu semua pengguna suatu acara melalui acara yang dikirim server tetapi tidak tahu mengapa tetapi tidak berfungsi. Saya dapat memberi tahu pengguna tunggal jika saya menggunakan antrian tetapi jika saya mengubah konfigurasi untuk menggunakan topik, itu tidak menghasilkan apa-apa. A yang Anda lihat di bawah ini saya menggunakan antrian dan mengomentari template.setPubSubDomain(true) di jmsTopicTemplate kemudian dikirim ke pengguna tunggal

@Bean
    public Publisher<Message<LocationData>> jmsReactiveSource(ConnectionFactory connectionFactory) {

        return IntegrationFlows
                .from(Jms.messageDrivenChannelAdapter(connectionFactory)
                        .destination(JMSConfig.Location_TOPIC).
                        jmsMessageConverter(messageConverter()))
                //.channel(new PublishSubscribeChannel(executor()))                 
//              .channel(MessageChannels.flux())
                .channel(MessageChannels.queue())
                .toReactivePublisher();
    }

Anda dapat memeriksa kode di https://github.com/haiderali22/ spring-tracking-jms-sse-mongo-app

0
Haider 15 Mei 2020, 06:36

1 menjawab

Jawaban Terbaik

Yah, saya telah memeriksa proyek Anda sayangnya masih cukup besar untuk dicerna dengan baik. Tapi apa yang saya lihat dari perspektif Integrasi seharusnya seperti ini:

return IntegrationFlows
            .from(Jms.messageDrivenChannelAdapter(connectionFactory)
                    .destination(JMSConfig.Location_TOPIC).
                            jmsMessageConverter(messageConverter())
                    .autoStartup(false)
                    .id("jmsMessageDrivenChannelAdapter"))
            .toReactivePublisher();

toReactivePublisher() sudah menyuntikkan saluran dengan sendirinya. Tidak perlu ada yang lain di antaranya. autoStartup(false) adalah untuk langganan yang ditangguhkan ke Flux final. Dengan cara ini Anda tidak akan menarik pesan dari JMS sampai langganan terjadi pada Flux pada akhirnya.

.id("jmsMessageDrivenChannelAdapter")) yang akan Anda gunakan nanti di LocationService untuk ini:

public Flux<LocationData> watch() {
    return Flux.from(jmsReactiveSource)
            .map(Message::getPayload)
            .doOnSubscribe(s -> jmsMessageDrivenChannelAdapter.start());
}

Dengan cara ini Anda tidak akan mulai menarik dari JMS sampai langganan yang sebenarnya terjadi ke Flux.

Topik JMS tidak memiliki relevansi dengan subjek SSE ini.

Jika Anda dapat membuat proyek Anda lebih sederhana, saya akan mencobanya lagi. Saya tidak akrab dengan Lombok...

PERBARUI

Dengan solusi saat ini Anda perlu membuatnya seperti ini:

.channel(MessageChannels.flux())
.toReactivePublisher();

Masalahnya dengan .toReactivePublisher() biasa setelah itu berdasarkan pesan, kami hanya mendapatkan satu pelanggan untuk penerbit akhir.

Untuk membuatnya pub-sub Anda pasti perlu menempatkan FluxMessageChannel di antaranya. Dengan cara ini semua SEE Anda akan dikirim ke semua pelanggan JavaScript.

1
Artem Bilan 18 Mei 2020, 16:03