1、安装
官方网址:http://activemq.apache.org/activemq-5154-release.html
window:
先从官网上下载window压缩包,并解压,打开bin目录,会看到三个可执行文件。
activemq是直接运行。InstallService则是将此应用一服务的方式启动,选择这个比较好一些。
启动成功后,我们可以访问activemq管理页面。http://localhost:8161 默认是8161端口。
Linux:
先从官网下载Linux压缩包,解压。进入bin目录,使用 activemq start 启动服务。
2、maven依赖
<dependency>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.7.0</version>
</dependency>
3、代码实现:
3.1常量类
public class MqConstans {
public static final String URL = "tcp://127.0.0.1:61616";
public static final String QUEU_NAEM = "test-queue";
public static final String TOPIC_NAME = "test-topic";
}
3.2 p2p模式
生产者:生产100个消息
public class Producter {
public static void main (String[] args) throws JMSException {
//1.获取连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory(MqConstans.URL);
//2.获取连接
Connection connection = factory.createConnection();
//3.启动连接
connection.start();
//4.创建会话,第一个参数的意思是是否使用事务,第二个是应答模式,这个设置为自动应答模式。session可以创建消费者,生产者,消息来源,消息等。比较重要
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建消息来源,目标
Destination destination = session.createQueue(MqConstans.QUEU_NAEM);
//6.创建生产者
MessageProducer producer = session.createProducer(destination);
for (int i=0;i<100;i++){
//7.创建消息
TextMessage textMessage = session.createTextMessage();
textMessage.setText("text" + i);
//8.发送消息
producer.send(textMessage);
}
System.out.println("发送成功");
//9.关闭连接
connection.close();
}
}
消费者:前半部分和生产者一样,只贴出下半部。
//创建消费者
MessageConsumer consumer = session.createConsumer(destination);
//使用消息监听,由于是异步的,close不能立即执行,否则会监听不到消息
//或者循环调用consumer的reciver方法,立即执行,这是同步的。可以直接关闭
consumer.setMessageListener(o->{
try {
TextMessage message = (TextMessage) o;
System.out.println(message.getText());
} catch (JMSException e) {
e.printStackTrace();
}
});
//connection.close();
运行,可以看到生产者的100条消息全部被消费者消费。在执行消费者,这回没有任何消息打出,这说明在p2p模式中,消息只能被消费一次。
在调用生产者生产100条消息,这回创建俩个消费者,可以看到是均分消费消息的。
3.3主题模式
代码几乎一样,只是destination不同,一个是queue,一个是topic。不同的代码:
//创建主题
Destination destination = session.createTopic(MqConstans.TOPIC_NAME);
我们先启动生产者,再启动消费者,发现消费者并没有接收到任何消息。
更改启动顺序,发现消费者收到消息。
启动俩个消费者,启动生产者,俩个消费者的消息完全一样。
3.4俩种方式异同:
主题模式需要消费者先订阅再启动发布者,然后消费者才会接受(就好像你订报纸一样,只有你订报纸之后才能收到报)而队列模式是只要消息队列里面有消息,消费者打开就可以消费,不管实在生产者打开前还是后。主题模式是多个消费者都能全盘接收到所有消息;而队列模式是多个消费者的多个连接(不是单纯的多个消费者而是多个连接!)平衡负载分配信息(可以大概理解为平均分)。
主题模式类似微信公众号,只要关注了某个公众号,那么公众号的消息推送对每个粉丝来说都是一样的。
p2p模式类似于我们的QQ俩人聊天,即使你不在线,但是消息已存储在队列中,只要你上线,就可以获取到消息(多个消费者不考虑)。