2011-11-28 155 views
3

我想在jms中發送對象消息並獲取運行時異常。 請建議我可能的解決方案。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 

這裏我試圖發送一個對象消息到esb服務器代碼。 如上所述,在控制檯窗口上的任何建議?

+0

你解決了嗎? –

回答

4

您的類MessageData需要實現java.io.Serializable。這可能是問題嗎?應該有一個額外的「原因」異常堆棧跟蹤。

+0

MessageData類實現java.io.serializable接口,但仍然是相同的問題。 –

+2

@SSingh爲什麼這個答案接受呢? – eis

6

唯一的例外是在「另一面」:

at java.io.ObjectInputStream.resolveClass(Unknown Source) 
at org.jboss.messaging.util.ObjectInputStreamWithClassLoader.resolveClass(ObjectInputStreamWithClassLoader.java:78) 

所以你沒有發送郵件,但無法在另一端,以反序列化。爲什麼?因爲「另一方」在其類路徑中沒有類別定義MessageData。如果它是一個不同的應用程序,則需要將MessageData提取到一個常用的jar中,並將它包含在這兩個應用程序中。

序列化並不神奇;序列化和反序列化方都必須能夠訪問相同的類定義(.class文件),並且它們的版本必須相同或至少兼容。

+0

如何確保不會將相同的對象創建爲兩個不同的對象消息... –

+0

這與問題有什麼關係?你有什麼情況? – MaDa

+0

我正在查詢數據庫並通過隊列將數據作爲對象發送給客戶端。我需要確保在任何時間點都不會將相同的行/對象返回給用戶。 –