P.S. ActiveMQ 5.3.2, Camel 2.4.0. I'm running both embedded (i.e.,
starting up in Java code), and no custom class loaders (no osgi, spring,
or anything fancy). As stated before, the classes (proxy, non-proxy,
interfaces) are all in the same (global) classpath.
Jim
On 11/9/2010 5:15 PM, Jim Newsham wrote:
Hi,
I just ran into a class loading exception when trying to serialize a
proxy instance (an instance of java.lang.reflect.Proxy). I have no
problems serializing our non-proxy objects. My proxy handler class is
serializable (as required) and located in the same class path as the
non-proxy classes. I have found that if I construct my proxy using
jdk interfaces only (i.e., java.util.Collection), then it works, but
if I use one of our own interfaces, ActiveMQ fails to load it as follows:
Caused by: java.lang.IllegalArgumentException: interface
com.referentia.liveaction.common.core.camel.clientstream.StreamIdProvider
is not visible from class loader
at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)
at
org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveProxyClass(ClassLoadingAwareObjectInputStream.java:48)
... 34 more
Here's the entire stack trace:
2010-11-09 17:02:37,660 [DefaultMessageListenerContainer-1] WARN
org.springframework.jms.listener.DefaultMessageListenerContainer -
Execution of JMS message listener failed
org.apache.camel.RuntimeCamelException: Failed to extract body due to:
javax.jms.JMSException: Failed to build body from content.
Serializable class not available to broker. Reason:
java.lang.ClassNotFoundException. Message: ActiveMQObjectMessage
{commandId = 19, responseRequired = true, messageId =
ID:rsi-eng-newsham-56811-1289358131963-0:2:3:1:3, originalDestination
= null, originalTransactionId = null, producerId =
ID:rsi-eng-newsham-56811-1289358131963-0:2:3:1, destination =
queue://ServiceExport, transactionId = null, expiration =
1289358177656, timestamp = 1289358157656, arrival = 0, brokerInTime =
1289358157656, brokerOutTime = 1289358157658, correlationId =
215512f0-0d7e-4f3c-8cc2-5e459d59b582, replyTo =
temp-queue://ID:rsi-eng-newsham-56811-1289358131963-0:2:1, persistent
= true, type = null, priority = 4, groupID = null, groupSequence = 0,
targetConsumerId = null, compressed = false, userID = null, content =
org.apache.activemq.util.byteseque...@115e628, marshalledProperties =
org.apache.activemq.util.byteseque...@b977bc, dataStructure = null,
redeliveryCounter = 0, size = 1860, properties =
{sessionId=04fd4b1b-0a01-40f7-8bf8-fda514c773e9}, readOnlyProperties =
true, readOnlyBody = true, droppable = false}
at
org.apache.camel.component.jms.JmsBinding.extractBodyFromJms(JmsBinding.java:158)
at
org.apache.camel.component.jms.JmsMessage.createBody(JmsMessage.java:183)
at
org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:42)
at
org.apache.camel.impl.DefaultUnitOfWork.<init>(DefaultUnitOfWork.java:65)
at
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:90)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:68)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:91)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:85)
at
org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:85)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:543)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:482)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:451)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:323)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:261)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:982)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:974)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:876)
at java.lang.Thread.run(Thread.java:662)
Caused by: javax.jms.JMSException: Failed to build body from content.
Serializable class not available to broker. Reason:
java.lang.ClassNotFoundException
at
org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:35)
at
org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:179)
at
org.apache.camel.component.jms.JmsBinding.extractBodyFromJms(JmsBinding.java:125)
... 20 more
Caused by: java.lang.ClassNotFoundException
at
org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveProxyClass(ClassLoadingAwareObjectInputStream.java:50)
at
java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)
at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1666)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1322)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at
org.apache.camel.component.bean.BeanInvocation.readExternal(BeanInvocation.java:105)
at
java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1791)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at
org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:177)
... 21 more
Caused by: java.lang.IllegalArgumentException: interface
com.referentia.liveaction.common.core.camel.clientstream.StreamIdProvider
is not visible from class loader
at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)
at
org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveProxyClass(ClassLoadingAwareObjectInputStream.java:48)
... 34 more
Thanks,
Jim