我想在项目中实现Pub/Sub
域。基本上我不是java开发人员,使用谷歌帮助。我读了这个Link。
我开始实现以下结构。
我将Java应用程序名称编写为MessageConsumer.java
,用于从AMQ代理接收消息并放置在Webserver(Apache Tomcat)中。
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应用程序都在Web服务器(Apache Tomcat)中。到目前为止,我们遵循以下方式。
知道,我们在尝试什么。最初我们不想触发MessageConsumer.java
。
意味着,假设MessageConsumer.java
在Webserver中。最初如果AMQ从任何地方获取消息,我们的MessageConsumer.java应该处理它们自己的逻辑。
我希望,你们明白我们在尝试什么。
我从不在Apache Camel
工作,你能解释清楚。
感谢。
答案 0 :(得分:9)
为什么要手动触发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();
}
}
答案 1 :(得分:1)
你检查过Apache Camel吗? http://camel.apache.org/
您可以使用camel定义路由,以便从java代码发布和订阅代理上的主题(例如,与spring bean集成)。有许多示例包括与activemq消息代理的交互。