gpt4 book ai didi

java - 如何在Activemq 中以消费者身份订阅Java 程序?

转载 作者:搜寻专家 更新时间:2023-11-01 01:26:53 25 4
gpt4 key购买 nike

我想在项目中实现 Pub/Sub 域。基本上我不是 Java 开发人员,使用谷歌帮助。我读过这个 Link .我开始实现以下结构。 enter image description here

我将 Java 应用程序名称写为 MessageConsumer.java 用于从 AMQ 代理接收消息并放置在 Web 服务器(Apache Tomcat)中。

消息消费者代码:

 package PackageName;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Consumer extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
try {
//creating connectionfactory object for way
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61617");
//establishing the connection b/w this Application and Activemq
Connection connection=connectionFactory.createConnection();
Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic queue=session.createTopic("MessageTesting");
javax.jms.MessageConsumer consumer=session.createConsumer(queue);
//fetching queues from Activemq
MessageListener listener = new MyListener();
consumer.setMessageListener(listener);
connection.start();
}
catch (Exception e) {
// TODO: handle exception
}
}

另外我写了另一个 Java 应用程序来处理消息(MyListener.java)。

MyListener.java 代码:

package PackageName;
import java.io.*;
import java.net.*;
import javax.jms.*;
public class MyListener implements MessageListener {
public void onMessage(Message msg) {
TextMessage msg1=(TextMessage)msg;
//just for your understanding I mention dummy code
//System.out.println(msg1.getText());
MyListener ml=new MyListener();
try {

ml.executeHttp("http://localhost:8080/ExecutableFileProcess/ClassName");
System.out.println(msg1.getText());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}

两个 Java 应用程序都在网络服务器(Apache Tomcat)中。到目前为止,我们按照以下方式进行。

  1. 在向 Topic 发送消息之前,我们在浏览器上通过 HTTP 触发 MessageConsumer.java。

没错,我们正在尝试什么。最初我们不想触发 MessageConsumer.java

意味着,假设 MessageConsumer.java 在 Web 服务器中。最初,如果 AMQ 从任何地方获取消息,我们的 MessageConsumer.java 应该处理它们自己的逻辑。

我希望你们明白我们正在尝试什么。

我从来没有研究过Apache Camel,你能解释清楚吗。

谢谢。

最佳答案

为什么要手动触发 MessageConsumer.java,因为调用 Subscriber 是 ActiveMQ 在您的情况下的责任。

从您的主题将您的消息发布到 ActiveMQ 服务器,所有订阅该主题的订阅者都将收到您的消息,而无需手动触发它。

将此作为您的初始 POC http://activemq.apache.org/hello-world.html

您可以使用下面的java代码订阅client2client3的主题

import javax.jms.*;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class consumer {
// URL of the JMS server
private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;

// Name of the topic from which we will receive messages from = " testt"

public static void main(String[] args) throws JMSException {
// Getting JMS connection from the server

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();

Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);

Topic topic = session.createTopic("testt");

MessageConsumer consumer = session.createConsumer(topic);

MessageListener listner = new MessageListener() {
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("Received message"
+ textMessage.getText() + "'");
}
} catch (JMSException e) {
System.out.println("Caught:" + e);
e.printStackTrace();
}
}
};
consumer.setMessageListener(listner);

try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
connection.close();

}
}

关于java - 如何在Activemq 中以消费者身份订阅Java 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672354/

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