【问题标题】:How can I subscribe Java program as a consumer in Activemq?如何在 Activemq 中以消费者的身份订阅 Java 程序?
【发布时间】:2013-09-07 19:31:23
【问题描述】:

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

我将Java应用程序名称写为MessageConsumer.java,用于接收来自AMQ代理的消息并放置在Webserver(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 应用程序都在 webserver(Apache Tomcat) 中。到目前为止,我们按照以下方式进行跟踪。

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

知道了,我们正在尝试什么。最初我们不想触发MessageConsumer.java。

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

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

我从不在Apache Camel工作,你能解释清楚吗。

谢谢。

【问题讨论】:

  • 你能重新表述你的问题吗?

标签: java jms activemq


【解决方案1】:

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

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

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

您可以使用下面的 java 代码订阅 client2 和 client3

的主题
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();

}
}    

【讨论】:

    【解决方案2】:

    你检查过 Apache Camel 吗? http://camel.apache.org/

    您可以使用骆驼定义路由,以通过 java 代码在代理上发布和订阅主题(例如与 spring bean 集成)。有很多例子,包括与 activemq 消息代理的交互。

    【讨论】:

    • 我从不使用Apache Camel Api。我将 java 应用程序名称写为 MessageConsumer.java,用于使用 onMessage() 从 AMQ 接收消息。如果您想查看我的代码,我将发布。你能帮我吗,使用Apache Camel我将如何在AMQ中订阅而不通过HTTP触发。
    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2015-08-24
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多