—— ActiveMQ入门 ——
Apache ActiveMQ™是最流行的开源、多协议、基于java的消息传递服务器。它支持行业标准协议,因此用户有多种语言和平台的客户端可以选择。可以连接到C、C++、Python、. net、java等语言。使用无处不在的AMQP协议集成多平台应用程序。在websockets上的在web应用程序之间交换消息。使用MQTT管理您的物联网设备。支持您现有的JMS基础结构及其他内容。ActiveMQ提供了支持任何消息传递用例的强大和灵活性。
目前ActiveMQ有两种“口味”——“经典”5.x broker和“下一代”Artemis broker。一旦Artemis达到了与5.x等值的足够水平的功能。它将成为ActiveMQ 6。
1.ActiveMQ是什么?
它是基于 Java 中的 JMS 消息服务规范实现的一个消息中间件,通过中间件我们可以实现异步调用、流量削峰等。
2.ActiveMQ安装
1) 将 apache-activemq-5.15.11-bin.tar.gz 上传到服务器
2) 解压 tar -zxvf apache-activemq-5.15.11-bin.tar.gz
3) 启动
进到bin目录
./activeMQ start ./activeMQ status ./activemq console hostnamectl set-hostname Java ./activemq start
<dependency> <groupId>org.apache.activemqgroupId> <artifactId>activemq-allartifactId> <version>5.15.9version>dependency>
3.一对一
package com.zero.day1;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * ActiveMQ测试类 Hello World */public class Demo1 { public static void main(String[] args) { Demo1.producerQuene(); } public static void producerQuene (){ try { // Create a ConnectionFactory 创建工厂连接对象 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); // Create a Connection 使用连接工厂创建一个连接对象 Connection connection = connectionFactory.createConnection(); connection.start(); // Create a Session 创建会话session对象 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // create the destination (Topic or Quene) 创建目标对象(一对一or一对多) Destination destination = session.createQueue("TEST.FOO1"); // Create a MessageProducer from the Session to the Topic or Quene 创建生产者对象 MessageProducer producer = session.createProducer(destination); String text = "hello world"; // create a messages 创建一个消息对象 TextMessage message = session.createTextMessage(text); // tell the producer to send the message 发送消息 producer.send(message); System.out.println("发送成功"); // clean up 关闭资源 session.close(); connection.close(); } catch (Exception e) { System.out.println("Caught" + e); e.printStackTrace(); } }}public static void consumerQuene () { try { // create a connectionFactory 创建工厂连接对象 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); // create a connection 使用连接工厂创建一个连接对象 Connection connection = connectionFactory.createConnection(); connection.start(); //create a session 创建会话session对象 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // create the destination(Topic or Quene) 创建目标对象(一对一or一对多) Destination destination = session.createQueue("TEST.FOO1"); // create a MessageConsumer from the session to the Topic or Quene 创建消费者对象 MessageConsumer consumer = session.createConsumer(destination); // wait for a message 创建一个消息对象 Message message = consumer.receive(1000); if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message ; String text = textMessage.getText(); System.out.println("Received: " + text); } else { System.out.println("Received: " + message); } consumer.close(); session.close(); connection.close(); } catch (Exception e) { System.out.println("Caught: " + e); e.printStackTrace(); } }
4.一对多
package com.zero.day2;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * 使用ActiveMQ操作一对多消息通信 */public class ProducerDemo { public static void main(String[] args) { ProducerDemo.topicProducer(); } public static void topicProducer () { try { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("myTopic"); MessageProducer producer = session.createProducer(topic); TextMessage textMessage = session.createTextMessage("hello"); producer.send(textMessage); System.out.println("消息已经发送: " + textMessage.getText()); producer.close(); session.close(); connection.close(); } catch (Exception e) { System.out.println("Caught" + e); e.printStackTrace(); } }}package com.zero.day2;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;public class ConsumerDemo { public static void main(String[] args) { ConsumerDemo.topicConsumer(); } public static void topicConsumer () { try { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("myTopic"); MessageConsumer consumer = session.createConsumer(topic); consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { if(message instanceof TextMessage){ TextMessage textMessage = (TextMessage)message; try { System.out.println(textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } } }); System.in.read(); consumer.close(); session.close(); connection.close(); } catch (Exception e) { System.out.println("Caught: " + e); e.printStackTrace(); } }}
—— spring整合activemq ——
1.添加Spring依赖
<dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-contextartifactId>dependency>
2.spring的配置文件 application.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="getConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://127.0.0.1:61616" /> bean> <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"> <property name="targetConnectionFactory" ref="getConnectionFactory" /> bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory" /> bean> <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg> <value>spring-queue-demovalue> constructor-arg> bean> <bean id="queueConsumer" class="com.zero.day3.QueueConsumer" /> <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="queueDestination" /> <property name="messageListener" ref="queueConsumer" /> bean>beans>
3.生产者
package com.zero.day3;import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;import javax.jms.*;/** * spring整合ActiveMQ 生产者 */public class QueueProducer{ public static void main(String[] args) { QueueProducer queueProducer = new QueueProducer(); queueProducer.producerQueue(); } public void producerQueue () { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class); Destination queueDestination = (Destination)context.getBean("queueDestination"); jmsTemplate.send(queueDestination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { TextMessage textMessage = session.createTextMessage(); textMessage.setText("hello spring整合actviceMQ"); System.out.println("生产者启动成功,发送的消息为:" + textMessage.getText()); return textMessage; } }); }}
4.消费者
package com.zero.day3;import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;import javax.xml.soap.Text;import java.io.IOException;/** * spring整合ActviceMQ 消费者 */public class QueueConsumer implements MessageListener { public void onMessage(Message message) { TextMessage textMessage = (TextMessage)message; try { System.out.println("消费者接收到的消息:" + textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } public static void main(String[] args) { //初始化spring容器 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); //等待 try { System.in.read(); } catch (IOException e) { e.printStackTrace(); } }}