gpt4 book ai didi

tomcat - 无法在tomcat上使用ActiveMQ消息

转载 作者:行者123 更新时间:2023-11-28 22:07:37 25 4
gpt4 key购买 nike

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

上下文.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 文件中配置,如下所示。

网络.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 时,它会将消息发布到我可以通过 JConsole 看到的主题。但是当我启动 MessageConsumer war 时,它会无限期地显示 Starting Apache Tomcat 100%。它不会继续。它不会在 Tomcat 控制台上显示任何异常或任何内容。它不会使用发布的消息。请让我知道我做错了什么或为什么它不起作用。

最佳答案

Both Tomcat v7 and v8 are running on same physical machine and same JVM.

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

在您的情况下,您使用的是 ActiveMQ 嵌入式代理,根据文档 here ,允许“客户端在 VM 内相互连接”。我认为,就您而言,它不是同一个虚拟机。正在寻找消息的消息消费者正在查看与消息生产者将消息发送到的不同的 ActiveMQ 实例。

关于tomcat - 无法在tomcat上使用ActiveMQ消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39892820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com