Я пытаюсь настроить Apache Active MQ в Apache Tomcat. У меня есть два файла войны, MessageProducer.war и MessageConsumer.war.I добавили все баны зависимости ActiveMQ в папку/WebContent/WEB-INF/lib обоих проектов. Я добавил следующие ресурсы, настроенные в файлах context.xml обеих войн. Файл context.xml помещается внутри/WebContent/META-INF/для обеих войн.Не удалось использовать сообщение ActiveMQ на tomcat
context.xml
<Context>
<Resource
name="myConFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="vm://localhost"
brokerName="LocalActiveMQBroker"
useEmbeddedBroker="true"/>
<Resource name="jms/myTopic"
auth="Container"
type="org.apache.activemq.command.ActiveMQTopic"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="com.myproject.TOPIC"/>
</Context>
Записи, связанные с ActiveMQ настраиваются в файле web.xml, как показано ниже для обеих войн.
web.xml
<resource-env-ref>
<resource-env-ref-name>myConFactory</resource-env-ref-name>
<resource-env-ref-type>org.apache.activemq.ActiveMQConnectionFactory</resource-env-ref-type>
</resource-env-ref>
<resource-env-ref>
<resource-env-ref-name>jms/myTopic</resource-env-ref-name>
<resource-env-ref-type>org.apache.activemq.command.ActiveMQTopic</resource-env-ref-type>
</resource-env-ref>
MessageProducer.java файл в MessageProducer.war, будет публиковать сообщения в теме. Ниже приведен код для того же:
try {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.put(Context.PROVIDER_URL,"vm://localhost");
Context context = new InitialContext(props);
TopicConnectionFactory factory = (TopicConnectionFactory)
context.lookup("java:comp/env/myConFactory");
TopicConnection connection = factory.createTopicConnection();
session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = (Topic) context.lookup("java:comp/env/jms/myTopic");
publisher = session.createPublisher(topic);
TextMessage tm = session.createTextMessage();
tm.setText("Sending Message with ActiveMQ");
publisher.publish(tm);
}
catch(Exceptione e) {
e.printStackTrace();
}
Я развернут MessageProducer.war на Tomcat v7.
MessageConsumer.java файл находится в MessageConsumer.war, будет потреблять сообщения, опубликованные MessageProducer. Ниже приведен код для того же:
public class MessageConsumer extends HttpServlet {
public TopicSession session = null;
public TopicConnection connection = null;
Topic topic = null;
TopicSubscriber subscriber = null;
public void init() {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.put(Context.PROVIDER_URL, "vm://localhost");
Context context = null;
try {
context = new InitialContext(props);
TopicConnectionFactory factory = null;
factory = (TopicConnectionFactory) context.
lookup("java:comp/env/myConFactory");
connection = factory.createTopicConnection();
connection.setClientID("DURABLE_SUBSCRIBER_ID");
session = connection.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
topic = (Topic) context.lookup("java:comp/env/jms/myTopic");
subscriber = session.createDurableSubscriber(topic,
"DURABLE_SUBSCRIBER");
connection.start();
TextMessage tm = (TextMessage) subscriber.receive(3000);
String strMsgRecieved = tm.getText();
} catch (NamingException | JMSException e) {
e.printStackTrace();
}
}
}
Я настроил MessageConsumer класс для работы на автозапуск в web.xml, как показано ниже.
<servlet>
<servlet-name>startupServelt</servlet-name>
<servlet-class>com.myproject.MessageConsumer</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
Я развернул MessageConsumer.war на Tomcat v8. Оба Tomcat v7 и v8 работают на одной физической машине и той же JVM. Когда я запускаю MessageProducer.war runnning, он публикует сообщения в тему, которые я вижу через JConsole. Но когда я начну войну MessageConsumer, она покажет запуск Apache Tomcat 100% за бесконечное время. Это не будет продолжаться. Он не будет показывать никаких исключений или ничего на консоли Tomcat. И он не будет использовать опубликованное сообщение. Пожалуйста, дайте мне знать, что я делаю неправильно или почему он не работает.
Я согласен с вашим комментарием, что startupServlet будет потреблять только одно сообщение во время startUp. Мне нужно зациклиться, чтобы продолжать потреблять. Но в моем случае он даже не потребляет первое сообщение. Он просто продолжает показывать сообщение в нижней части eclipse, «Запуск Tomcat Server 100%». На консоли нет исключения. –
нет причин иметь исключение, так как вы загружаете при запуске 0 экземпляров startupServelt !! измените 0 load-on-startup> на 1 load-on-startup> или вызовите startupServelt с помощью HTTP-запроса, чтобы запустить его. –
Как вы уверены, что два экземпляра Apache работают на одном JVM? –