我将 OpenJMS 与 NetBeans 6.9.1 一起使用。我在其中创建了一个简单的 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)
在我看来,这个客户端代码向 openJMS 服务器发送了一个“org.exolab.jms.server.net.RemoteNamingProvider__Proxy”类的对象。该类位于代码和 openJMS 服务器使用的同一 JAR 文件中。然而,出于某种奇怪的原因,编译该类在服务器端具有不同的序列号。
我在网上搜索了线索。如果我们使用不同的编译器,一个类的序列号可能会不同。我不知道 openJMS 服务器是否使用我计算机上安装的 Java SE 编译器以外的编译器。但是,我确信 NetBeans 正在使用它(Java SE 编译器)来编译这个客户端代码。
其次,我不能显式地将序列 ID 分配给导致异常的类,因为它在 openJMS 库中,而不是我自己的类中。
任何帮助将不胜感激。
——哈代图拉