2011-11-28 2 views
3

jms에서 개체 메시지를 보내고 런타임 예외가 발생합니다. 가능한 해결책을 제안하십시오.JMS - 개체 메시지 보내기

JMS 코드 :

ObjectMessage objMessage = session.createObjectMessage(); 
     MessageData data = new MessageData(); 
     objMessage.setObject(data); 
     sender.send(objMessage); 

예외 콘솔에서 발견 서브 클래스 MessageData을 만드는 대신에 새로운 MessageData 클래스를 생성 한 후

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) 

내가 코드를 실행할 때, 나는 다음과 같이 예외를 가지고 :

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

나는 db를 쿼리하고 큐를 통해 클라이언트에 데이터를 객체로 전송하고있다. 언제든지 같은 행/객체가 사용자에게 반환되지 않도록해야한다. –