【问题标题】:JMS without JNDI?没有 JNDI 的 JMS?
【发布时间】:2010-05-25 06:16:40
【问题描述】:

我们使用 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 吗?或者有什么办法可以解决我想不出的这个问题?

【问题讨论】:

    标签: jboss jms websphere jndi portlet


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果只是您的 JNDI 类需要 Java 5 而不是 JBoss 类,那么您可以这样做。但是您必须设置对象的所有属性,这是特定于提供者的。 WebSphere MQ JMS 示例展示了如何使用 WMQ 执行此操作,您需要知道 JBoss 的属性和值名称才能生成等效代码。这是来自 WMQ JmsProducer.java 示例的代码 sn-p:

        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 或更高版本。

      【讨论】:

        【解决方案3】:

        根据 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 资源)

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

                猜你喜欢
                • 2015-06-15
                • 1970-01-01
                • 1970-01-01
                • 2013-01-30
                • 1970-01-01
                • 2011-08-10
                • 2018-09-22
                • 2014-02-05
                • 1970-01-01
                相关资源
                最近更新 更多