JMS-发送对象消息

JMS-发送对象消息,jms,Jms,我想在jms中发送对象消息并获取运行时异常。 请给我建议可能的解决办法 JMS代码: ObjectMessage objMessage = session.createObjectMessage(); MessageData data = new MessageData(); objMessage.setObject(data); sender.send(objMessage); 控制台上发现异常: log4j:WARN No appen

我想在jms中发送对象消息并获取运行时异常。 请给我建议可能的解决办法

JMS代码:

ObjectMessage objMessage = session.createObjectMessage();
        MessageData data = new MessageData();
        objMessage.setObject(data);
        sender.send(objMessage);
控制台上发现异常:

    log4j:WARN No appenders could be found for logger         org.jboss.remoting.transport.socket.MicroSocketClientInvoker).
    log4j:WARN Please initialize the log4j system properly.
    java.lang.RuntimeException: com.test.SendJMSMessage
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at org.jboss.messaging.util.StreamUtils.writeObject(StreamUtils.java:249)
at org.jboss.jms.message.JBossObjectMessage.doWriteObject(JBossObjectMessage.java:141)
at org.jboss.messaging.core.impl.message.MessageSupport.getPayloadAsByteArray(MessageSupport.java:216)
at org.jboss.jms.message.JBossObjectMessage.setObject(JBossObjectMessage.java:118)
at org.jboss.jms.message.ObjectMessageProxy.setObject(ObjectMessageProxy.java:59)
at com.test.SendJMSMessage.example(SendJMSMessage.java:36)
at com.test.SendJMSMessage.main(SendJMSMessage.java:130)
在创建了新的MessageData类而不是创建了MessageData子类之后,当我运行代码时,我得到了如下异常:

18:26:08,297 ERROR [JmsGatewayListener] Problems invoking method <process>
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.soa.esb.listeners.gateway.JmsGatewayListener.doRun(JmsGatewayListener.java:161)
at org.jboss.soa.esb.listeners.lifecycle.AbstractThreadedManagedLifecycle.run(AbstractThreadedManagedLifecycle.java:115)
at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.RuntimeException: No ClassLoaders found for: com.test.MessageData
at org.jboss.mx.loading.LoadMgr3.beginLoadTask(LoadMgr3.java:306)
at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:521)
at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:415)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at org.jboss.messaging.util.ObjectInputStreamWithClassLoader.resolveClass(ObjectInputStreamWithClassLoader.java:78)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at org.jboss.messaging.util.StreamUtils.readObject(StreamUtils.java:154)
at org.jboss.messaging.core.impl.message.MessageSupport.readPayload(MessageSupport.java:405)
at org.jboss.jms.message.JBossObjectMessage.getObject(JBossObjectMessage.java:126)
at org.jboss.jms.message.ObjectMessageProxy.getObject(ObjectMessageProxy.java:68)
at org.jboss.soa.esb.listeners.gateway.PackageJmsMessageContents.setESBMessageBody(PackageJmsMessageContents.java:165)
at org.jboss.soa.esb.listeners.gateway.PackageJmsMessageContents.process(PackageJmsMessageContents.java:89)
... 7 more
18:26:08297错误[JmsGatewayListener]调用方法时出现问题
java.lang.reflect.InvocationTargetException
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.jboss.soa.esb.listeners.gateway.jmsgatewaystener.doRun(jmsgatewaystener.java:161)
位于org.jboss.soa.esb.listeners.lifecycle.AbstractThreadedManagedLifecycle.run(AbstractThreadedManagedLifecycle.java:115)
位于java.lang.Thread.run(未知源)
原因:java.lang.RuntimeException:未找到com.test.MessageData的类加载器
在org.jboss.mx.loading.LoadMgr3.beginLoadTask(LoadMgr3.java:306)上
在org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:521)
在org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:415)上
位于java.lang.ClassLoader.loadClass(未知源)
位于java.lang.ClassLoader.loadClassInternal(未知源)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(未知源)
位于java.io.ObjectInputStream.resolveClass(未知源)
位于org.jboss.messaging.util.ObjectInputStreamWithClassLoader.resolveClass(ObjectInputStreamWithClassLoader.java:78)
位于java.io.ObjectInputStream.readNonProxyDesc(未知源)
位于java.io.ObjectInputStream.readClassDesc(未知源)
位于java.io.ObjectInputStream.ReadOrderinaryObject(未知源)
位于java.io.ObjectInputStream.readObject0(未知源)
位于java.io.ObjectInputStream.readObject(未知源)
位于org.jboss.messaging.util.StreamUtils.readObject(StreamUtils.java:154)
位于org.jboss.messaging.core.impl.message.MessageSupport.readPayload(MessageSupport.java:405)
位于org.jboss.jms.message.JBossObjectMessage.getObject(JBossObjectMessage.java:126)
在org.jboss.jms.message.ObjectMessageProxy.getObject上(ObjectMessageProxy.java:68)
位于org.jboss.soa.esb.listeners.gateway.packagejmsessagecontents.setESBMessageBody(packagejmsessagecontents.java:165)
位于org.jboss.soa.esb.listeners.gateway.packagejmsessagecontents.process(packagejmsessagecontents.java:89)
... 还有7个
在这里,我试图向esb服务器代码发送一条对象消息。
请对上述控制台窗口提出任何建议?

您的类MessageData需要实现java.io.Serializable。这可能是问题所在吗?应该有一个额外的“原因”异常堆栈跟踪。

异常位于“另一端”:

因此,您确实发送了消息,但无法在另一端对其进行反序列化。为什么?因为“另一端”的类路径中没有
MessageData
的类定义。如果是不同的应用程序,则需要将
MessageData
提取到一个公共jar中,并将其包含在两个应用程序中


序列化不是魔法;序列化方和反序列化方都必须具有对同一类定义(.class file)的访问权限,并且它们的版本必须相同,或者至少兼容。

MessageData类实现了java.io.serializable接口,但仍然存在相同的问题。如何确保同一对象不会创建为两个不同的对象消息…这与问题有何关系?您考虑的是什么情况?我正在查询数据库并通过队列将数据作为对象发送到客户端。我需要确保在任何时候都不会将相同的行/对象返回给用户。
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at org.jboss.messaging.util.ObjectInputStreamWithClassLoader.resolveClass(ObjectInputStreamWithClassLoader.java:78)