下载activeMq所依赖的jar包,本次使用5.11.2版本的jar包,有些版本可能会包含spring的部分方法,导致报错需要注意
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.11.2</version>
</dependency>
activeMq两种发布形式
queue 队列模式,点对点
producer生产者发送消息
@Test
public void queueProducerTest() throws Exception{
// 第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。
String brokerURL = "tcp://192.168.25.203:61616";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
// 第二步:使用ConnectionFactory对象创建一个Connection对象。
Connection connection = connectionFactory.createConnection();
// 第三步:开启连接,调用Connection对象的start方法。
connection.start();
// 第四步:使用Connection对象创建一个Session对象。
// connection.createSession(transacted, acknowledgeMode)
// 第一个参数transacted 是否开启事务,如果消息没发送成功,则重新发送,一般不开启
// 第二个参数acknowledgeMode 如果开启事务,此参数无意义,如果不开启,此处为应答模式,自动应答,手动应答 一般自动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Queue对象。
// 参数:队列的名称。
Queue queue = session.createQueue("test-queue");
// 第六步:使用Session对象创建一个Producer对象。
MessageProducer messageProducer = session.createProducer(queue);
// 第七步:创建一个Message对象,创建一个TextMessage对象。
// TextMessage textMessage = new ActiveMQTextMessage();
// textMessage.setText("hello");
TextMessage textMessage = session.createTextMessage("hello");
// 第八步:使用Producer对象发送消息。
messageProducer.send(textMessage);
// 第九步:关闭资源。
messageProducer.close();
session.close();
connection.close();
}
消息发送成功 发送到activeMq服务中 相当于中间人
点击队列名
点击messageID
Consumer消费者接收消息
@Test
public void testQueueConsumer() throws Exception {
// 第一步:创建一个ConnectionFactory对象。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.203:61616");
// 第二步:从ConnectionFactory对象中获得一个Connection对象。
Connection connection = connectionFactory.createConnection();
// 第三步:开启连接。调用Connection对象的start方法。
connection.start();
// 第四步:使用Connection对象创建一个Session对象。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 第五步:使用Session对象创建一个Destination对象。和发送端保持一致queue,并且队列的名称一致。
Queue queue = session.createQueue("test-queue");
// 第六步:使用Session对象创建一个Consumer对象。
MessageConsumer consumer = session.createConsumer(queue);
// 第七步:接收消息。
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
String text = null;
//取消息的内容
text = textMessage.getText();
// 第八步:打印消息。
System.out.println(text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//等待键盘输入 避免直接关闭
System.in.read();
// 第九步:关闭资源
consumer.close();
session.close();
connection.close();
}
发送3条消息 入队3
消费者1 入队3 队列移除3
topic 主题推送发布模式 类似于公众号
producer生产者发送消息
@Test
public void topicProducerTest() throws Exception{
// 第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。
String brokerURL = "tcp://192.168.25.203:61616";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
// 第二步:使用ConnectionFactory对象创建一个Connection对象。
Connection connection = connectionFactory.createConnection();
// 第三步:开启连接,调用Connection对象的start方法。
connection.start();
// 第四步:使用Connection对象创建一个Session对象。
// connection.createSession(transacted, acknowledgeMode)
// 第一个参数transacted 是否开启事务,如果消息没发送成功,则重新发送,一般不开启
// 第二个参数acknowledgeMode 如果开启事务,此参数无意义,如果不开启,此处为应答模式,自动应答,手动应答 一般自动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Topic对象。
// 参数:队列的名称。
Topic topic = session.createTopic("test-topic");
// 第六步:使用Session对象创建一个Producer对象。
MessageProducer messageProducer = session.createProducer(topic);
// 第七步:创建一个Message对象,创建一个TextMessage对象。
// TextMessage textMessage = new ActiveMQTextMessage();
// textMessage.setText("hello");
TextMessage textMessage = session.createTextMessage("hello-topic");
// 第八步:使用Producer对象发送消息。
messageProducer.send(textMessage);
// 第九步:关闭资源。
messageProducer.close();
session.close();
connection.close();
}
点击test-topic 只出现一个测试用发消息页面
看不到入队的消息 因为不是队列,所以发送后如果没有消费者,就不会像queue一样保存在服务器,这也是和点对点形式的区别
创建Consumer消费者接收消息
@Test
public void testTopicConsumer() throws Exception {
// 第一步:创建一个ConnectionFactory对象。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.203:61616");
// 第二步:从ConnectionFactory对象中获得一个Connection对象。
Connection connection = connectionFactory.createConnection();
// 第三步:开启连接。调用Connection对象的start方法。
connection.start();
// 第四步:使用Connection对象创建一个Session对象。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 第五步:使用Session对象创建一个Destination对象。和发送端保持一致queue,并且队列的名称一致。
Topic topic = session.createTopic("test-topic");
// 第六步:使用Session对象创建一个Consumer对象。
MessageConsumer consumer = session.createConsumer(topic);
// 第七步:接收消息。
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
String text = null;
//取消息的内容
text = textMessage.getText();
// 第八步:打印消息。
System.out.println(text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//等待键盘输入 避免直接关闭
System.in.read();
// 第九步:关闭资源
consumer.close();
session.close();
connection.close();
}
再次运行消费者测试方法创建一个消费者 并发送一条消息
入队消息变为3,出队消息数量变为3,证明一条消息有两个消费者接收到