Запись в очередь хроники с несколькими потоками -> java.nio.BufferOverflowException

Я пишу адаптер для использования очереди хроники в администраторе удаленной службы Apache Aries. Он отлично работает, когда я использую только один поток. С более чем одним потоком я получаю исключения, как показано ниже.

Любая идея, что я делаю неправильно?

Для справки, это мой код: https://github.com/cschneider/rsa-chronicle-provider/blob/master/src/test/java/org/apache/aries/rsa/provider/chronicle/ChronicleProviderTest.java

Вы можете увидеть исключение, если увеличите количество потоков в исполнителе.

Exception in thread "pool-3-thread-2" java.nio.BufferOverflowException
    at net.openhft.chronicle.bytes.AbstractBytes.writePosition(AbstractBytes.java:182)
    at net.openhft.chronicle.bytes.AbstractBytes.writePosition(AbstractBytes.java:29)
    at net.openhft.chronicle.wire.AbstractWire.writeHeader0(AbstractWire.java:183)
    at net.openhft.chronicle.wire.AbstractWire.writeHeader(AbstractWire.java:171)
    at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreAppender.append(SingleChronicleQueueExcerpts.java:252)
    at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreAppender.writeBytes(SingleChronicleQueueExcerpts.java:153)
    at org.apache.aries.rsa.provider.chronicle.ChronicleInvocationHandler.invoke(ChronicleInvocationHandler.java:45)
    at com.sun.proxy.$Proxy7.callOneWay(Unknown Source)
    at org.apache.aries.rsa.provider.chronicle.ChronicleProviderTest$1.run(ChronicleProviderTest.java:87)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

person Christian Schneider    schedule 29.03.2016    source источник


Ответы (1)


Похоже, что приложения Chronicle не являются потокобезопасными, поэтому записи в одну и ту же очередь должны быть синхронизированы.

См. Часто задаваемые вопросы: можно ли иметь несколько авторов?

person Christian Schneider    schedule 29.03.2016
comment
Или вам нужно приложение для каждого потока. Когда вы приобретаете приложение для очереди, вы получаете локальный модуль добавления потока, который поток может безопасно использовать, но если вы передаете его между очередями, вы должны его заблокировать. - person Peter Lawrey; 05.02.2017