У меня есть два кластерных управляемых сервера, работающих на Weblogic, и отдельные JMS server1 and server2 работают на каждом управляемом сервере. Проблема в файле свойств приложения, мы только жестко запрограммировали и передали приложению JMS server1 JNDI name. Таким образом, оба приложения, работающие на каждом узле, фактически используют только один фиксированный сервер JMS, который не является полностью распределенным и кластеризованным. Если сервер JMS 1 не работает, все приложение будет остановлено.

Мой вопрос в том, как позволить приложению динамически находить сервер JMS в приведенном выше сенарио? Не могли бы вы указать мне направление? Спасибо!

3
user3305262 10 Мар 2014 в 13:46

3 ответа

Лучший ответ

Он находится в документации Weblogic по адресу: http: // docs. oracle.com/cd/E14571_01/web.1111/e13738/best_practice.htm#CACDDFJD

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

Например

t3://hostA:7001,hostB:7001
4
Display Name is missing 11 Мар 2014 в 00:59
Могу я просто уточнить, что с этим списком серверов, разделенных запятыми, код приложения вообще не нужно менять?
 – 
user3305262
11 Мар 2014 в 02:20
Правильно - протокол t3/t3s должен справиться с этим за вас.
 – 
Display Name is missing
11 Мар 2014 в 02:23
Я изменил файл свойств автономного веб-приложения на jms.jndi.provider.url=t3://hostA:31122,hostA:31124. когда оба хоста A и B работают, приложение работает нормально, но когда я выключил хост A, приложение получило исключение. Вызвано: org.omg.CORBA.COMM_FAILURE: vmcid: дополнительный код SUN: 203 завершено: нет на com .sun.corba.se.impl.logging.ORBUtilSystemException.writeErrorSend(ORBUtilSystemException.java:2259), я ничего не пропустил?
 – 
user3305262
11 Мар 2014 в 08:15
Что касается аварийного переключения, оно все равно должно происходить автоматически. Ссылка: docs.oracle.com/cd/E13222_01/wls/ docs92/jms/recover.html Что касается новой ошибки, вы видели следующее: ohnoes-nz.blogspot.com/2011/12/… stackoverflow.com/questions/11591354/…
 – 
Display Name is missing
11 Мар 2014 в 19:14
Один последний комментарий, новый вопрос для исключения, которое у вас есть, лучше, чем продолжать комментировать здесь (и совершенно нормально задавать новый вопрос)
 – 
Display Name is missing
11 Мар 2014 в 19:15

При использовании такого свойства, как jms.jndi.provider.url = t3: // hostA: 31122, hostA: 31124
он сообщает wls подключиться к hostA: 31122 или hostA: 31124. Обратите внимание, что ваш JMS-клиент в любой момент времени подключен только к одному хосту. когда вы завершаете работу hostA, соединение между JMS-клиентом и сервером резко прерывается, что приводит к возникновению исключения, ваш код должен будет аккуратно обработать это исключение и периодически пытаться подключиться к WLS снова, чтобы убедиться, что он соединяется с hostB.

WLS внутренне выполняет циклический перебор запроса, если работает более 1 экземпляра клиента JMS.

При использовании MDB в качестве клиента JMS и развертывании его в кластере и использовании такого URL-адреса 1 экземпляр mdb будет подключаться к одному хосту, а другой экземпляр будет подключаться к другому хосту. MDB также имеет возможность периодически повторно подключаться к месту назначения JMS.

Простым решением вашей проблемы может быть 1) Установите jms.jndi.provider.url = t3: // hostA: 31122, hostA: 31124 2) Иметь 2 экземпляра клиентского кода JMS, поэтому один будет подключаться к порту 31122 и другие на 31124 3) Установите задержку пересылки в очереди JMS, чтобы сообщение не оставалось в очереди, не потребляясь надолго, и перенаправлялось в другую очередь, у которой есть активный потребитель.

1
SridharS 11 Мар 2014 в 13:46
Извините, я допустил ошибку в своем последнем комментарии (изменил неправильный файл свойств). На самом деле, когда я изменил jms.jndi.provider.url=t3://hostA:31122 на jms.jndi.provider.url=t3://hostA:31122,hostA:31124, приложение никогда не работало и получило «org.omg. CORBA.COMM_FAILURE: vmcid: вспомогательный код SUN: 203 выполнено: нет". Я увидел wlclient.jar в пути к классам, должен ли я вместо этого использовать wlfullclient.jar? Мы не используем единую распределенную очередь, работает ли задержка вперед в обычной очереди? Благодарность!
 – 
user3305262
11 Мар 2014 в 14:18
Что делать, если два клиента подключаются к одному и тому же серверу ex. хостА? Если есть jms.jndi.provider.url=t3://hostA:31122,hostA:31124, он не должен заботиться о сервере. Он должен обнаруживать сообщения от этих двух узлов, а не только от узла, к которому подключен клиент.
 – 
Mateusz Gebroski
4 Ноя 2020 в 12:46

Я обновляю здесь свой прогресс вместо того, чтобы добавлять комментарии. Я протестировал использование автономного клиента JMS, изменив файл свойств с t3://hostA:7001 на t3://hostA:7001,hostB:7001 для поставщика JMS. Переход на другой ресурс автоматически обрабатывается WLS. Код не меняется. Исключение, которое я получил выше, вызвано использованием wlclient.jar, он работает после изменения на wlfullclient.jar.

Я следил за этим ссылка для создания wlfullclient.jar.

Спасибо всем!

1
user3305262 12 Мар 2014 в 05:00