2015-03-31 7 views
1

Я использую весеннюю загрузку 1.2.2.Отправка сообщения в встроенный HornetQ из внешнего приложения

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

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

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

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

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) 
+0

Я смотрю на что-то подобное (в конце концов, я хочу, чтобы сгруппировать два встроенных HornetQ установок), но не понял его еще ни , Я думаю, что для начала вам нужно будет добавить транспорт на встроенный сервер, который позволяет подключаться к фактическому порту, по умолчанию будет настроен только InVMConnectorFactory. –

ответ

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 
+0

Я не мог заставить это работать. Оба приложения запускаются нормально, без ошибок. Когда я пытаюсь отправить сообщение, я получаю 'org.hornetq.api.core.HornetQNotConnectedException: HQ119007: Не удается подключиться к серверу (серверам). Пробовал со всеми доступными серверами. « – jax

+0

Я начал использовать другой порт« 5455 », и все начало работать ... не знаю почему. – jax