我正在尝试在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控制台上显示任何异常或任何内容。它不会消耗已发布的消息。请让我知道我做错了什么或为什么它不起作用。
答案 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个应用程序才能使其正常运行。