1、JMS开发的基本步骤
- 创建一个ConnectionFactory
- 通过ConnectionFactory来创建JSM connection
- 启动JMS connection
- 通过connection创建JMD connection
- 创建JMS destination
- 创建JMS producer 或者创建JMS message并设置destination
- 创建JMS consumer或者注册一个JMS message listener
- 发送或者接受JMS message(s)
- 关闭所有的JMS资源
- (connection、session、producer、consumer等)
2、两种消费模式
同步堵塞方式(receive())
订阅者或者接受者调用messageconsumer的setmessageListener(MessageListener listener)注册一个消息监听器
当消息到达之后,系统自动调用监听器MessageListener的onMessage(Message message)方法。
3、topic和queen的区别
比较 | Topic模式队列 | Queue模式队列 |
工作模式 | “订阅-发布”模式,如果当前没有订阅者,消息将会被丢弃,如果有多个订阅者,那么这些订阅者都会受到消息 | “负载均衡”模式,如果当前乜有消费者,消息也不会被丢弃;如果有多个消费者,那么一条消息只会发送给其中一个消费者,并且要求消费者ack消息 |
有无状态 | 无状态 | queue数据默认会在mq服务器上以文件形式保存,比如ActiveMq一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB村建 |
传递完整性 | 如果没有订阅者,消息将会被丢弃 | 消息不会被丢弃 |
处理效率 | 由于消息要按照订阅者的数量进行复制,所以处理性能会随着订阅的增加而明显降低,并且还要结合不同的消息协议自身的性能差异 | 由于一条消息只能发送给一个订阅者,所以就算消费者再多,性能也不会有明显降低。当然不同的消息协议的具体性能也是由差异的 |
ActiveMq 应用场景:
https://blog.csdn.net/qinweili751/article/details/80620104
ActiveMq投递:
1、异步投递;2、延时投递;3、定时投递;
producer.jmsTemplate.send((Session session) -> {
TextMessage textMessage = session.createTextMessage("**********spring和ActiveMQ整合的case333*********");
//延时投递 --> 延时时间 --> 3S
textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 3000);
//延时投递 --> 重复投递的时间间隔
textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 4000);
//延时投递 --> 投递次数
textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 5);
return textMessage;
});
ActiveMq的重试机制:
https://blog.csdn.net/qq_20597727/article/details/81416812
ActiveMq防止重试:
可用redis、数据库主键
ActiveMq异步投递: