Я довольно новичок в JMS и имею требование связывать AMQ и WMQ, я видел в документации Camel, что вместо использования JMS для JMS-моста что они рекомендуют использовать Camel.Верблюд как мост JMS для JMS - Не отображается как потребитель AMQ
Для начала я хочу, чтобы мое приложение принимало сообщения с AMQ и просто регистрировалось, что это так, но всякий раз, когда я запускаю свое приложение в Jetty, он не отображается как потребитель на apiToTopsQueue и, следовательно, не выводит сообщения из очереди.
Мое приложение-context.xml (который загружает верблюжий-контекст)
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:tops-bridge.properties" />
<import resource="classpath:camel-context.xml" />
<bean id="log4jInitialization"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="org.springframework.util.Log4jConfigurer" />
<property name="targetMethod" value="initLogging" />
<property name="arguments">
<list>
<value>classpath:log4j.xml</value>
<value>60000</value> <!-- Refresh Log4j config every 60 seconds -->
</list>
</property>
</bean>
</beans>
Тогда это верблюд-context.xml (я комментирование и из случайного кода из учебников, так что может показаться странным)
<?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:camel="http://camel.apache.org/schema/spring"
xmlns:broker="http://activemq.apache.org/schema/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
<camel:camelContext id="defaultCamelContext">
<camel:routeBuilder ref="bridgeRouteConfig"/>
<!--<camel:jmxAgent id="agent" createConnector="true"/>-->
</camel:camelContext>
<bean id="bridgeRouteConfig" class="com.caci.asg.rail.tops.bridge.TopsBridgeRouteBuilder">
<constructor-arg name="amqToBridgeQueue" value="${topsBridgeRouteBuilder.route.amqToBridgeRoute}"/>
<constructor-arg name="bridgeToWmqQueue" value="${topsBridgeRouteBuilder.route.bridgeToWmqRoute}"/>
<constructor-arg name="wmqToBridgeQueue" value="${topsBridgeRouteBuilder.route.wmqToBridgeRoute}"/>
<constructor-arg name="bridgeToAmqQueue" value="${topsBridgeRouteBuilder.route.bridgeToAmqRoute}"/>
</bean>
<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${application.activemq.url}"/>
<property name="useAsyncSend" value="true"/>
</bean>
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
init-method="start" destroy-method="stop">
<property name="maxConnections" value="8"/>
<property name="connectionFactory" ref="jmsFactory"/>
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="concurrentConsumers" value="10"/>
</bean>
<!-- lets configure the ActiveMQ JMS broker server -->
<broker:broker useJmx="true" persistent="false" brokerName="myBroker">
<broker:transportConnectors>
<!-- expose a VM transport for in-JVM transport between AMQ and Camel on the server side -->
<broker:transportConnector name="vm" uri="vm://myBroker"/>
<!-- expose a TCP transport for clients to use -->
<broker:transportConnector name="tcp" uri="${application.activemq.url}"/>
</broker:transportConnectors>
</broker:broker>
<!-- lets configure the Camel ActiveMQ to use the embedded ActiveMQ broker declared above -->
<bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL" value="vm://myBroker"/>
</bean>
</beans>
верблюд-context.xml использует некоторые свойства, которые заключаются в следующем (те, относящиеся к WMQ заполнители в данный момент, пока я не AMQ работать).
application.activemq.url=tcp://localhost:61616
topsBridgeRouteBuilder.route.amqToBridgeRoute=jms:apiToTopsQueue
topsBridgeRouteBuilder.route.bridgeToWmqRoute=mq:toWmq
topsBridgeRouteBuilder.route.wmqToBridgeRoute=mq:fromWmq
topsBridgeRouteBuilder.route.bridgeToAmqRoute=jms:topsToApiQueue
Маршрут строитель в Java следующим
import org.apache.camel.LoggingLevel;
import org.apache.camel.builder.RouteBuilder;
public class TopsBridgeRouteBuilder extends RouteBuilder {
private final String amqToBridgeQueue;
private final String bridgeToWmqQueue;
private final String wmqToBridgeQueue;
private final String bridgeToAmqQueue;
public TopsBridgeRouteBuilder(String amqToBridgeQueue, String bridgeToWmqQueue, String wmqToBridgeQueue, String bridgeToAmqQueue) {
this.amqToBridgeQueue = amqToBridgeQueue;
this.bridgeToWmqQueue = bridgeToWmqQueue;
this.wmqToBridgeQueue = wmqToBridgeQueue;
this.bridgeToAmqQueue = bridgeToAmqQueue;
}
@Override
public void configure() throws Exception {
// from(amqToBridgeQueue).to(bridgeToWmqQueue).log(LoggingLevel.INFO, "Message moving to " + bridgeToWmqQueue);
// from(wmqToBridgeQueue).to(bridgeToAmqQueue).log(LoggingLevel.INFO, "Message moving to " + bridgeToAmqQueue);
from(amqToBridgeQueue).log(LoggingLevel.WARN, "Consuming message from" + amqToBridgeQueue);
}
}
Так что я не совсем уверен, почему она не указана в качестве потребителя apiToTopsQueue, когда я начинаю Jetty. Мой pom включает зависимости для AMQ/WMQ/верблюдов. Зависимости следующим образом (наследуя версию/сферы от родительского П)
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jms</artifactId>
</dependency>
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>com.ibm.mq.jmqi</artifactId>
</dependency>
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>com.ibm.mqjms</artifactId>
</dependency>
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>connector</artifactId>
</dependency>
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>dhbcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
Я написал этот тест, чтобы увидеть, что я мог бы поставить сообщения и снимать их с Amq от моего моста - это работает и на Amq администраторе page Я мог видеть увеличенное количество экземпляров в очереди/dequeued.
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import javax.jms.*;
public class TopsBridgeRouteBuilderTest {
@Test
public void testAMessageAddedToAmqCanBeRetrieved() throws JMSException {
String brokerURL = "tcp://localhost:61616";
String amqQueue = "apiToTopsQueue";
String messageToSend = "Test message";
// Put a message on the AMQ
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(amqQueue);
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
TextMessage tm = session.createTextMessage(messageToSend);
producer.send(tm);
// Create read only consumer to take the message off the queue
ActiveMQConnectionFactory connectionFactoryReadOnly = new ActiveMQConnectionFactory(brokerURL);
Connection connectionReadOnly = connectionFactoryReadOnly.createConnection();
connectionReadOnly.start();
Session sessionReadOnly = connectionReadOnly.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = sessionReadOnly.createConsumer(destination);
final TextMessage message = (TextMessage) consumer.receive();
System.out.println("Message retrieved = " + message.getText());
assertThat(message.getText(), is(messageToSend));
}
}
Есть ли что-то неправильно в моей конфигурации, что означает, что маршрутизация верблюд не работает или смотрит на Amq, когда я начинаю Jetty?
Спасибо.