3

我们使用 Java 1.4 在 WebSphere 6.01 中运行 portlet。我们希望将 JMS 消息发送到运行 Java 5(或者可能是 6,但肯定比 1.4 更新)的 JBoss 5 队列。尝试使用 JNDI 连接是行不通的,因为我们必须在 portlet 的类路径中包含 JBoss 客户端 jar,它们是 Java 1.5。因此,当我尝试创建 InitialContext 时,我得到一个不受支持的主要/次要错误。

我们可以不使用 JNDI 直接连接到 JBoss 吗?或者有什么方法可以解决我想不出的这个问题?

4

6 回答 6

2

即使您能够在不通过 JBoss 的 JNDI 的情况下连接到 JMS,您仍然需要包含 JBoss 客户端 JAR 才能使用 JMS。JNDI 和 JMS 都是 API,您需要服务器实现该客户端 API 才能与服务器通信。

于 2009-08-07T15:28:44.687 回答
2

如果只是您的 JNDI 类需要 Java 5 而不是 JBoss 类,那么您可以这样做。但是您必须设置对象的所有属性,这是特定于提供者的。WebSphere MQ JMS 示例展示了如何使用 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 类 prereq Java 1.5,那么您需要运行 Java 1.5 或更高版本。

于 2010-05-24T21:57:50.743 回答
1

根据 JBoss 版本,您可以直接实例化所有 JMS 对象。

一个特定版本:见http://www.jboss.org/file-access/default/members/jbossmessaging/freezone/docs/usermanual-2.0.0.beta1/html/using-jms.html

(第 5.5 节。不使用 JNDI 直接实例化 JMS 资源)

于 2010-03-16T02:26:45.940 回答
0

事实上,使用 JNDI 是一种独立于 JMS 提供者的方式,因为您可以轻松更改它。但是,如果您对大多数提供商提供的设施来创建连接工厂和目的地没有任何问题

于 2010-05-24T21:42:13.543 回答
0

我认为 JNDI 是您可以创建 JMS 连接工厂和目标(队列或主题)的唯一方法,这些是您的通信方式。

于 2009-08-07T18:26:30.927 回答
0

听起来问题不在于 JNDI,而在于环境之间的类名冲突。

当您尝试实例化 JBOSS 客户端类时,您可以尝试自己进行类加载。这样,您就可以从加载 Portlet 的类加载器中获得一个单独的类加载器。只需确保您了解是否需要Parent-first 或 Parent-last 行为。该页面上还有调试类加载,它可以向您展示如何为类加载器设置类路径,以便您可以隔离 JBOSS 库并避免类名冲突。它是了解甚至高级类加载问题的好资源。

于 2010-05-24T22:16:40.627 回答