activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Scott Parkerson (JIRA)" <j...@apache.org>
Subject [jira] Commented: (AMQ-2392) Attempting to deserialize user-created objects doesn't work when ActiveMQ is deployed in an OSGi container (e.g. ServiceMix 4)
Date Mon, 14 Sep 2009 19:51:12 GMT

    [ https://issues.apache.org/activemq/browse/AMQ-2392?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=54247#action_54247
] 

Scott Parkerson commented on AMQ-2392:
--------------------------------------

Ok, it looks like that NPE was in my code. I ran the code under the debugger and verified
that the message was being unmarshalled into the object as expected! :D

Closing this as resolved! And opening a docs bug on Camel.

> Attempting to deserialize user-created objects doesn't work when ActiveMQ is deployed
in an OSGi container (e.g. ServiceMix 4)
> ------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: AMQ-2392
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2392
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.3.0
>         Environment: Apache ServiceMix 4 (FUSE ESB 4.1.0.2)
> Apache ActiveMQ 5.3.0.3 (embedded in FUSE ESB)
> Apache Camel 1.6.1 (embedded in FUSE ESB)
>            Reporter: Scott Parkerson
>
> I am attempting to use the POJO sending and producing patterns as described. Here is
my setup:
> In one class (a CXF-based RESTful webservice), I have the following set
> up:
> {noformat}
>     // OutboundFooRequestHandler is an interface (see below)
>     @Produce(uri="activemq:queue:outbound_foo_req")
>     private OutboundFooRequestHandler   outboundFooRequestHandler;
>     @POST
>     @Path("/sendfoo")
>     public Response sendFoo(OutboundFooRequest sendFooRequest)
>     {        
>         // (a bunch of web-specific code deleted)
>         // send this sendFooReqest object on the queue    
>         outboundFooRequestHandler.handle(sendFooRequest);
>        
>         // Return HTTP response 202 Accepted
>         return Response.status(202).build();
>     }
> {noformat}
> The interface that is annotated with {{@Produce}} is shown below:
> {noformat}
> @InOnly
> public interface OutboundFooRequestHandler
> {
>     public void handle(OutboundFooRequest outboundFooRequest);    
> }
> {noformat}
> Here is the implementation of the interface:
> {noformat}
>     public class OutboundFooRequestHandlerImpl implements
>         OutboundFooRequestHandler, InitializingBean, DisposableBean
>     {
>     private static final Logger logger =
>         LoggerFactory.getLogger(OutboundFooRequestHandlerImpl.class);
>     @Override
>     @Consume(uri="activemq:queue:outbound_foo_req")
>     public void handle(@Body OutboundFooRequest outboundFooRequest)
>     {
>         logger.debug("got it");
>        
>         // TODO: actually *do* something
>     }
> {noformat}
> The producer's {{bundle-context.xml}} looks like this:
> {noformat}
>     <camelContext
>           xmlns="http://activemq.apache.org/camel/schema/spring" />
>    
>     <bean name="activemq"
>           class="org.apache.camel.component.jms.JmsComponent">
>         <property name="connectionFactory">
>             <bean class="org.apache.activemq.ActiveMQConnectionFactory">
>                 <property name="brokerURL" value="vm://default" />
>             </bean>
>         </property>
>     </bean>
> {noformat}
> And the consumer's {{bundle-context.xml}} looks the same, except I'm instantiating my
Impl classes.
> When I attempt to send a message through the system, the producer produces a {{BeanInvocation}}
object wrapping the {{SendFooRequest}} object.  However, the consumer thread barfs with this
stacktrace:
> {noformat}
> 4:20:24,843 | WARN  | nerContainer-195 | DefaultMessageListenerContainer  | AbstractMessageListenerContainer
 646 | 
> Execution of JMS message listener failed
> org.apache.camel.RuntimeCamelException: org.apache.camel.component.jms.RuntimeJmsException:

> 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: org.apache.camel.component.bean.BeanInvocation.

> Message: ActiveMQObjectMessage {commandId = 5, responseRequired = true, messageId = ID:xyzzy.ateb.com-55483-1252952224263-2:5:1:1:1,

> originalDestination = null, originalTransactionId = null, producerId = ID:xyzzy.ateb.com-55483-1252952224263-2:5:1:1,

> destination = queue://outbound_sms_req, transactionId = null, expiration = 0, timestamp
= 1252952424801, arrival = 0, 
> brokerInTime = 1252952424802, brokerOutTime = 1252952424822, correlationId = null, replyTo
= null, persistent = true, 
> type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null,
compressed = false, userID = null, 
> content = org.apache.activemq.util.ByteSequence@141bf9f, marshalledProperties = null,
dataStructure = null, 
> redeliveryCounter = 0, size = 1718, properties = null, readOnlyProperties = true, readOnlyBody
= true, droppable = false}
>         at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:850)
>         at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:95)
>         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.run(DefaultMessageListenerContainer.java:881)
>         at java.lang.Thread.run(Thread.java:636)
> Caused by: org.apache.camel.component.jms.RuntimeJmsException: 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: 
> org.apache.camel.component.bean.BeanInvocation. Message: ActiveMQObjectMessage {commandId
= 5, 
> responseRequired = true, messageId = ID:xyzzy.ateb.com-55483-1252952224263-2:5:1:1:1,
originalDestination = null, 
> originalTransactionId = null, producerId = ID:xyzzy.ateb.com-55483-1252952224263-2:5:1:1,
destination = queue://outbound_sms_req,
>  transactionId = null, expiration = 0, timestamp = 1252952424801, arrival = 0, brokerInTime
= 1252952424802, brokerOutTime = 1252952424822,
>  correlationId = null, replyTo = null, persistent = true, type = null, priority = 4,
groupID = null, groupSequence = 0, targetConsumerId = null, 
> compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@141bf9f,
marshalledProperties = null, 
> dataStructure = null, redeliveryCounter = 0, size = 1718, properties = null, readOnlyProperties
= true, readOnlyBody = true, droppable = false}
>         at org.apache.camel.component.jms.JmsBinding.extractBodyFromJms(JmsBinding.java:105)
>         at org.apache.camel.component.jms.JmsMessage.createBody(JmsMessage.java:168)
>         at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:45)
>         at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:52)
>         at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:90)
>         at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:72)
>         ... 8 more
> Caused by: javax.jms.JMSException: Failed to build body from content. Serializable class
not available to broker. Reason: java.lang.ClassNotFoundException: org.apache.camel.component.bean.BeanInvocation
>         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:91)
>         ... 13 more
> Caused by: java.lang.ClassNotFoundException: org.apache.camel.component.bean.BeanInvocation
>         at org.apache.felix.framework.searchpolicy.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:558)
>         at org.apache.felix.framework.searchpolicy.ModuleImpl.access$100(ModuleImpl.java:59)
>         at org.apache.felix.framework.searchpolicy.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1427)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
>         at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
>         at java.lang.Class.forName0(Native Method)
>         at java.lang.Class.forName(Class.java:264)
>         at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.load(ClassLoadingAwareObjectInputStream.java:63)
>         at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:37)
>         at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1592)
>         at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1513)
>         at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749)
>         at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
>         at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
>         at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:177)
>         ... 14 more
> {noformat}
> A couple of relevant conversations on IRC. First, from {{#camel}}:
> {quote}
> <smerp> I don't suppose anyone would know what I need to do to the ActiveMQ broker
to pass BeanInvocation messages?
> <-- mr_smith has quit (Ping timeout)
> <smerp> Using @Consume, I'm getting 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:
>  org.apache.camel.component.bean.BeanInvocation
> <cibsen> BeanInvocation is a internal camel class that is like meta data about
some bean to invoke
>  are you sure you want to route that?
>  chirino ccustine cibsen
> <smerp> cibsen: Well, I was just following the examples for @Produce and @Consume
in the online docs
> <smerp> cibsen: more background was posted on the camel-users mailing list. Here's
a URL to the current thread: http://www.nabble.com/Using-%40Produce---%40Consume----What-am-I-missing--tt25437492.html
> <cibsen> well you use OSGi then you got all the pain it brings along :(
> smerp plays sadtrombone.wav
> <smerp> :|
> <cibsen> eg activemq.jar wants to deserialize the object it received over JMS but
OSGi forbids it to see the org.apache.camel classes
>  as its not importing them
> {quote}
> ...and then a later one on {{#servicemix}}:
> {quote}
> <smerp> Can any SMX folks tell me what to do to get ActiveMQ embedded in SMX to
"see" the camel classes (BeanInvocation, specifically)
>  OSGi, as awesome as it is, is a pain sometimes.
>  Context is here -> http://www.nabble.com/Using-%40Produce---%40Consume----What-am-I-missing--tt25437492.html
(see the last post)
> <ccustine> smerp: I fear this would require a DynamicImport-Package in the ActiveMQ
bundle
> <smerp> ccustine: :(
>  ccustine: is this a bug? or a feature? or perhaps a fug?
> <ccustine> smerp: the correct option is probably to modify AMQ ClassLoadingAwareObjectInputStream
to be more OSGi aware
> <smerp> crap.
> <ccustine> smerp: probably fug  :-/
> <smerp> ccustine: any decent workarounds for now?
>  ccustine: I'll file a JIRA for it
>  Probably needs to be on ActiveMQ, right?
> <ccustine> DynamicImport on AMQ is the fastest, but may have unanticipated problems
>  well... good question
>  probably, but officially there isn't much OSGi specific in AMQ
>  this is getting kinda specific, but you can start there
>  I think this is something we need to figure out
>  so basically it sounds like any objectmessage that is serialized from a user type will
have this occur
> <smerp> right... this is a tricky problem, as the problem is (a) caused by something
that is recommended in Camel (BeanInvocations on queues) and (b) is broken only when using
ActiveMQ in SMX 4 w/OSGi
> <ccustine> right
> <smerp> I think so -- it happens the object type is from Camel, but yes
> <ccustine> seems like a general use case that is broken in OSGi, so I would open
the bug under AMQ and then we will work with them to figure out a solution
>  chirino ccustine
> <smerp> ccustine: Alright, sounds good
> smerp goes to JIRA
> <ccustine> smerp: I may have a nasty workaround by modifying the activemq.xml that
we deploy in SMX....
> <smerp> ccustine: that would be great for the short term -- it would get me moving
again
>  (if it works)
> <ccustine> open the bug and I will look at this hack for a bit
>  yeah
> {quote}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message