activemq是由apache出品的,是强劲的开源消息总线,支持多种传输协议:in-VM,TCP,SSL,NIO,UDP,JGROUPS,JXTA。
windows环境下,下载解压软件包,点击bin目录下的activemq.bat
linux环境下,运行bin下的命令,./activemq.setup
此时使用的默认服务端口是61616和默认console端口8161。
修改端口,就在conf/activemq.xml中修改
修改console端口8161
activemq如何和spring结合,不要使用5.12.0,建议使用5.11.2或者5.11.1。
Number Of Consumers 消费者 这个是消费者端的消费者数量
Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量。可以理解为总接收数-总出队列数
Messages Enqueued 进入队列的消息 进入队列的总数量,包括出队列的。 这个数量只增不减
Messages Dequeued 出了队列的消息 可以理解为是消费这消费掉的数量
这个要分两种情况理解
在queues里它和进入队列的总数量相等(因为一个消息只会被成功消费一次),如果暂时不等是因为消费者还没来得及消费。
在 topics里 它因为多消费者从而导致数量会比入队列数高。
简单的理解上面的意思就是
当有一个消息进入这个队列时,等待消费的消息是1,进入队列的消息是1。
当消息消费后,等待消费的消息是0,进入队列的消息是1,出队列的消息是1.
在来一条消息时,等待消费的消息是1,进入队列的消息就是2.
没有消费者时 Pending Messages 和 入队列数量一样
有消费者消费的时候 Pedding会减少 出队列会增加
到最后 就是 入队列和出队列的数量一样多
以此类推,进入队列的消息和出队列的消息是池子,等待消费的消息是水流。
MOM 就是面向消息中间件(Message-oriented middleware),是用于以分布式应用或系统中的异步、松耦合、可靠、可扩展和安全通信的一类软件。MOM 的总体思想是它作为消息发送器和消息接收器之间的消息中介,这种中介提供了一个全新水平的松耦合。
activemq的消息形式有:
queue:一对一
topic:一对多
Activemq是实现了JMS规范的系统间远程通信代理,JMS JAVA message service java消息服务。
Domains:消息传递方式,包括点对点(P2P)、发布/订阅(Pub/Sub)两种,P2P也就是以queue作为Destination,一个消息只能被一个消息消费者接收。pub/sub使用topic作为destination,发布者向topic发布消息,订阅者接收来自topic的消息,发送到topic的任何消息,都会自动传递给订阅者。
ActiveMq实例:这里消息形式是以topic形式发送的,客户端有多个监听者,可以接收到生产者的广播消息
消息接收者:
package activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Consumer {
public static void main(String[] args) throws Exception{
//创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://localhost:61616");
//创建连接
Connection connection = connectionFactory.createConnection();
//消费者启动连接
connection.start();
//会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//获取消息队列
Topic queue = session.createTopic("topic1018");
//创建消息消费者
MessageConsumer consumer = session.createConsumer(queue);
//向消费者设置监听
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message){
if(message instanceof TextMessage){
System.out.println("消费者接收到消息:"+message);
}
}
});
System.in.read();
//依次关闭连接
consumer.close();
session.close();
connection.close();
}
}
消息生产者:
package activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TopicProduce {
public static void main(String[] args) throws Exception{
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
//false表示本次会话不会开启事务
/*
* AUTO_ACKNOWLEDGE:自动确认
CLIENT_ACKNOWLEDGE:客户端确认
SESSION_TRANSACTED:事务确认,如果使用事务推荐使用该确认机制
AUTO_ACKNOWLEDGE:懒散式确认,消息偶尔不会被确认,也就是消息可能会被重复发送.但发生的概率很小 */
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("topic1018");
MessageProducer producer = session.createProducer(topic);
TextMessage textMessage = session.createTextMessage("群发通知7");
producer.send(textMessage);
producer.close();
session.close();
connection.close();
}
}