[
https://issues.apache.org/activemq/browse/SM-1526?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=45329#action_45329
]
Ron Gavlin commented on SM-1526:
--------------------------------
Hi Freeman,
In my scenario, I am auditing message exchanges to an ActiveMQ JMS queue and
then asynchronously consuming exchanges from the queue and persisting them to
a database.
With the fix for CXF-1779 applied, my attempts to de-serialize the audited
exchange from the JMS queue result in the following:
ERROR - MonitorStandardConsumerProcessor - Unable to extract Exchange from
message
javax.jms.JMSException: Failed to build body from bytes. Reason:
java.io.IOException: javax.xml.ws.handler.MessageContext$Scope
at
org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:35)
at
org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:183)
at
org.spagic.monitoring.smx.components.jms.MonitorStandardConsumerProcessor.onMessage(MonitorStandardConsumerProcessor.java:74)
at
org.apache.servicemix.jms.standard.StandardConsumerProcessor.poll(StandardConsumerProcessor.java:94)
at
org.apache.servicemix.jms.standard.StandardConsumerProcessor$1.run(StandardConsumerProcessor.java:56)
...
Caused by: java.io.IOException: javax.xml.ws.handler.MessageContext$Scope
at
org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:179)
... 6 more
The source code for method MonitorStandardConsumerProcessor.onMessage() is
listed below. This class extends
org.apache.servicemix.jms.standard.StandardConsummerProcessor. Line 74, which
causes the exception, is noted below with a comment.
Let me know if you have additional questions.
- Ron
@Override
public void onMessage(Message message) {
if (!(message instanceof ObjectMessage)) {
log.warn("The message is not of type ObjectMessage");
return;
}
try {
// -------------------------- Line 74 is below
---------------------------------------------------------------------------------------------
//
MessageExchange exchange =
(MessageExchange)((ObjectMessage)message).getObject();
JBIMessage jbiMessage = new JBIMessage(exchange, log);
debug("traceExchange. Exchange = " + exchange);
MonitorServiceJBI monitorService = new
MonitorServiceJBI(storeExchangesForRestart, keepOnlyFaultedExchanges, log);
monitorService.traceMessage(jbiMessage);
}
catch (JMSException ex) {
log.error("Unable to extract Exchange from message",
ex);
}
}
> MessageExchange (org.apache.cxf.transport.jbi.JBIDestination) not serializable
> ------------------------------------------------------------------------------
>
> Key: SM-1526
> URL: https://issues.apache.org/activemq/browse/SM-1526
> Project: ServiceMix
> Issue Type: Bug
> Components: servicemix-cxf-bc
> Affects Versions: 3.2.3
> Reporter: Ron Gavlin
> Assignee: Freeman Fang
> Priority: Critical
> Fix For: 3.2.3, 3.3
>
> Attachments: wsdl-first-cxf-sa-3.3.1.3-fuse.jar
>
>
> When I invoke the attached flow with the JdbcAuditor enabled in
> servicemix.xml, the following error is generated. This prevents us from
> monitoring flows that use CXF components which is a major problem for us.
> 02:33:21,390 | ERROR | pool-flow.seda.servicemix-cxf-se-thread-1 |
> JdbcAuditor | mix.jbi.audit.jdbc.JdbcAuditor 137 | Could not
> persist exchange
> java.io.NotSerializableException: org.apache.cxf.transport.jbi.JBIDestination
> at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
> at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
> at java.util.HashMap.writeObject(HashMap.java:1039)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:585)
> at
> java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:917)
> at
> java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1339)
> at
> java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
> at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
> at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
> at
> org.apache.servicemix.jbi.messaging.NormalizedMessageImpl.writeExternal(NormalizedMessageImpl.java:311)
> at
> java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1310)
> at
> java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1288)
> at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
> at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
> at
> org.apache.servicemix.jbi.messaging.ExchangePacket.writeExternal(ExchangePacket.java:406)
> at
> java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1310)
> at
> java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1288)
> at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
> at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
> at
> org.apache.servicemix.jbi.messaging.ExchangePacket.getData(ExchangePacket.java:472)
> at
> org.apache.servicemix.jbi.audit.jdbc.JdbcAuditor.exchangeSent(JdbcAuditor.java:122)
> at
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.doSend(DeliveryChannelImpl.java:379)
> at
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:470)
> at
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:442)
> at
> org.apache.servicemix.common.EndpointDeliveryChannel.sendSync(EndpointDeliveryChannel.java:95)
> at
> org.apache.cxf.transport.jbi.JBIDestinationOutputStream.commitOutputMessage(JBIDestinationOutputStream.java:127)
> at
> org.apache.cxf.transport.jbi.JBIDestinationOutputStream.doClose(JBIDestinationOutputStream.java:69)
> at
> org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:167)
> at
> org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
> at
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
> at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220)
> at
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:74)
> at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220)
> at
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:77)
> at
> org.apache.cxf.transport.jbi.JBIDispatcherUtil.dispatch(JBIDispatcherUtil.java:156)
> at
> org.apache.servicemix.cxfse.CxfSeEndpoint.process(CxfSeEndpoint.java:232)
> at
> org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:540)
> at
> org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:492)
> at
> org.apache.servicemix.common.BaseLifeCycle.onMessageExchange(BaseLifeCycle.java:46)
> at
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:610)
> at
> org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:172)
> at
> org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:167)
> at
> org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:134)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
> at java.lang.Thread.run(Thread.java:595)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.