2016-10-06 3 views
1

Я пытаюсь настроить 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. И он не будет использовать опубликованное сообщение. Пожалуйста, дайте мне знать, что я делаю неправильно или почему он не работает.

ответ

1

Это нормально для загрузки при запуске.

Ваш startupServelt будет прослушивать только одно сообщение при запуске, вам нужно зациклиться на subscriber.receive(3000); в другом потоке или использовать MessageListener.

hava у вас есть другие журналы с запуском tomcat или activemq.

Вы говорите: Для обоих Tomcats я настроил JRE8, который будет использоваться по умолчанию. Поэтому оба используют тот же JVM !! Таким образом, оба используют одну и ту же версию JVM, но не такую ​​же запущенную JVM. Я думаю, что здесь проблема, MessageConsumer.war работает на Tomcat v8 и потребляет сообщения от AMQ на v8 и MessageProducer.war на Tomcat v7 и отправляет сообщения AMQ на v7. по этой причине все в порядке, вы можете видеть продюсера, производящего сообщения, но потребитель ничего не получает, поскольку он находится в другой JVM, чем производитель, и нет производителя для отправки сообщений своему брокеру !!

вам нужно развернуть свои 2 приложения на одном и том же Tomcat, чтобы он работал.

+0

Я согласен с вашим комментарием, что startupServlet будет потреблять только одно сообщение во время startUp. Мне нужно зациклиться, чтобы продолжать потреблять. Но в моем случае он даже не потребляет первое сообщение. Он просто продолжает показывать сообщение в нижней части eclipse, «Запуск Tomcat Server 100%». На консоли нет исключения. –

+0

нет причин иметь исключение, так как вы загружаете при запуске 0 экземпляров startupServelt !! измените 0 на 1 или вызовите startupServelt с помощью HTTP-запроса, чтобы запустить его. –

+0

Как вы уверены, что два экземпляра Apache работают на одном JVM? –

2

Оба Tomcat v7 и v8 работают на одной физической машине и одинаковые JVM.

Я не уверен, как два экземпляра Tomcat работают на одной JVM. Они могут использовать один и тот же JDK, да, и они могут работать на одной и той же физической машине, но они не будут находиться на одной JVM. Они оба будут запускать свою собственную JVM, независимо друг от друга.

В вашем случае вы используете встроенный брокер ActiveMQ, который, согласно документации here, позволяет «клиентам подключаться друг к другу внутри виртуальной машины». В вашем случае, я думаю, это не та же виртуальная машина. Потребитель сообщений, который ищет сообщение, смотрит на другой экземпляр ActiveMQ, чем тот, на который отправитель сообщения отправляет сообщение.

+0

№. Для обоих Tomcats я настроил JRE8, который будет использоваться по умолчанию. Поэтому оба используют один JVM. –

+0

@BabannaDuggani AdityaK совершенно прав, вы настроили своих кошек на использование версии JRE8, но это не значит, что JVM! –

+0

@BabannaDuggani Если вы используете одну и ту же JRE для двух разных сред, это не значит, что вы используете одну и ту же JVM! Каждый экземпляр сервера будет создавать свою собственную JVM, и они будут работать независимо друг от друга. Это будут два отдельных процесса на уровне ОС. Это то, что происходит и в вашем случае. –

Смежные вопросы