The client code below the stack trace - will reproduce it  - the
msg.getDataBuffer() inside the handler of that code will trigger it when a
large message is sent to the address.  The exception in question
(IndexOutOfBoundsException) is being caught in line 249 of the apache
CoreMessage code... and turned into a logged warning on line 250.  The
CoreMessage code then returns the buffer from getReadOnlyBuffer() (which
appears to be fine from a quick survey - data also seems to be preserved
and accessible from client code) - it is just not clear what the intent is
if the exception code is executed... is it a "don't worry about it" - or a
"something is wrong here" and I should concern myself with something? (the
warning level is making me believe that it is more than a "don't worry
about it" - but the fact that the exception was caught and a valid buffer
is returned makes me think it is just a fallback for the other choices of
buffers - and I should not worry about it?).

Thanks for any insight you may have....

logged warning from the caught exception is:

16:26:50.923 [Thread-0 (ActiveMQ-client-global-threads)] WARN
org.apache.activemq.artemis.core.message.impl.CoreMessage - readerIndex(4)
+ length(270740) exceeds writerIndex(4):
UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 4,
widx: 4, cap: 270740)
java.lang.IndexOutOfBoundsException: readerIndex(4) + length(270740)
exceeds writerIndex(4):
UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 4,
widx: 4, cap: 270740)
at
io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1442)
at
io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1428)
at io.netty.buffer.AbstractByteBuf.readBytes(AbstractByteBuf.java:937)
at
org.apache.activemq.artemis.core.client.impl.ClientMessageImpl$DecodingContext.readInto(ClientMessageImpl.java:407)
at
org.apache.activemq.artemis.core.message.impl.CoreMessage.getLargeMessageBuffer(CoreMessage.java:264)
at
org.apache.activemq.artemis.core.message.impl.CoreMessage.getDataBuffer(CoreMessage.java:241)
at io.m45.sart.Main.lambda$main$0(Main.java:57)
at
org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.callOnMessage(ClientConsumerImpl.java:1013)
at
org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl$Runner.run(ClientConsumerImpl.java:1133)
at
org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:42)
at
org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:31)
at
org.apache.activemq.artemis.utils.actors.ProcessorBase.executePendingTasks(ProcessorBase.java:65)
at
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at
org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118)
16:26:50.924 [Thread-0 (ActiveMQ-client-netty-threads)] DEBUG
org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl - Sending
65962 from flow-control

Simple Client Code below:


public class Main {

    private final static String ACCEPTOR = "tcp://localhost:9322";
    private final static String QUEUE="service.images.dev::service.images.dev";

    public static void main(String[] args) throws Exception {

        final String username = null;
        final String password = null;

        var serverLocator = ActiveMQClient
                .createServerLocator(ACCEPTOR)
                .setBlockOnDurableSend(true)
                .setBlockOnNonDurableSend(true);

        final var sessionFactory = serverLocator.createSessionFactory();

        final var xa = false;
        final var autoCommitSends = true;
        final var autoCommitAcks = true;
        final var ackBatchSize = serverLocator.getAckBatchSize();
        final var preAcknowledge = serverLocator.isPreAcknowledge();
        final var clientSession = sessionFactory.createSession(
                username,
                password,
                xa,
                autoCommitSends,
                autoCommitAcks,
                preAcknowledge,
                ackBatchSize
        );

        var queueQueryResult =
clientSession.queueQuery(SimpleString.toSimpleString(QUEUE));
        if (!queueQueryResult.isExists()) {
            clientSession.createQueue(_ServiceQueueConfiguration(new
SimpleString(QUEUE)));
        }

        final var consumer = clientSession.createConsumer(QUEUE);

        clientSession.start();

        consumer.setMessageHandler((msg) -> {

            System.out.println("Received: "+msg.getBodySize());
            msg.getDataBuffer();

        });

        while(true) {
            Thread.sleep(1000);
        }

    }

    private static QueueConfiguration
_ServiceQueueConfiguration(SimpleString queueName) {
        final var config = new QueueConfiguration(queueName);
        config.setMaxConsumers(1);
        config.setPurgeOnNoConsumers(false);
        config.setDurable(false);
        config.setAutoDelete(false);
        config.setRoutingType(RoutingType.MULTICAST);
        return config;
    }


On Thu, Feb 17, 2022 at 2:28 PM Justin Bertram <jbert...@apache.org> wrote:

> Typically an IndexOutOfBoundsException indicates a bug. Do you have a way
> to reproduce this?
>
>
> Justin
>
> On Thu, Feb 17, 2022 at 3:17 PM Tim Jones <t...@abcwxy.com> wrote:
>
> > This seems to appear on larger messages only - I am getting a warning
> when
> > calling getDataBuffer (2.20.0 Artemis Client).  Curious if there is
> > something I may be missing - or if this is completely ignorable? Thanks -
> > Tim
> >
> > 2022-02-17T21:06:11,908+01:00 [Thread-2 (ActiveMQ-client-global-threads)]
> > WARN o.a.a.a.c.m.i.CoreMessage [Thread-2
> (ActiveMQ-client-global-threads)]
> > readerIndex(270740) + length(270740) exceeds writerIndex(271572):
> > UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx:
> > 270740, widx: 271572, cap: 271572)
> > java.lang.IndexOutOfBoundsException: readerIndex(270740) + length(270740)
> > exceeds writerIndex(271572):
> > UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx:
> > 270740, widx: 271572, cap: 271572)
> > at
> >
> >
> io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1442)
> > at
> >
> >
> io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1428)
> > at io.netty.buffer.AbstractByteBuf.readBytes(AbstractByteBuf.java:937)
> > at
> >
> >
> org.apache.activemq.artemis.core.client.impl.ClientMessageImpl$DecodingContext.readInto(ClientMessageImpl.java:407)
> > at
> >
> >
> org.apache.activemq.artemis.core.message.impl.CoreMessage.getLargeMessageBuffer(CoreMessage.java:264)
> > at
> >
> >
> org.apache.activemq.artemis.core.message.impl.CoreMessage.getDataBuffer(CoreMessage.java:241)
> >
>

Reply via email to