activeMQ简介
- 多种语言和协议编写客户端
- 完全支持JMS1.1和J2EE1.4规范
- 对Springde zhichi ,ActiveMQ很容易内嵌到使用Spring的系统中
- 支持多种传送协议
- 支持通过JDBC和journal提供高速的消息持久化
- 从设计上保证了高性能的集群,客户端端-服务器,点对点
- 支持Ajax
- 支持与Axis的整合,WebServices
- 可以很容易的调用内嵌JMSprovider,进行测试
JMS名词解释
- Destination:目的地,JMS Provider(消息中间件)负责维护,用于对Message进行管理的对象,MessageProducer需要指定Destination才能消息,MessageConsumer需要指定Destination才能接受消
- Producer:消息生成者,负责发送Message到目的地,应用接口为MessageProducer。在JMS规范中,所有的标准定义在JAVAX.JMS包中
- Consumer:消息消费者,负责从目的地中消息【处理|监听|订阅】Message,应用接口为MessageConsumer
- Message:消息,消息封装一次同学的内容。常见的类型有:StreamMessage、BytesMesasge、TextMessage、ObjectMessage、MapMessage。
- Queue(队列目的地)&Topic(主题目的地):都是Destination的子接口,Queue特点:队列中的消息,默认只能由唯一的一个消费者处理,一旦处理消息删除;Topic特点:主题中的消息,会发送给所有的消费者同事处理,只有在消息可以重复处理的业务场景中课使用;
- PTP(Point to Point):点对点消息模型,就是基于Queue实现的消息处理方式;
- PUB&SUB(Publish & Subscribe):消息的发布、订阅模型,是基于Topic实现的消息处理方式
PTP处理模式
消息生产者生产消息发送到 queue 中,然后消息消费者从 queue 中取出并且消费消息。 消息被消费以后,queue 中不再有存储,所以消息消费者不可能消费到已经被消费的消
息。
Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费、其它 的则不能消费此消息了。 当消费者不存在时,消息会一直保存,直到有消费消费
// 生产者
@Service
public class ProducterService {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
public void sendMsg(String msg){
jmsMessagingTemplate.convertAndSend("msg", msg);
System.out.println("msg:"+msg+"\t发送成功!");
}
}
// 消费者
@Service
public class ConsumeService {
@JmsListener(destination="msg")
public void receiveMsg(String msg){
System.out.println("接受消息:"+msg);
}
}
// 测试类
@SpringBootTest(classes=App.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ProducterTest {
@Autowired
private ProducterService producterService;
@Test
public void testPro1(){
for(int i=1;i<=10;i++){
System.out.println("send---start");
producterService.sendMsg("study--" + i);
System.out.println("send---end\n");
}
}
}
输出内容:
send---start
接受消息:study--1
msg:study--1 发送成功!
send---end
send---start
接受消息:study--2
msg:study--2 发送成功!
send---end
send---start
接受消息:study--3
msg:study--3 发送成功!
send---end
send---start
接受消息:study--4
msg:study--4 发送成功!
send---end
send---start
接受消息:study--5
msg:study--5 发送成功!
send---end
send---start
接受消息:study--6
msg:study--6 发送成功!
send---end
send---start
接受消息:study--7
msg:study--7 发送成功!
send---end
send---start
接受消息:study--8
msg:study--8 发送成功!
send---end
send---start
接受消息:study--9
msg:study--9 发送成功!
send---end
send---start
接受消息:study--10
msg:study--10 发送成功!
send---end
Publish/Subscribe 处理模式(Topic)
消息生产者(发布)将消息发布到topic中,同事有多个消息消费者(订阅)消费该消息,
和点对点方式不同,发布到topic的消息会被所有订阅者消费。
当生产者发布消息,不管是否有消费者。都不会保存消息,
一定要先有消息的消费者,后有消息的生产者。
package com.mq.service;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
@Service
public class ConsumeService {
@JmsListener(destination="msg")
public void receiveMsg(String msg){
System.out.println("msg-接受消息:"+msg);
}
@JmsListener(destination="msg")
public void receiveMsg2(String msg){
System.out.println("msg2接受消息:"+msg);
}
@JmsListener(destination="topic")
public void receiveTopic(String msg){
System.out.println("topic接受消息:"+msg);
}
@JmsListener(destination="topic")
public void receiveTopic2(String msg){
System.out.println("topic2接受消息:"+msg);
}
}
package com.mq.service;
import javax.jms.Destination;
import javax.jms.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;
@Service
public class ProducterService {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
/* @Autowired
private Queue queue;*/
public void sendMsg(Destination destination,String msg){
jmsMessagingTemplate.convertAndSend(destination, msg);
System.out.println("msg:"+msg+"\t发送成功!");
}
}
package activemqTest;
import javax.jms.Destination;
import javax.jms.Queue;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.activemq.command.ActiveMQTopic;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.mq.App;
import com.mq.service.ProducterService;
@SpringBootTest(classes=App.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ProducterTest {
@Autowired
private ProducterService producterService;
@Test
public void testPro1(){
/*Destination destination1 = new ActiveMQQueue("msg");
for(int i=10;i<=15;i++){
System.out.println("send---start");
producterService.sendMsg(destination1,"destination1:" + i);
System.out.println("send---end\n");
}
System.out.println("*******************\n");*/
// spring.jms.pub-sub-domain=true
Destination destination2 = new ActiveMQTopic("topic");
for(int i=1;i<=5;i++){
System.out.println("send---start");
producterService.sendMsg(destination2,"destination1:" + i);
System.out.println("send---end\n");
}
}
}
具体代码,请参照https://download.csdn.net/download/hualele/11163307