2016-06-22 34 views
2

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?

+0

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? –

Antwort

1

Ich weiß, die Frage ist alt, aber vielleicht wird jemand von einem Workaround profitieren. Wir hatten das gleiche Problem, und obwohl wir dem nicht auf den Grund gegangen sind (begrenzte Ressourcen und die Notwendigkeit einer schnellen Lösung), isolierten wir zumindest Camel als Problemquelle.

Die von uns implementierte Problemumgehung bestand einfach darin, zwei verschiedene JMS-Komponenten zu verwenden - eine für Consumer und eine für Producer. Wenn es viele Consumer/Producer-Paare gibt, die zu/von derselben Warteschlange produzieren/konsumieren, können Sie alle Konsumenten in eine Komponente und alle Produzenten in die andere legen. Nach der Einführung der Trennung treffen wir dieses spezielle Problem nie wieder.