Ich habe eine Anwendung mit zwei Kamelen Routen:Nachricht Verbrauch von activemq steckte mit Kamel jms Komponente
Route 1 (Consumer Strecke)
Liest eine Textdatei nicht mit. sie von Datensatz (Linie getrennt), aufgeteilt, basierend auf jeder Zeile und sendet jeden Teildatensatz zu einer anderen Warteschlange (‚Zwischen‘ Warteschlange)
Route 2 (Producer Strecke)
liest jeden Datensatz aus Zwischen Warteschlange, transformieren sie und sendet sie an eine Warteschlange.
Ich benutze ActiveMQ mit Kamel JmsComponent (concurrentConsumers=7, maxConcurrentConsumers=10
). Ich nehme an, dass Kamel Spring DMLC verwendet, um aus der Warteschlange zu lesen.
Konfigurationen:
activemq.broker.uri = tcp://0.0.0.0:61616?jms.useAsyncSend=true&jms.prefetchPolicy.queuePrefetch=1
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="jmsmqConnectionFactory" />
<property name="reconnectOnException" value="true" />
<property name="sessionCacheSize" value="7" />
</bean>
<bean id="jmsComponent" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="cachingConnectionFactory" />
<property name="cacheLevelName" value="CACHE_CONSUMER" />
<property name="transacted" value="true" />
<property name="transactionManager" ref="transactionManager" />
</bean>
jmsComponent:queue:INTERMEDIATE?concurrentConsumers=7&maxConcurrentConsumers=10
Nun ist das Problem, wenn das nicht. der Datensätze in der Datei ist sehr wenig (10 oder weniger), die geteilten Datensätze bleiben in der Zwischenwarteschlange stecken. Die Producer-Route wird ausgeführt, es erfolgt jedoch kein Nachrichtenverbrauch. Es gibt keine Ausnahme in einem der Protokolle und die Consumer Route ist ebenfalls aktiv.
jedoch durch prefetch
Grenze auf 0 setzen, wird dieses Problem gegangen, aber zu einem anderen Problem führt - Die Kamelrouten nicht gewaltsam durch ctrl+C
mit cacheLevel
als CACHE_CONSUMER
gestoppt werden können. Obwohl CACHE_AUTO
funktioniert, verschlechtert sich die Leistung.
Jetzt gibt es ein bekanntes Problem mit prefetch > 0
und SpringDMLC oder fehlt mir etwas?
hmm kein bekanntes Problem mit Prefetch größer als Null kann ich beachten. Beachten Sie jedoch, dass Prefetch Datensätze von ActiveMQ herunterzieht, bevor Sie sie verarbeiten müssen. Wenn Kamel einen Stopp erhält, versucht es standardmäßig, die Verarbeitung der Datensätze zuerst zu beenden. Wenn eine Komponente, die Sie verwenden, herunterfährt, während Sie versuchen, die Verarbeitung zu beenden, können Sie einen Deadlock auslösen. Haben Sie sich JMX angesehen, um zu sehen, ob Sie noch Nachrichten an Bord hatten? –