NetBeans 6.9.1 で OpenJMS を使用しています。簡単な NetBeans プラットフォーム アプリケーションとその中にモジュールを作成しました。startup.bat ファイルを使用して openjms-0.7.7-beta を開始しました。モジュール内で次のコードが実行され、トピックに関するメッセージのリッスンが開始されます。
factoryName = "ConnectionFactory";
String topicName = "topic1";
String initialContext = "org.exolab.jms.jndi.InitialContextFactory";
String providerURL = "tcp://localhost:3035/";
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY, initialContext);
properties.put(Context.PROVIDER_URL, providerURL);
context = new InitialContext(properties);
factory = (ConnectionFactory) context.lookup(factoryName);
dest = (Destination) context.lookup(topicName);
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
receiver = session.createConsumer(dest);
receiver.setMessageListener(this);
connection.start();
コードは単純な Java アプリケーションでは完全に機能しましたが、この構成では行で失敗します。
context = new InitialContext(properties);
ここに例外があります
javax.naming.CommunicationException: Failed to lookup JNDI provider for URL: tcp://localhost:3035/ [Root exception is java.rmi.UnmarshalException: Failed to unmarshal response; nested exception is:
java.io.InvalidClassException: org.exolab.jms.server.net.RemoteNamingProvider__Proxy; local class incompatible: stream classdesc serialVersionUID = 8042785765194780386, local class serialVersionUID = 3384686210958076383]
at org.exolab.jms.jndi.InitialContextFactory.getInitialContext(InitialContextFactory.java:160)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:197)
このクライアント コードは、「org.exolab.jms.server.net.RemoteNamingProvider__Proxy」クラスのオブジェクトを openJMS サーバーに送信しているように見えます。このクラスは、コードと openJMS サーバーの両方で使用される同じ JAR ファイルにあります。ただし、何らかの奇妙な理由で、コンパイラーはサーバー側でクラスのシリアル ID が異なります。
インターネットで手がかりを探しました。異なるコンパイラを使用すると、クラスのシリアル ID が異なる場合があります。openJMS サーバーが、コンピューターにインストールされている Java SE コンパイラー以外のコンパイラーを使用しているかどうかわかりません。ただし、NetBeans がこのクライアント コードのコンパイルにそれ (Java SE コンパイラ) を使用していることは確かです。
第 2 に、シリアル ID を例外の原因となるクラスに明示的に割り当てることはできません。これは、自分のクラスではなく openJMS ライブラリにあるためです。
どんな助けでも大歓迎です。
-Hadaytullah