如何在Activemq中作为使用者订阅Java程序?

如何在Activemq中作为使用者订阅Java程序?,java,jms,activemq,Java,Jms,Activemq,我想在项目中实现Pub/Sub域。基本上,我不是一个java开发人员,使用google帮助。我读了这篇文章。 我开始实现以下结构。 我将Java应用程序名写为MessageConsumer.Java,用于接收来自AMQ代理的消息,并将其放在Webserver(ApacheTomcat)中 MessageConsumercode: package PackageName; import java.io.IOException; import javax.servlet.ServletExc

我想在项目中实现
Pub/Sub
域。基本上,我不是一个java开发人员,使用google帮助。我读了这篇文章。 我开始实现以下结构。

我将Java应用程序名写为
MessageConsumer.Java
,用于接收来自AMQ代理的消息,并将其放在Webserver(ApacheTomcat)中

MessageConsumercode:

 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(ApacheTomcat)中

  • 在将消息发送到Topic之前,我们通过浏览器上的HTTP触发MessageConsumer.java
  • 好的,知道我们在尝试什么。最初我们不想触发
    MessageConsumer.java

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

    我希望你们能理解我们在做什么

    我从不使用ApacheCamel,你能解释清楚吗


    谢谢。

    你查过阿帕奇骆驼吗?


    您可以使用camel定义路由,以便从java代码发布和订阅代理上的主题(例如与springbean集成)。有许多示例,包括与activemq消息代理的交互。

    为什么要触发
    MessageConsumer
    。在您的情况下,调用
    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();
    
    }
    }    
    

    我从不使用apachecamelapi。我将java应用程序名写为MessageConsumer.java,用于使用
    onMessage()
    从AMQ接收消息。如果你想看到我的代码,我会发布。你能帮我一下吗,使用
    apachecamel
    我如何在没有通过HTTP触发的情况下订阅AMQ。你能重新表述你的问题吗?