无法在tomcat上使用ActiveMQ消息

时间:2016-10-06 09:51:21

标签: tomcat java-ee jms activemq jndi

我正在尝试在Apache Tomcat中配置Apache Active MQ。我有两个war文件,MessageProducer.war和MessageConsumer.war.I已在两个项目的/ WebContent / WEB-INF / lib文件夹中添加了所有ActiveMQ依赖项jar。我在两个战争的context.xml文件中添加了以下资源。并且context.xml文件放在/ WebContent / META-INF /文件夹中,用于两场战争。

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.war中的

MessageProducer.java文件将消息发布到Topic。以下是相同的代码:

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();
}

我在Tomcat v7上部署了MessageProducer.war。

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中的StartUp上运行,如下所示。

<servlet>
    <servlet-name>startupServelt</servlet-name>
    <servlet-class>com.myproject.MessageConsumer</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>

我在Tomcat v8上部署了MessageConsumer.war。 Tomcat v7和v8都在相同的物理机器和相同的JVM上运行。当我启动MessageProducer.war runnning时,它会将消息发布到Topic,我可以通过JConsole看到它。但是当我开始MessageConsumer战争时,它会显示启动Apache Tomcat 100%,无限时间。它不会继续下去。它不会在Tomcat控制台上显示任何异常或任何内容。它不会消耗已发布的消息。请让我知道我做错了什么或为什么它不起作用。

2 个答案:

答案 0 :(得分:2)

  

Tomcat v7和v8都在同一台物理机器上运行   JVM。

我不确定两个Tomcat实例如何在同一个JVM上运行。他们可以使用相同的JDK,是的,他们也可以在同一台物理机器上运行,但他们不会在同一个JVM上运行。他们都会创建自己的JVM,彼此独立。

在您的情况下,您正在使用ActiveMQ嵌入式代理,根据文档here,它允许&#34;客户端在VM内部相互连接&#34;。在你的情况下,我认为,它不是同一个VM。正在查找消息的消息使用者正在查看ActiveMQ的不同实例,而不是消息生产者发送消息的实例。

答案 1 :(得分:1)

它可以用于启动加载。

您的#import <UIKit/UIKit.h> @interface MyVC : UIViewController { NSString* itemstring; } @property (nonatomic, strong) NSString* itemstring; @end 只会在启动时侦听一条消息,您需要在另一个帖子中循环startupServelt或使用subscriber.receive(3000);

hava你tomcat启动或activemq的任何其他日志。

你说:对于两个Tomcats,我已经配置了JRE8默认使用。所以两者都使用相同的JVM !! 所以两者都使用相同的JVM版本但不是相同的运行JVM。  我认为这是问题,MessageConsumer.war正在Tomcat v8上运行,并在Tomcat v7上使用来自AMQ的消息和V8上的MessageProducer.war消息,并在v7上向AMQ发送消息。由于这个原因,一切都很好,你可以看到生产者生产消息,但消费者没有收到任何东西,因为它在另一个JVM而不是生产者,并且没有生产者向他们的经纪人发送消息!!

您需要在同一个Tomcat上部署2个应用程序才能使其正常运行。