Ich habe eine kleine Spring-Boot-App, die als Produzent für einige Warteschlangen fungiert. Es verwendet die folgende Abhängigkeit:Spring AMQP - gleichzeitige Veröffentlichung in RabbitMQ Broker scheint zu blockieren
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
Innerhalb der App starte ich 4 Threads. Innerhalb jeder Aufgabe werden zufällige Nachrichten mit einer maximalen Größe von 10 KB erstellt. Diese Nachrichten werden mit der Methode convertAndSend von AmqpTemplate an einen direkten Austausch gesendet. Für jeden Thread wird ein separater Kanal verwendet. Bis jetzt läuft alles glatt.
Während der Laufzeit habe ich die JVM mit Java VisualVM untersucht. Ich konnte sehen, dass die 4 Threads funktionierten, war aber ein wenig überrascht, dass die Threads die meiste Zeit im Monitor (blocked) Zustand sind. Sehen Sie im folgenden Screenshot:
http://i.stack.imgur.com/i8uX7.png
Und hier ist ein Stück eines Stack-Trace:
java.lang.Thread.State: BLOCKED
at com.rabbitmq.client.impl.SocketFrameHandler.writeFrame(SocketFrameHandler.java:144)
- waiting to lock <1407a47> (a java.io.DataOutputStream) owned by "Thread-7" [email protected]
at com.rabbitmq.client.impl.AMQConnection.writeFrame(AMQConnection.java:514)
at com.rabbitmq.client.impl.AMQCommand.transmit(AMQCommand.java:102)
- locked <316a68> (a com.rabbitmq.client.impl.CommandAssembler)
at com.rabbitmq.client.impl.AMQChannel.quiescingTransmit(AMQChannel.java:334)
- locked <1d8e172> (a java.lang.Object)
at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:310)
- locked <1d8e172> (a java.lang.Object)
at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:657)
so dass nicht aussehen wie parallel Publishing zu mir.
Kann jemand sagen, ob dieses Verhalten korrekt ist? Für mich scheint es, dass es nicht ist, aber ich kann nicht herausfinden, was falsch läuft.
Wenn ich die gleiche Producer-App auf einer zusätzlichen Maschine starte, scheint sich der Blocking-Zustand zu verschlechtern, als würde der Rabbitmq-Broker den Zugriff synchronisieren. Der Makler selbst ist in Ordnung. Keine physikalischen Grenzen getroffen. Keine Flusskontrolle. Selbst die eingehenden Nachrichtenraten werden mit einer zusätzlichen Producer-App fast verdoppelt.
Das ergibt keinen Sinn für mich. Hat jemand eine Idee? Muss ich mir Sorgen machen?
Vielen Dank im Voraus!
Irgendeine Schlussfolgerung zu diesem? Ich glaube, ich leide an dem gleichen Problem – Jaskey