Как подключить производителя ActiveMQ к JM-брокеру OpenMQ
Я пытаюсь отправить текстовые сообщения от клиента с тяжелой версией (используя библиотеку 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 Framework
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. Но я на самом деле не пробовал эту комбинацию сам.
Клиент AcitveMQ JMS может общаться только с серверами ActiveMQ. Используйте JMS-клиент OpenMQ для связи с серверами OpenMQ.