Uploaded image for project: 'ActiveMQ Classic'
  1. ActiveMQ Classic
  2. AMQ-4920

AmqpErrorException occurs with multiple concurrent amqp topic consumers

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • None
    • 5.9.1, 5.10.0
    • None
    • None

    Description

      I'll add a test to reproduce this. There are currently 2 problems. The more frequent one looks like: org.apache.qpid.amqp_1_0.type.AmqpErrorException
      at org.apache.qpid.amqp_1_0.codec.ValueHandler.readConstructor(ValueHandler.java:99)
      at org.apache.qpid.amqp_1_0.codec.ValueHandler.parse(ValueHandler.java:90)
      at org.apache.qpid.amqp_1_0.codec.ValueHandler.readConstructor(ValueHandler.java:105)
      at org.apache.qpid.amqp_1_0.codec.ValueHandler.parse(ValueHandler.java:90)

      … repeated many times
      at org.apache.qpid.amqp_1_0.codec.ValueHandler.readConstructor(ValueHandler.java:105)
      at org.apache.qpid.amqp_1_0.codec.ValueHandler.parse(ValueHandler.java:90)
      at org.apache.qpid.amqp_1_0.messaging.SectionDecoderImpl.parseAll(SectionDecoderImpl.java:49)
      at org.apache.qpid.amqp_1_0.client.Receiver.receive(Receiver.java:280)
      at org.apache.qpid.amqp_1_0.jms.impl.MessageConsumerImpl.receive0(MessageConsumerImpl.java:286)
      at org.apache.qpid.amqp_1_0.jms.impl.MessageConsumerImpl.receiveImpl(MessageConsumerImpl.java:255)
      at org.apache.qpid.amqp_1_0.jms.impl.MessageConsumerImpl.receive(MessageConsumerImpl.java:238)
      at org.apache.qpid.amqp_1_0.jms.impl.MessageConsumerImpl.receive(MessageConsumerImpl.java:56)
      at org.apache.activemq.transport.amqp.ENTMQ466ConsumerThread.run(ENTMQ466Test.java:123)

      This occurs at the line "final EncodedMessage amqp = outboundTransformer.transform(jms);" in the ConsumerContext.pumpOutbound() method of AmqpProtocolConverter(). This call sometimes returns with its content (amqp.getArray()) set to all zeros.

      On those messages this line
      LOG.info("In pumpOutbound, setting currentBuffer to offset {} length {} content [{}]", amqp.getArrayOffset(), amqp.getLength(), amqp.getArray());
      returns:

      2013-11-26 17:19:16,680 [calhost] Task-3] - INFO AmqpProtocolConverter - In pumpOutbound, setting currentBuffer to offset 0 length 162 content [[0, 0, 0, 0, 0, \
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\
      , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

      At the root of this, outboundTransformer is a (proton) AutoOutboundTransformer. It calls AMQPNativeOutboundTransformer.transform(), which calls msg.readBytes(data), which sometimes writes all 0s to data. Here msg is an ActiveMQBytesMessage.

      Attachments

        1. rp.out
          140 kB
          Kevin Anthony Earls

        Activity

          People

            kearls Kevin Anthony Earls
            kearls Kevin Anthony Earls
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: