Search the FirstSpirit Knowledge Base
Hallo zusammen,
wir haben den UXB-Service bei uns laufen mit einer externen ActiveMQ. Wir tun darüber XML Files deployen. Mit einem Broker funktioniert es aber mit 2 habe ich Probleme.
Die UX-Konfiguration sieht so aus:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL"
value="failover:(tcp://dmztomint01:61616)?maxReconnectAttempts=2&startupMaxReconnectAttempts=10"/>
</bean>
</property>
</bean>
<bean id="jms2" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL"
value="failover:(tcp://dmztomint02:61616)?maxReconnectAttempts=2&startupMaxReconnectAttempts=10"/>
</bean>
</property>
</bean>
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="maxConnections" value="10"/>
<property name="maximumActiveSessionPerConnection" value="500"/>
<property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>
<bean id="pooledConnectionFactory2" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="maxConnections" value="10"/>
<property name="maximumActiveSessionPerConnection" value="500"/>
<property name="connectionFactory" ref="jmsConnectionFactory2"/>
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="transacted" value="false"/>
<property name="concurrentConsumers" value="10"/>
<property name="deliveryPersistent" value="true" />
</bean>
<bean id="jmsConfig2" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory2"/>
<property name="transacted" value="false"/>
<property name="concurrentConsumers" value="10"/>
<property name="deliveryPersistent" value="true" />
</bean>
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://dmztomint01:61616)?maxReconnectAttempts=2&startupMaxReconnectAttempts=10"/>
</bean>
<bean id="jmsConnectionFactory2" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://dmztomint02:61616)?maxReconnectAttempts=2&startupMaxReconnectAttempts=10"/>
</bean>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig"/>
</bean>
<bean id="activemq2" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig2"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring" id="camelContext" trace="false">
<package>com.espirit.moddev.uxbridge.service</package>
<template id="producerTemplate"/>
<endpoint id="FS-Out" uri="activemq:topic:FS_OUT"></endpoint>
<onException>
<exception>java.lang.Exception</exception>
<handled>
<constant>true</constant>
</handled>
<process ref="uxbExceptionProcessor" />
</onException>
<route id="Adapter-Statistics-Response-Route">
<from uri="jms:topic:FS_IN"/>
<convertBodyTo type="com.espirit.moddev.uxbridge.api.v1.service.UXBEntity"/>
<bean ref="UxbServiceStatisticsResponseHandler" method="print"/>
</route>
<route id="Adapter-Statistics-Response-Route2">
<from uri="jms2:topic:FS_IN"/>
<convertBodyTo type="com.espirit.moddev.uxbridge.api.v1.service.UXBEntity"/>
<bean ref="UxbServiceStatisticsResponseHandler2" method="print"/>
</route>
<route>
<from uri="activemq:topic:FS_OUT"/>
<to uri="activemq2:topic:FS_OUT"/>
</route>
</camelContext>
<bean id="UxbServiceStatisticsResponseHandler"
class="com.espirit.moddev.uxbridge.service.UxbServiceStatisticsResponseHandler">
<constructor-arg ref="camelContext"/>
</bean>
<bean id="UxbServiceStatisticsResponseHandler2"
class="com.espirit.moddev.uxbridge.service.UxbServiceStatisticsResponseHandler">
<constructor-arg ref="camelContext"/>
</bean>
<bean id="uxbExceptionProcessor" class="com.espirit.moddev.uxbridge.inline.UxbExceptionProcessor"/>
</beans>
Ich bekomme allerdings Probleme in der Queue die bei mir "activemq2" heißt. Dort werden mehr Messages deployt und ich bekomme Message in meine DLQ.
Gibt es Konfigurationsbeispiele wo ich die gleiche Anzahl an Nachrichten an mehrere Broker URLs versenden kann?
Danke und Grüße
Josef
Hallo Josef,
unsere Empfehlung ist in der Servicekonfiguration nur einen Broker /ActiveMQ zu haben und das Weiterleiten an andere ActiveMQ über die Konfiguration in der camel.xml zu lösen.
Also FS => ActiveMQ1 => MultiCast in camel.xml konfigurieren => ActiveMQ2.
Sonst wird das mit den Aufträgen und der Auswertung, ob die Nachrichten auch angekommen sind, deutlich komplizierter.
Also Service-Konfig in FS so lassen.
camel.xml in der UX-Bridge (ActiveMQ) um Multicast erweitern und dort auch den zweiten Broker konfigurieren
Details:
Ungetestet, um das Prinzip zu erklären:
Bisher:
<route id="uxbridge-route1">
<from uri="activemq:topic:FS_OUT"/>
<to uri="activemq:topic:VirtualTopic.BUS_OUT"/>
</route>
Neu:
<route id="uxbridge-route1">
<from uri="activemq:topic:FS_OUT"/>
<multicast stopOnException="true">
<to uri="activemq:topic:VirtualTopic.BUS_OUT"/>
<to uri="activemq2:topic:VirtualTopic.QUEUE_NAME_ON_BROKER2""/>
</multicast>
</route>
Damit sollten alle Nachrichten in VirtualTopic.BUS_OUT von Broker1 und auf VirtualTopic.QUEUE_NAME_ON_BROKER2 von Broker2 landen
Hallo Christoph,
das ist leider nicht möglich. Die zwei ActiveMq Instanzen sind komplett getrennt. Der Eine liegt im Intranet Netzwerk und darf auch keine Verbindung nach draußen haben und der Andere liegt auf einem DMZ Server.
Du könntest eine zusätzliche ActiveMQ dort platzieren, wo jetzt der FS-Server ist. Der scheint ja Zugriff auf beide Zonen zu haben. Die ActiveMQ leitet dann an die beiden anderen weiter.
Die Idee hatte ich auch schon aber dort wo der FS-Server läuft dürfen wir leider auch keine ActiveMQ instanz installieren. Gäbe es noch andere Optionen?
Du kannst den Multicast Ansatz natürlich auch in der Servicekonfiguration versuchen und hoffen, dass es damit keine Seiteneffekte für die Statistiken und Resulthandler gibt. Könnte klappen, hat aber noch niemand ausprobiert.
Wir hatten auch Kunden, die die ActiveMQ/Camel Funktionen genutzt haben um Nachrichten per HTTP auszutauschen. Dann hast du nur eine Verbindung von Innen nach außen. Vielleicht ist das noch eine Variante, die man mit der IT-Security diskutieren kann.
Hallo Christoph,
die Idee mit HTTP ist nicht schlecht - ich werde es mal ansprechen.
Ich habe es mal soweit auf dem CMS Server konifguriert und musste noch die Zahl der Concurrent Consumers auf 1 reduzieren.
Soweit scheint es gut zu funktionieren - aber ja du hast Recht der Resulthandler funktioniert natürlich nicht und die Statistik verfälscht sich.
Ich werde mal schauen was für Erfahrungen wir auf unserer Integrationsumgebung machen mit dieser Konfiguration.