Отправка сообщения встроенному HornetQ из внешнего приложения

Я использую весеннюю загрузку 1.2.2.

У меня есть встроенная настройка очереди шершня в application.properties:

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

Я хочу добавить сообщение в "myQueue" из внешнего приложения (не того со встроенной очередью). Это возможно?

В другом приложении (без встроенного hornetq) я попытался создать фабрику соединений, указывающую на встроенный сервер hornetq, но я действительно не знаю, какой порт мне следует использовать. Согласно весенней загрузке документации говорится, что она действительна только для «собственного» режима.

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

вот мой код до сих пор:

@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;
    }

}

А потом:

@Autowired
private JmsTemplate jmsTemplate;

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

Но у меня проблема с подключением.

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 источник
comment
Я смотрю на что-то подобное (в конце концов я хочу объединить две встроенные установки HornetQ), но еще не понял этого. Я думаю, для начала вам нужно будет добавить транспорт на встроенный сервер, который позволяет подключаться к реальному порту, по умолчанию будет настроен только InVMConnectorFactory.   -  person ci_    schedule 31.03.2015


Ответы (1)


Проблема в том, что встроенный сервер HornetQ по умолчанию настроен только на InVMAcceptorFactory. Вам нужно добавить AcceptorFactory, который фактически прослушивает порт, например NettyAcceptorFactory.

Вы можете использовать HornetQConfigurationCustomizer для настройки этого. В приведенном ниже примере используется жестко заданный хост/порт, но вы можете легко создать свои собственные свойства, чтобы сделать это настраиваемым.

@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);
        }
    };
}

В вашем приложении со встроенным сервером вы настраиваете его как встроенный (как я полагаю, у вас уже есть, просто чтобы убедиться):

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

И в вашем «другом» приложении, которое вы хотите подключить к встроенному серверу, вы настраиваете HornetQ в собственном режиме:

spring.hornetq.mode=native
spring.hornetq.host=localhost
spring.hornetq.port=5445
person ci_    schedule 02.04.2015
comment
Я не мог заставить это работать. Оба приложения запускаются нормально, без ошибок. Когда я пытаюсь отправить сообщение, я получаю org.hornetq.api.core.HornetQNotConnectedException: HQ119007: Cannot connect to server(s). Tried with all available servers. - person jax; 10.04.2015
comment
Я начал использовать другой порт 5455, и все заработало ... не знаю, почему. - person jax; 10.04.2015