工作终于消停了一阵,之前一直对于消息中间件很好奇,今天抽空看了一下ActiveMq,简单部署在虚拟机上,用程序跑了一下,终于大致明白一些。
1.什么是中间件
非操作系统软件,非业务应用软件,不是直接给最终用户使用,不能直接给用户带来价值的软件,我们就可以称为中间件(比如Dubbo,Tomcat,Jetty,Jboss都是属于的)。
2.什么是ActiveMq
ActiveMQ是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服务)规范。JMS是一组Java应用程序接口,它提供消息的创建、发送、读取等一系列服务。JMS提供了一组公共应用程序接口和响应的语法,类似于Java数据库的统一访问接口JDBC,它是一种与厂商无关的API,使得Java程序能够与不同厂商的消息组件很好地进行通信。
3.ActiveMq模式
ActiveMq有两种模式,一是点对点模式(Quene),二是发布/订阅模式(Topic),点对点模式即消费者不共享生产者生产的消息,发布订阅/模式则可共享。
4.Linux安装
官网地址:http://activemq.apache.org/components/classic/download/
将压缩包解压出来,进入bin目录
使用命令:./activemq console 启动activemq,在地址栏输入地址:http://127.0.0.1:8161,进入activemq管理页面:
5.Quene生产者
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class MessageProducer {
//定义ActivMQ的连接地址
private static final String ACTIVEMQ_URL = "tcp://192.168.88.129:61616";
//定义发送消息的队列名称
private static final String QUEUE_NAME = "MyMessage";
public static void main(String[] args) throws JMSException {
//创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//打开连接
connection.start();
//创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建队列目标
Destination destination = session.createQueue(QUEUE_NAME);
//创建一个生产者
javax.jms.MessageProducer producer = session.createProducer(destination);
//创建模拟100个消息
for (int i = 1 ; i <= 100 ; i++){
TextMessage message = session.createTextMessage("我发送message:" + i);
//发送消息
producer.send(message);
//在本地打印消息
System.out.println("我现在发的消息是:" + message.getText());
}
//关闭连接
connection.close();
}
}
运行代码,控制台答应以下:
那么怎么在ActiveMq里面看到这些消息呢?
点击的时候会让你输入账号和密码,都是admin
6.Quene消费者
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* @author :zkn
* @date :Created in 2019-09-24 20:26
* @description:activeMq消费者
*/
public class MessageConsumer {
//定义ActivMQ的连接地址
private static final String ACTIVEMQ_URL = "tcp://192.168.88.129:61616";
//定义发送消息的队列名称
private static final String QUEUE_NAME = "MyMessage";
public static void main(String[] args) throws JMSException {
//创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(
ACTIVEMQ_URL);
//创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//打开连接
connection.start();
//创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建队列目标
Destination destination = session.createQueue(QUEUE_NAME);
//创建消费者
javax.jms.MessageConsumer consumer = session.createConsumer(destination);
//创建消费的监听
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("获取消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
消费者跑起来会将生产者生产的消息消费掉:
6.创建第二个消费者,将消费者代码重新拷贝一份,作为第二个消费者,生产者生产100条消息,看下两个消费者控制台打印的东西:
对比打印,轻松得到答案,即两个消费者分别消费生产者生产的消息。Topic模式后面再写,今天先到这