JMS без JNDI? - PullRequest
       28

JMS без JNDI?

3 голосов
/ 07 августа 2009

Мы запускаем портлеты в WebSphere 6.01, используя Java 1.4. Мы хотим отправлять сообщения JMS в очередь JBoss 5, работающую на Java 5 (или, возможно, 6, но это, безусловно, новее, чем 1.4). Попытка подключиться с использованием JNDI не работает, так как мы должны включить клиентские jar-файлы JBoss в classpath портлета, и это Java 1.5. Поэтому я получаю неподдерживаемую главную / незначительную ошибку при попытке создать InitialContext.

Можем ли мы подключиться напрямую к JBoss без использования JNDI? Или есть какой-то способ обойти эту проблему, о которой я не могу думать?

Ответы [ 6 ]

2 голосов
/ 25 мая 2010

Если для Java 5 требуются только классы JNDI, а не классы JBoss, то вы можете сделать это. Но вам нужно будет установить все свойства объектов, и это зависит от поставщика. Примеры JMS WebSphere MQ показывают, как это сделать с WMQ, и вам потребуется знать имена свойств и значений для JBoss, чтобы создать эквивалентный код. Вот фрагмент кода из образца WMQ JmsProducer.java:

  JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
  JmsConnectionFactory cf = ff.createConnectionFactory();

  // Set the properties
  cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, host);
  cf.setIntProperty(WMQConstants.WMQ_PORT, port);
  cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel);
  cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
  cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, queueManagerName);

  // Create JMS objects
  connection = cf.createConnection();
  session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  if (isTopic) {
    destination = session.createTopic(destinationName);
  }
  else {
    destination = session.createQueue(destinationName);
  }
  producer = session.createProducer(destination);

С другой стороны, если ваши классы JBoss требуют Java 1.5, вам нужно запустить Java 1.5 или выше.

2 голосов
/ 07 августа 2009

Даже если вы смогли подключиться к JMS без прохождения JNDI JBoss, вам все равно нужно будет включить JAR-клиент JBoss для использования JMS. И JNDI, и JMS являются API-интерфейсами, и вам необходима реализация этого клиентского API-интерфейса на сервере для взаимодействия с сервером.

1 голос
/ 16 марта 2010

В зависимости от версии JBoss вы можете напрямую создавать экземпляры всех объектов JMS.

Одна конкретная версия: см http://www.jboss.org/file-access/default/members/jbossmessaging/freezone/docs/usermanual-2.0.0.beta1/html/using-jms.html

(Раздел 5.5. Непосредственное создание экземпляров JMS-ресурсов без использования JNDI)

0 голосов
/ 25 мая 2010

Похоже, проблема не в JNDI, а в противоречивых именах классов между средами.

Вы можете попытаться выполнить загрузку классов самостоятельно, когда попытаетесь создать экземпляры клиентских классов JBOSS. Таким образом, вы получаете отдельный загрузчик классов от того, который загружал портлет. Просто убедитесь, что вы понимаете, нужно ли вам Parent-first или Parent-last поведение . Также на этой странице отладка загрузки классов , которая может показать вам, как установить Classpath для загрузчика классов, чтобы вы могли изолировать библиотеки JBOSS и избежать конфликтов имен классов. Это хороший ресурс для понимания даже сложных проблем с загрузкой классов .

0 голосов
/ 25 мая 2010

На самом деле использование JNDI - это способ быть независимым от провайдера JMS, потому что вы можете легко его изменить. Но если у вас нет проблем с этим, большинство провайдеров предлагают средства для создания фабрики соединений и пунктов назначения

0 голосов
/ 07 августа 2009

Я думаю, что JNDI - это единственный способ, которым вы можете создавать фабрики соединений JMS и места назначения (очередь или тема), и это ваши средства связи.

...