[
https://issues.apache.org/jira/browse/QPID-677?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Martin Ritchie resolved QPID-677.
---------------------------------
Resolution: Fixed
Change to the Message Handling of ByteBuffers for Fieldtables addressed this.
> Message properties get erased when routing message
> --------------------------------------------------
>
> Key: QPID-677
> URL: https://issues.apache.org/jira/browse/QPID-677
> Project: Qpid
> Issue Type: Bug
> Components: Java Broker
> Affects Versions: M2, M2.1
> Reporter: Martin Ritchie
> Fix For: M3
>
>
> In adding support for JMSXUserID I noted that the underlying data for the
> message _headers is being erased.
> I haven't had time to track this down but here is what I see.
> I update the userID value in the header to be the authenticated user id. This
> causes the encoded Message Headers to be set to null. The data for which is
> copied in to a local byte[] so can be reencoded. However, the _headers
> FieldTable only maintains a reference to the original ByteBuffer. When
> routing the message the _headers may be inspected if a Selector is being
> used. Because the broker has not decoded the fieldtable values it now
> attempts to do so. For some reason the ByteBuffer data no longer exists and
> so a decoding is not possible.
> pool-2-thread-4 2007-11-06 17:30:20,983 DEBUG
> [qpid.server.filter.PropertyExpression] Looking up property:Selector
> Dispatcher-Channel-1 2007-11-06 17:30:20,999 DEBUG
> [apache.qpid.client.BasicMessageConsumer] Message is of type:
> org.apache.qpid.client.message.JMSTextMessage
> pool-2-thread-4 2007-11-06 17:30:20,999 ERROR
> [qpid.server.protocol.AMQPFastProtocolHandler] Exception caught
> inAMQProtocolSession(anonymous(26156009)), closing session explictly:
> java.nio.BufferUnderflowException
> java.nio.BufferUnderflowException
> at java.nio.Buffer.nextGetIndex(Buffer.java:474)
> at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:205)
> at
> org.apache.mina.common.support.BaseByteBuffer.get(BaseByteBuffer.java:203)
> at org.apache.mina.common.ByteBuffer.getUnsigned(ByteBuffer.java:487)
> at
> org.apache.qpid.framing.AMQShortString.readFromBuffer(AMQShortString.java:172)
> at
> org.apache.qpid.framing.EncodingUtils.readAMQShortString(EncodingUtils.java:660)
> at org.apache.qpid.framing.FieldTable.setFromBuffer(FieldTable.java:962)
> at
> org.apache.qpid.framing.FieldTable.populateFromBuffer(FieldTable.java:111)
> at
> org.apache.qpid.framing.FieldTable.initMapIfNecessary(FieldTable.java:171)
> at org.apache.qpid.framing.FieldTable.keySet(FieldTable.java:890)
> at
> org.apache.qpid.server.filter.PropertyExpression.evaluate(PropertyExpression.java:279)
> at
> org.apache.qpid.server.filter.ComparisonExpression$1.evaluate(ComparisonExpression.java:245)
> at
> org.apache.qpid.server.filter.ComparisonExpression.matches(ComparisonExpression.java:590)
> at
> org.apache.qpid.server.filter.JMSSelectorFilter.matches(JMSSelectorFilter.java:52)
> at
> org.apache.qpid.server.filter.SimpleFilterManager.allAllow(SimpleFilterManager.java:57)
> at
> org.apache.qpid.server.queue.SubscriptionImpl.checkFilters(SubscriptionImpl.java:442)
> at
> org.apache.qpid.server.queue.SubscriptionImpl.hasInterest(SubscriptionImpl.java:423)
> at
> org.apache.qpid.server.queue.SubscriptionSet.nextSubscriberImpl(SubscriptionSet.java:154)
> at
> org.apache.qpid.server.queue.SubscriptionSet.nextSubscriber(SubscriptionSet.java:129)
> at
> org.apache.qpid.server.queue.ConcurrentSelectorDeliveryManager.deliver(ConcurrentSelectorDeliveryManager.java:818)
> at org.apache.qpid.server.queue.AMQQueue.process(AMQQueue.java:803)
> at
> org.apache.qpid.server.txn.NonTransactionalContext.deliver(NonTransactionalContext.java:99)
> at org.apache.qpid.server.queue.AMQMessage.deliver(AMQMessage.java:735)
> at
> org.apache.qpid.server.queue.AMQMessage.addContentBodyFrame(AMQMessage.java:377)
> at
> org.apache.qpid.server.AMQChannel.publishContentBody(AMQChannel.java:266)
> at
> org.apache.qpid.server.protocol.AMQMinaProtocolSession.contentBodyReceived(AMQMinaProtocolSession.java:389)
> at
> org.apache.qpid.server.protocol.AMQMinaProtocolSession.frameReceived(AMQMinaProtocolSession.java:220)
> at
> org.apache.qpid.server.protocol.AMQMinaProtocolSession.dataBlockReceived(AMQMinaProtocolSession.java:191)
> at
> org.apache.qpid.server.protocol.AMQPFastProtocolHandler.messageReceived(AMQPFastProtocolHandler.java:206)
> at
> org.apache.mina.common.support.AbstractIoFilterChain$2.messageReceived(AbstractIoFilterChain.java:189)
> at
> org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:502)
> at
> org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
> at
> org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:777)
> at
> org.apache.mina.filter.codec.support.SimpleProtocolDecoderOutput.flush(SimpleProtocolDecoderOutput.java:60)
> at
> org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:185)
> at
> org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:502)
> at
> org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
> at
> org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:777)
> at
> org.apache.qpid.pool.PoolingFilter.messageReceived(PoolingFilter.java:317)
> at
> org.apache.mina.filter.ReferenceCountingIoFilter.messageReceived(ReferenceCountingIoFilter.java:96)
> at
> org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:502)
> at
> org.apache.mina.common.support.AbstractIoFilterChain.access$1000(AbstractIoFilterChain.java:52)
> at
> org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:777)
> at org.apache.qpid.pool.Event$ReceivedEvent.process(Event.java:86)
> at org.apache.qpid.pool.Job.processAll(Job.java:109)
> at org.apache.qpid.pool.Job.run(Job.java:147)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:619)
> I don't quite see what is going wrong. However, if the FieldTable is
> populated from the buffer before routing then the data can be re-encoded.
> Simplist way to do that is to request the getHeaders().keySet()
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.