Activemq API使用(整合spring)
BlockingQueue,是一个接口,支持泛型。BlockingQueue接口继承了Queue接口,Queue是队列的意思。Queue接口又继承了Collection接口。阻塞队列是一个额外支持两个操作的队列:在队列为空时,从队列中取元素的线程会阻塞。以及在队列满时,往队列里添加元素的线程会阻塞。这两个方法分别是put(E e)和take()。
BlockingQueue接口方法:
方法 | 抛异常 | 返回特定值 | 阻塞 | 超时后返回 |
添加元素 | add(E e) | offer(E e) | put(E e) | offer(E e, log timeout, TimeUnit unit) |
取出队首元素 | remove() | poll() | take() | poll(long timeout, TimeUnit unit) |
查询队首元素 | element() | peek() | - | - |
抛异常,指的是在队列满时添加元素会抛IllegalStateException异常,或者在队列空时取元素会抛NoSuchElementException异常。其实感觉抛异常的方法不太友好,像offer(E e)一样,队列满时添加元素返回false,像poll()一样,队列空时取元素返回null,这多好。
在jdk中,BlockingQueue有7个实现类:
1、ArrayBlockingQueue:一个由数组实现的有界阻塞队列。ArrayBlockingQueue有3个构造器,ArrayBlockingQueue(int capacity)、ArrayBlockingQueue(int capacity, boolean fair)、ArrayBlockingQueue(int capacity, boolean fair, Collection c)。ArrayBlockingQueue有个Object[] items成员变量,数组的长度等于capacity。还有个ReentrantLock lock成员变量,是否公平由fair决定,默认非公平锁。第三个构造器额外有个Collection实例参数,表示可以构造一个有一些初始数据的实例,当Collection实例的长度大于capacity时,会抛出IllegalArgumentException异常。ArrayBlockingQueue是线程安全的,所有操作元素的方法都由同一个ReentrantLock实例加持。
2、LinkedBlockingQueue:一个由链表实现的有界或者无界阻塞队列。在Executors.newFixedThreadPool()和Executors.newSingleThreadExecutor()中用到。LinkedBlockingQueue有3个构造器:LinkedBlockQueue()、LinkedBlockQueue(int capacity)、LinkedBlockQueue(Collection c)。LinkedBlockQueue(int capacity)是有界队列,最多只能放这么多个元素。LinkedBlockQueue()和LinkedBlockQueue(Collection c)内部实现都是LinkedBlockQueue(Integer.MAX_VALUE),队列中可以一直放元素,直到Integer.MAX_VALUE,这就是无界队列了。LinkedBlockQueue内部有2个可重入锁,takeLock和putLock,且都是非公平锁,没得选。LinkedBlockingQueue也是线程安全的,所有的添加元素方法都由一个非公平的ReentrantLock实例putLock加持,所有的取出元素方法、查看元素方法都由一个非公平的ReentrantLock实例takeLock加持。线程池中假如用无界阻塞队列,则核心线程之外的线程不会启动,且系统有OOM的风险。
3、PriorityBlockingQueue:一个支持优先级的无界阻塞队列。PriorityBlockingQueue始终保证出队的元素是优先级最高的元素,内部使用二叉树最小堆算法维护一个Object数组,这个数组是可扩容的,在添加元素时,如果队列中元素的数量大于等于内部数组的长度,就会扩容,所以是无界队列。在构造队列时,可以传一个Comparable对象,如果不传的话,就会用元素的compareTo方法排序。如果元素不是Comparable实例,就会报ClassCastException异常。PriorityBlockingQueue有4个构造器:PriorityBlockingQueue()、PriorityBlockingQueue(int initialCapacity)、PriorityBlockingQueue(int initialCapacity, Comparable comparator)、PriorityBlockingQueue(Collection c)。PriorityBlockingQueue()内部实现是PriorityBlockingQueue(11,null),即初始容量是11,不传入比较器。因为是无界队列,所以不会有队列满的情况,所以put(E e)等同于offer(E e)方法,add(E e)也等同于offer(E e)方法。但是,remove()还是抛异常的,poll()还是返回值的,take()还是阻塞的。PriorityBlockingQueue也是线程安全的,所有操作元素的方法都由同一个非公平的ReentrantLock实例加持。
4、DelayQueue:一个支持优先级、支持延时获取元素的无界阻塞队列。队列中的元素必须实现java.util.concurrent.Delayed接口。在创建元素时,可以指定多久才能从队列中获取元素。当不到指定时间(元素的getDelay(TimeUnit unit)方法返回值大于0)或者队列为空时,remove()会抛异常,poll()会返回null,take()会阻塞,直到时间到。DelayQueue有2个构造器:DelayQueue()、DelayQueue(Collection<Delayed> c)。DelayQueue有一个PriorityQueue类型的成员变量,值是new PriorityQueue(),指定PriorityQueue初始容量是默认值11,无比较器。比较器是Delayed实例,因为Delayed接口继承了Comparable<Delayed>接口,DelayQueue中元素顺序会由元素的compareTo(Delayed d)方法决定。PriorityQueue同PriorityBlockingQueue一样,内部也是使用二叉树最小堆算法维护一个Object数组,数组可扩容。直接遍历DelayQueue队列是无序的,通过remove()/poll()/take()方法取队首元素是有序的。DelayQueue也是线程安全的,所有操作元素的方法都由同一个非公平的ReentrantLock实例加持。
DelayQueue可以用于以下场景:
缓存系统:在把数据放入缓存时,把数据的缓存到期时间戳和id放到队列中,用一个线程持续take,如果取到元素不为null,则表示对应数据到了deadline,就从缓存中删除对应数据。
定时系统:把下次执行时间戳放到队列中,用一个线程持续take,如果取到元素不为null,则表示对应任务到时间了,执行即可。
ScheduledThreadPoolExecutor类中有一个ScheduledFutureTask内部类,实现了Delayed接口。
5、SynchronousQueue:一个不存储任何元素的伪队列。在Executors.newCachedThreadPool()中用到。SynchronousQueue有2个构造器:SynchronousQueue()、SynchronousQueue(boolean fair)。SynchronousQueue()内部实现是SynchronousQueue(false)。fair同样表示阻塞的线程是否公平地访问队列。因为不存储元素,所以add(E e)、remove()恒抛异常,offer(E e)恒返回false,poll()恒返回null,put(E e)、take()恒阻塞。
Executors.newScheduledThreadPool()和Executors.newSingleThreadScheduledExecutor()用到的是DelayedWorkQueue,是ScheduledThreadPoolExecutor的内部类,继承了BlockingQueue接口。
Activemq API使用(整合spring)的更多相关文章
- 消息中间件-activemq实战之整合Spring(四)
前面的理论准备已经很充分,这一节我们来实战:将activemq整合到Spring框架才行中,因为Spring已经集成了JMS,这也为我们配置activermq带来了方便. 1. Spring对jms的 ...
- Activemq API使用(不整合spring)
首先需要引入activemq的jar包,这里用的是5.14.4版本的 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ac ...
- ActiveMQ整合spring、同步索引库
1. Activemq整合spring 1.1. 使用方法 第一步:引用相关的jar包. <dependency> <groupId>org.springframework ...
- ActiveMQ之整合spring
ActiveMQ可以轻松的与Spring进行整合,Spring提供了一系列的接口类,非常的好用! 比如异步消息数据.异步发送邮件.异步消息查询等 <dependency> <grou ...
- JAVAEE——宜立方商城09:Activemq整合spring的应用场景、添加商品同步索引库、商品详情页面动态展示与使用缓存
1. 学习计划 1.Activemq整合spring的应用场景 2.添加商品同步索引库 3.商品详情页面动态展示 4.展示详情页面使用缓存 2. Activemq整合spring 2.1. 使用方法 ...
- 淘淘商城项目_同步索引库问题分析 + ActiveMQ介绍/安装/使用 + ActiveMQ整合spring + 使用ActiveMQ实现添加商品后同步索引库_匠心笔记
文章目录 1.同步索引库问题分析 2.ActiveM的介绍 2.1.什么是ActiveMQ 2.2.ActiveMQ的消息形式 3.ActiveMQ的安装 3.1.安装环境 3.2.安装步骤 4.Ac ...
- ActiveMQ 入门和与 Spring 整合
ActiveMQ 入门演示 activemq 依赖 <dependency> <groupId>org.apache.activemq</groupId> < ...
- e3mall商城的归纳总结9之activemq整合spring、redis的缓存
敬给读者 本节主要给大家说一下activemq整合spring,该如何进行配置,上一节我们说了activemq的搭建和测试(单独测试),想看的可以点击时空隧道前去查看.讲完了之后我们还说一说在项目中使 ...
- webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成
首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...
随机推荐
- 关于"人工智能Python""系统环境变量设置步骤
最近无论是JAVA的环境变量配置,还是Python环境变量配置都有学生问我,我在这里写一下回答,当然我以配置Python的环境变脸来举例.首先需要确定本机电脑上安装上了Python 首先解释一下为什么 ...
- iPhone的home键进果汁了,按起来粘粘的感觉
解决办法是按住home键转动一下,再用棉签蘸点水或者酒精都行(注意:水不要太多,不能让水渗进去),用棉签按压home 键多转几圈就好了.
- Position Independent Code (PIC) in shared libraries
E原文地址:http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/下一文: ...
- 用JS实现表格的高亮显示
1.所用事件详解 2.<thead>,<tbody>标签介绍 <thead> 标签定义表格的表头.该标签用于组合 HTML 表格的表头内容. thead 元素应该与 ...
- Ecliplse导入maven项目applicationContext.xml报错:Referenced file contains errors (http://www.springframework.org/schema/context/spring-context-3.1.xsd). For more information, right click on the message in
刚刚导入的maven项目的Spring配置文件报错: 大体意思是说: 引用的文件包含错误(http://www.springframework.org/schema/context/springing ...
- MooseFS分布式文件系统介绍
一.简介 MooseFS是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本.对于访问的客户端或者用户来说,整个分布式网络文件系统 ...
- Spring容器管理对象和new对象
问题:一个业务类交给spring管理,并自动注入了其他业务类作为属性,方法中通过全局属性调用其他业务类的方法.当该业务类是通过new获取的情况下,该实例的属性会是null(不存在依赖注入实例),调用方 ...
- sklearn的train_test_split函数
train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. from sklearn.model_selection import ...
- Jenkins持续集成企业实战系列之Jenkins持续集成简介及安装-----02
1. Jenkins持续集成简介 注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求, ...
- 使用C#来编写一个异步的Socket服务器
介绍 我最近需要为一个.net项目准备一个内部线程通信机制. 项目有多个使用ASP.NET,Windows 表单和控制台应用程序的服务器和客户端构成. 考虑到实现的可能性,我下定决心要使用原生的soc ...