3

Java 1.4 を使用して WebSphere 6.01 でポートレットを実行しています。JMS メッセージを JBoss 5 キューに送信し、Java 5 (または 6 かもしれませんが、1.4 より新しいことは確かです) を実行したいと考えています。ポートレットのクラスパスに JBoss クライアント jar を含める必要があり、それらは Java 1.5 であるため、JNDI を使用して接続しようとしても機能しません。そのため、InitialContext を作成しようとすると、サポートされていないメジャー/マイナー エラーが発生します。

JNDI を使用せずに JBoss に直接接続できますか? または、私が考えられないこの問題を回避する方法はありますか?

4

6 に答える 6

2

JBoss クラスではなく、Java 5 を前提とする JNDI クラスだけの場合は、これを行うことができます。ただし、オブジェクトのすべてのプロパティを設定する必要があり、それはプロバイダー固有です。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 クラスが Java 1.5 を前提としている場合は、Java 1.5 以降を実行する必要があります。

于 2010-05-24T21:57:50.743 に答える
2

JBoss の JNDI を介さずに JMS に接続できたとしても、JMS を使用するには JBoss クライアント JAR を含める必要があります。JNDI と JMS はどちらも API であり、サーバーと通信するには、そのクライアント API のサーバーの実装が必要です。

于 2009-08-07T15:28:44.687 に答える
1

JBoss のバージョンによっては、すべての JMS オブジェクトを直接インスタンス化できます。

1 つの特定のバージョン: 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 ではなく、環境間で競合するクラス名にあるようです。

JBOSS クライアント クラスをインスタンス化しようとするときに、自分でクラスローディングを実行してみることができます。そうすれば、ポートレットをロードしたクラスローダーとは別のクラスローダーを取得できます。Parent-first または Parent-last の動作が必要かどうかを理解していることを確認してください。また、そのページにはクラスローディングのデバッグがあり、JBOSS ライブラリを分離してクラス名の衝突を回避できるように、クラスローダーのクラスパスを設定する方法を示しています。これは、高度なクラスローディングの問題を理解するための優れたリソースです。

于 2010-05-24T22:16:40.627 に答える
0

実際、JNDI を使用することは、簡単に変更できるため、JMS プロバイダーに依存しない方法です。しかし、ほとんどのプロバイダーが接続ファクトリーと宛先を作成する機能を提供していることに問題がない場合は、

于 2010-05-24T21:42:13.543 に答える
0

JNDI は、JMS 接続ファクトリと宛先 (キューまたはトピック) を作成できる唯一の方法であり、これらが通信手段であると思います。

于 2009-08-07T18:26:30.927 に答える