2016-03-29 8 views
0

Ich schreibe einen Adapter, um Chronik-Warteschlange in Apache Wides Remote Service Admin zu verwenden. Es funktioniert gut, wenn ich nur einen einzigen Thread verwende. Bei mehr als einem Thread erhalte ich Ausnahmen wie unten.Schreiben in eine Chronik-Warteschlange mit mehreren Threads -> java.nio.BufferOverflowException

Irgendeine Idee, was ich falsch mache?

Als Referenz dies ist mein Code: https://github.com/cschneider/rsa-chronicle-provider/blob/master/src/test/java/org/apache/aries/rsa/provider/chronicle/ChronicleProviderTest.java

Sie können die Ausnahme sehen, wenn Sie die Anzahl der Threads in dem Testamentsvollstrecker erhöhen.

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) 

Antwort

1

Sieht aus wie Chronik Appender sind nicht thread sicher, so schreibt in der gleichen Warteschlange muss synchronisiert werden.

Siehe FAQ: Can I have multiple writers?

+0

Oder benötigen Sie einen appender für jeden Thread. Wenn Sie einen Appender für eine Warteschlange erwerben, erhalten Sie einen lokalen Thread-Appender, den Thread sicher verwenden kann, aber wenn Sie ihn zwischen Warteschlangen übergeben, müssen Sie ihn sperren. –

Verwandte Themen