Как подключить производителя ActiveMQ к брокеру OpenMQ JMS

Я пытаюсь отправить текстовые сообщения с тяжелого клиента Swing (используя библиотеку Apache ActiveMQ) на экземпляр сервера Glassfish, который, похоже, использует OpenMQ в качестве поставщика JMS по умолчанию.

Ниже самого исходного базового кода, который я использую для своего клиента:

try {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("jms/SaisieQueueFactory");
    connectionFactory.setBrokerURL("tcp://localhost:27676");
    Connection connection = connectionFactory.createConnection();
    connection.start();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Destination destination = session.createQueue("jms/SaisieQueue");
    MessageProducer producer = session.createProducer(destination);
    producer.setDeliveryMode(DeliveryMode.PERSISTENT);
    TextMessage message = session.createTextMessage("Score + 1");
    producer.send(message);
    session.close();
    connection.close();
} catch(Exception ex) {
    ex.printStackTrace();
}
  • Я нашел порт брокера в свойствах системы из консоли администрирования сервера Glassfish (JMS_PROVIDER_PORT)
  • Фабрика соединений с очередью и очередь были созданы, когда я развернул свой MessageDrivenBean.
  • На данный момент клиент и экземпляр Glassfish работают на одном компьютере, но я хотел бы, чтобы они работали на двух разных машинах (поэтому я не использую vm:// в качестве транспортного протокола)

Я получил эти исключения:

javax.jms.JMSException: Cannot send, channel has already failed: tcp://127.0.0.1:7676
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62)
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1395)
    at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1481)
    at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:516)
    at testdate.TestDate.main(TestDate.java:44)
Caused by: org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed: tcp://127.0.0.1:7676
    at org.apache.activemq.transport.AbstractInactivityMonitor.doOnewaySend(AbstractInactivityMonitor.java:282)
    at org.apache.activemq.transport.AbstractInactivityMonitor.oneway(AbstractInactivityMonitor.java:271)
    at org.apache.activemq.transport.TransportFilter.oneway(TransportFilter.java:85)
    at org.apache.activemq.transport.WireFormatNegotiator.oneway(WireFormatNegotiator.java:104)
    at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:68)
    at org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:81)
    at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:86)
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1366)
    ... 3 more
  • Я рассмотрел решение о смене поставщика JMS моего экземпляра Glassfish на ActiveMQ, но, если это возможно, я хотел бы сохранить OpenMQ

PS: я новичок в JMS и фреймворке Java EE.


person Vincent    schedule 12.02.2013    source источник
comment
Вы можете загрузить и запустить брокера ActiveMQ и протестировать свой клиентский код. Если он не работает таким же образом, ваш клиент сломан, если он работает, у вас проблема с конфигурацией.   -  person hyde    schedule 12.02.2013
comment
Это работало как для клиента, так и для брокера ActiveMQ. Спасибо за совет.   -  person Vincent    schedule 13.02.2013


Ответы (2)


API JMS определяет интерфейс Java и архитектуру обмена сообщениями, он не определяет какой-либо конкретный проводной протокол, он может быть почтовым голубем, в памяти или в любом из распространенных форматов (STOMP, OpenWire, AMQP, MQTT).

Почему вы не можете вместо этого использовать библиотеки Open MQ в своем клиенте? Так устроена JMS. Вам нужно только переключиться с файлов .jar и изменить файл ConnectionFactory.

Я не вижу причин переключаться на ActiveMQ только ради использования JMS-клиента ActiveMQ, поскольку он должен быть почти таким же, как и клиент Open MQ. Однако есть и другие причины для переключения, такие как различные функции на стороне сервера и многое другое, но вы не упомянули об этом.

Тем не менее, существует компонент моста, который может предоставить доступ к любому серверу JMS по протоколу STOMP (который поддерживает ActiveMQ).

Он называется Stomp Connect, и есть несколько довольно старые инструкции на странице OpenMQ, как его использовать.

Оттуда вы сможете подключиться к фабрике ActiveMQConnection, указав STOMP. Но я действительно не пробовал эту комбинацию сам.

person Petter Nordlander    schedule 13.02.2013

Клиент AcitveMQ JMS может общаться только с серверами ActiveMQ. Используйте клиент OpenMQ JMS для связи с серверами OpenMQ.

person Hiram Chirino    schedule 12.02.2013
comment
В ПОРЯДКЕ. Почему разные провайдеры JMS не могут общаться друг с другом? - person Vincent; 13.02.2013
comment
Поскольку JMS не является спецификацией сетевого уровня, провайдеры могут использовать свои собственные протоколы, и большинство из них являются проприетарными. - person Tim Bish; 13.02.2013