Mengirim pesan ke HornetQ yang tertanam dari aplikasi eksternal

Saya menggunakan spring-boot 1.2.2.

Saya memiliki pengaturan antrian lebah yang tertanam di application.properties:

spring.hornetq.mode=embedded
spring.hornetq.embedded.enabled=true
spring.hornetq.embedded.queues=myQueue

Saya ingin menambahkan pesan ke "myQueue" dari aplikasi eksternal (bukan yang memiliki antrian tertanam). Apakah ini mungkin?

Di aplikasi lain (yang tanpa hornetq tertanam), saya mencoba membuat connectionFactory yang menunjuk ke server hornetq tertanam tetapi saya tidak tahu port apa yang harus saya gunakan. Menurut spring-boot dokumentasi katanya hanya valid untuk mode "asli".

spring.hornetq.mode= # connection mode (native, embedded)
spring.hornetq.host=localhost # hornetQ host (native mode)
spring.hornetq.port=5445 # hornetQ port (native mode)

inilah kode saya sejauh ini:

@EnableJms
@Configuration
public class HornetQConfig {

    @Bean
    public CachingConnectionFactory connectionFactory() {
        CachingConnectionFactory cachingConnectionFactory =
                new CachingConnectionFactory();
        cachingConnectionFactory.setSessionCacheSize(10);
        cachingConnectionFactory.setCacheProducers(false);
        cachingConnectionFactory.setTargetConnectionFactory(hornetQConnectionFactory());
        return cachingConnectionFactory;
    }

    @Bean
    public HornetQConnectionFactory hornetQConnectionFactory() {

        HornetQConnectionFactory connectionFactory =
                new HornetQConnectionFactory(false, transportConfiguration());
        return connectionFactory;
    }

    @Bean
    public TransportConfiguration transportConfiguration() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("host", "localhost");
        map.put("port", 5445);
        TransportConfiguration configuration =
                new TransportConfiguration(
                        "org.hornetq.core.remoting.impl.netty.NettyConnectorFactory", map);
        return configuration;
    }

}

Kemudian:

@Autowired
private JmsTemplate jmsTemplate;

@Scheduled(fixedDelay = 1000L)
public void send() {
    this.jmsTemplate.convertAndSend("myQueue", "Hello from external app");
}

Tapi saya mendapat masalah koneksi.

Failed to create session factory; nested exception is HornetQNotConnectedException[errorType=NOT_CONNECTED message=HQ119007: Cannot connect to server(s)

person jax    schedule 31.03.2015    source sumber
comment
Saya sedang melihat sesuatu yang serupa (akhirnya saya ingin mengelompokkan dua pengaturan HornetQ yang tertanam), tetapi belum menemukan jawabannya juga. Saya pikir sebagai permulaan, Anda perlu menambahkan transport pada server tertanam yang memungkinkan koneksi pada port sebenarnya, secara default hanya InVMConnectorFactory yang akan dikonfigurasi.   -  person ci_    schedule 31.03.2015


Jawaban (1)


Masalahnya adalah server HornetQ tertanam dikonfigurasi hanya dengan InVMAcceptorFactory secara default. Anda perlu menambahkan AcceptorFactory yang benar-benar mendengarkan port, seperti NettyAcceptorFactory.

Anda dapat menggunakan HornetQConfigurationCustomizer untuk mengonfigurasinya. Contoh di bawah ini menggunakan host/port yang dikodekan secara keras, namun Anda dapat dengan mudah membuat properti sendiri agar dapat dikonfigurasi.

@Bean
public HornetQConfigurationCustomizer hornetCustomizer() {
    return new HornetQConfigurationCustomizer() {
        @Override
        public void customize(Configuration configuration) {
            Set<TransportConfiguration> acceptors = configuration.getAcceptorConfigurations();
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("host", "localhost");
            params.put("port", "5445");
            TransportConfiguration tc = new TransportConfiguration(NettyAcceptorFactory.class.getName(), params);
            acceptors.add(tc);
        }
    };
}

Dalam aplikasi Anda dengan server tertanam, Anda mengonfigurasinya sebagai tertanam (seperti yang saya yakin sudah Anda miliki, hanya untuk memastikan):

spring.hornetq.mode=embedded
spring.hornetq.embedded.enabled=true
spring.hornetq.embedded.queues=myQueue

Dan di aplikasi "lainnya" yang ingin Anda sambungkan ke server tertanam, Anda mengonfigurasi HornetQ dalam mode asli:

spring.hornetq.mode=native
spring.hornetq.host=localhost
spring.hornetq.port=5445
person ci_    schedule 02.04.2015
comment
Saya tidak bisa membuat ini berfungsi. Kedua aplikasi dimulai dengan baik tanpa kesalahan. Ketika saya mencoba mengirim pesan, saya mendapatkan org.hornetq.api.core.HornetQNotConnectedException: HQ119007: Cannot connect to server(s). Tried with all available servers. - person jax; 10.04.2015
comment
Saya mulai menggunakan port 5455 yang berbeda dan semuanya mulai berfungsi... tidak yakin mengapa. - person jax; 10.04.2015