尝试远程连接到 Websphere 上的 JMS 队列时出现 sun/io/MalformedInputException

Posted

技术标签:

【中文标题】尝试远程连接到 Websphere 上的 JMS 队列时出现 sun/io/MalformedInputException【英文标题】:sun/io/MalformedInputException when trying to remotely connect to JMS queue on websphere 【发布时间】:2015-03-10 06:45:02 【问题描述】:

我知道有人在其他地方询问了一个(非常)similar question,但没有答案,所以我在这里发帖,希望新帖子能引发一些有价值的回复。

我正在尝试创建一个独立的应用程序,它将询问在 websphere 上运行的 JMS 队列。队列正在运行,因为本地应用程序能够与之通信,并且有消息在那里等着我。

我正在使用 Netbeans 并且正在使用 JDK1.8。 此外,我在库中添加了以下 jar 文件:

javax.jms-1.1.jar
com.ibm.ws.orb_8.5.0.jar
com.ibm.ws.ejb.thinclient_8.5.0.jar  

后两个是从 websphere 安装中复制的。

这里是初始代码的摘要(它实际上是在一个类中构建的,其中包含上下文和工厂位的方法,因此已对其进行了修改以在此处显示):

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL, corbaloc:iiop:192.168.254.202:2809);
try
InitialContext jndiContext = new InitialContext(env);
catch(NamingException e)
System.out.println("ERROR: Could not create JNDI context: " + System.lineSeparator() + e.toString());
System.exit(1);

ConnectionFactory connectionFactory= (ConnectionFactory) this.jndiContext.lookup(factory);
String outFactory       = "jndi/OUTConnectionFactory";
try    
connectionFactory = (ConnectionFactory) jndiContext.lookup(outFactory);
catch(Exception e)
System.out.println("ERROR: Could not create factory connection:");
System.out.println(e.toString());
System.exit(2); 

此时(connectionFactory = ...)它会失败而不会触发catch

Exception in thread "P=598328:O=0:CT" java.lang.NoClassDefFoundError: sun/io/MalformedInputException
    at com.ibm.rmi.iiop.CDRReader.getTcsCConverter(CDRReader.java:398)
    at com.ibm.rmi.iiop.CDRReader.readStringOrIndirection(CDRReader.java:479)
    at com.ibm.rmi.iiop.CDRReader.read_string(CDRReader.java:465)
    at com.ibm.rmi.IOR.read(IOR.java:335)
    at com.ibm.rmi.iiop.Connection._locate(Connection.java:480)
    at com.ibm.rmi.iiop.Connection.locate(Connection.java:439)
    at com.ibm.rmi.iiop.GIOPImpl.locate(GIOPImpl.java:219)
    at com.ibm.rmi.corba.Corbaloc.locateUsingINS(Corbaloc.java:307)
    at com.ibm.rmi.corba.Corbaloc.resolve(Corbaloc.java:378)
    at com.ibm.rmi.corba.ORB.objectURLToObject(ORB.java:3721)
    at com.ibm.CORBA.iiop.ORB.objectURLToObject(ORB.java:3256)
    at com.ibm.rmi.corba.ORB.string_to_object(ORB.java:3619)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.stringToObject(WsnInitCtxFactory.java:1645)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.getWsnNameService(WsnInitCtxFactory.java:1502)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.getRootContextFromServer(WsnInitCtxFactory.java:1040)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.getRootJndiContext(WsnInitCtxFactory.java:962)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.getInitialContextInternal(WsnInitCtxFactory.java:614)
    at com.ibm.ws.naming.util.WsnInitCtx.getContext(WsnInitCtx.java:128)
    at com.ibm.ws.naming.util.WsnInitCtx.getContextIfNull(WsnInitCtx.java:765)
    at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:164)
    at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:179)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at jmstool2.JmsConn.CreateFactCon(JmsConn.java:103)
    at jmstool2.JmsConn.connect(JmsConn.java:59)
    at jmstool2.Jmstool2.main(Jmstool2.java:21)
Caused by: java.lang.ClassNotFoundException: sun.io.MalformedInputException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 25 more
Java Result: 1

我真的不知道去哪里解决这个错误。是找到正确的 .jar 文件或库,还是这里有更大的问题?我真的是一名 LAMP 开发人员,而这次深入 Java 和 JMS 队列的世界证明是相当令人沮丧的。

非常感谢

【问题讨论】:

其他相关问题是:sun/io/MalformedInputException 丢失或者只是报告错误的类? I am using Netbeans and am using JDK1.8。正如在其他线程中所指出的 - Java 1.8 不支持作为 WebSphere 8.5 的客户端。请使用 Java 1.6 或 1.7。 会尝试然后Gas...对不起,当我第一次看时你没有在那里发布。 我已经迁移到 JDK 1.7 并且该错误已经消失。好的,我有另一个错误(javax.naming.NamingException: Error getting WsnNameService properties [Root exception is org.omg.CORBA.TRANSIENT: initial and forwarded IOR inaccessible )但至少我觉得我可以继续前进。 请在this topic上找到另一种可能的解决方案 【参考方案1】:

sun.io.MalformedInputException 类在 Java 8 中不存在,并且 Java 8 也不支持作为 WebSphere Application Server v 8.5 的客户端。请使用 Java 6 或 7。

【讨论】:

我也有类似的情况——但我真的很想使用 Java 8。距离 @Gas 上次发表评论已经过去一年多了。我想知道事情是否发生了变化,我现在是否可以使用 Java 8。如果有好处,我将在 WebSphere Liberty Profile 中使用 IBM JDK 8 好像有来自 IBM 的补丁 APAR:www-01.ibm.com/support/docview.wss?uid=swg1IX90160

以上是关于尝试远程连接到 Websphere 上的 JMS 队列时出现 sun/io/MalformedInputException的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Websphere 服务器连接到 Weblogic JMS?

证书异常 Websphere 应用程序

将远程 JMS 客户端连接到 GlassFish 3

如何使用给定的 JNDI 名称连接到 Websphere 数据源?

远程 JMS 队列的客户端

将 Apache ServiceMix 连接到 Websphere MQ