oracle aq_通过Java 8流使用Oracle AQ

oracle aq

Oracle数据库最令人敬畏的功能之一是Oracle AQ:Oracle数据库高级队列 。 AQ API直接在数据库中实现了完整的事务性消息传递系统。

在数据库处于系统中心的经典体系结构中,使用AQ进行进程间通信时,多个应用程序(其中一些是用Java编写的,其他应用是用Perl或PL / SQL编写的,等等)访问同一数据库。太好了 如果您更喜欢Java EE,则可以购买基于Java的MQ解决方案,并将该消息总线/中间件放在系统体系结构的中心。 但是,为什么不使用数据库呢?

如何在jOOQ中使用PL / SQL AQ API

用于AQ消息入队和出队的PL / SQL API非常简单,可以使用jOOQ的OracleDSL.DBMS_AQ API从Java轻松访问它。

此处使用的队列配置如下所示:

CREATE OR REPLACE TYPE message_t AS OBJECT (ID         NUMBER(7),title      VARCHAR2(100 CHAR)
)
/BEGINDBMS_AQADM.CREATE_QUEUE_TABLE(queue_table => 'message_aq_t',queue_payload_type => 'message_t');DBMS_AQADM.CREATE_QUEUE(queue_name => 'message_q',queue_table => 'message_aq_t');DBMS_AQADM.START_QUEUE(queue_name => 'message_q');COMMIT;
END;
/

并且jOOQ代码生成器将生成有用的类,并将所有类型信息直接与其关联(简化示例):

class Queues {static final Queue<MessageTRecord> MESSAGE_Q = new QueueImpl<>("NEW_AUTHOR_AQ", MESSAGE_T);
}class MessageTRecord {void setId(Integer id) { ... }Integer getId() { ... }void setTitle(String title) { ... }String getTitle() { ... }MessageTRecord(Integer id, String title) { ... }
}

然后,可以使用这些类直接在生成的队列引用上安全地使消息类型入队和出队:

// The jOOQ configuration
Configuration c = ...// Enqueue a message
DBMS_AQ.enqueue(c, MESSAGE_Q, new MessageTRecord(1, "test"));// Dequeue it again
MessageTRecord message = DBMS_AQ.dequeue(c, MESSAGE_Q);

很简单,不是吗?

现在,让我们利用Java 8功能

消息队列就是无限(阻塞)消息流。 从Java 8开始,我们为此类消息流提供了强大的API,即Stream API。

这就是为什么我们为即将到来的jOOQ 3.8添加了新的API,将现有的jOOQ AQ API与Jav​​a 8 Streams相结合的原因:

// The jOOQ configuration
Configuration c = ...DBMS_AQ.dequeueStream(c, MESSAGE_Q).filter(m -> "test".equals(m.getTitle())).forEach(System.out::println);

上面的流管道将在MESSAGE_Q队列上侦听,使用所有消息,过滤掉不包含"test"的消息,并打印其余消息。

阻止流

有趣的是,这是一个无限的阻塞流。 只要队列中没有新消息,流管道处理就会简单地在队列上阻塞,等待新消息。 这对于顺序流不是问题,但是在调用Stream.parallel() ,会发生什么?

jOOQ将消耗事务中的每条消息。 jOOQ 3.8事务在ForkJoinPool.ManagedBlocker运行:

static <T> Supplier<T> blocking(Supplier<T> supplier) {return new Supplier<T>() {volatile T result;@Overridepublic T get() {try {ForkJoinPool.managedBlock(new ManagedBlocker() {@Overridepublic boolean block() {result = supplier.get();return true;}@Overridepublic boolean isReleasable() {return result != null;}});}catch (InterruptedException e) {throw new RuntimeException(e);}return asyncResult;}};
}

这不是很多魔术。 当ManagedBlockerForkJoinWorkerThread运行时,它会运行一些特殊的代码,以确保线程的ForkJoinPool不会由于线程耗尽而死锁。 有关更多信息,请在此处阅读此有趣的文章:http: //zeroturnaround.com/rebellabs/java-parallel-streams-are-bad-for-your-health

或以下堆栈溢出答案: http : //stackoverflow.com/a/35272153/521799

因此,如果您想要超快速的并行AQ出队过程,请运行:

// The jOOQ configuration. Make sure its referenced
// ConnectionPool has enough connections
Configuration c = ...DBMS_AQ.dequeueStream(c, MESSAGE_Q).parallel().filter(m -> "test".equals(m.getTitle())).forEach(System.out::println);

而且您将拥有多个线程,这些线程将使消息并行出队。

不想等待jOOQ 3.8?

没问题。 使用当前版本并将dequeue操作包装在您自己的Stream

Stream<MessageTRecord> stream = Stream.generate(() ->DSL.using(config).transactionResult(c ->dequeue(c, MESSAGE_Q))
);

做完了

奖励:异步出队

在我们讨论时,排队系统的另一个很好的功能是它们的异步性。 在Java 8中, CompletionStage是一个非常有用的用于建模(和组合)异步算法的类型,它是默认实现CompletableFuture ,它再次在ForkJoinPool执行任务。

使用jOOQ 3.8,您可以再次简单地调用

// The jOOQ configuration. Make sure its referenced
// ConnectionPool has enough connections
Configuration c = ...CompletionStage<MessageTRecord> stage =
DBMS_AQ.dequeueAsync(c, MESSAGE_Q).thenCompose(m -> ...)...;

敬请期待jOOQ博客上的另一篇文章,我们将研究更复杂的异步用例,用jOOQ 3.8和Java 8阻止SQL语句。

翻译自: https://www.javacodegeeks.com/2016/02/using-oracle-aq-via-java-8-streams.html

oracle aq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言建立多个有名管道,命名管道一个非常经典的题目

#include /*特别注意写管道时&#xff0c;设置打开管道文件的格式必须为可写*/#define FIFO_SERVER "myfifo"#define OPENMODE (O_WRONLY | O_NONBLOCK)int main(int argc, char **argv){int fd;int nwrite;/*打开管道文件&#xff0c;可写非阻塞*/if ((fd open(FIF…

jit 方法内联_JIT编译器,内联和转义分析

jit 方法内联即时&#xff08;JIT&#xff09; 即时&#xff08;JIT&#xff09;编译器是Java虚拟机的大脑。 JVM中对JIT编译器的影响最大。 一会儿&#xff0c;让我们退后一步&#xff0c;看看已编译和未编译语言的示例。 诸如Go&#xff0c;C和C 之类的语言之所以称为编译语…

nodejs android 推送,利用Nodejs怎么实现一个微信小程序消息推送功能

利用Nodejs怎么实现一个微信小程序消息推送功能发布时间&#xff1a;2021-01-20 13:55:29来源&#xff1a;亿速云阅读&#xff1a;92作者&#xff1a;Leah今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程序消息推送功能&#xff0c;可能很多人都不太了解&#xff0c;为了让…

kafka spark_您在2016年会做什么? Apache Spark,Kafka,Drill等

kafka spark让我们玩得开心。 这是新的一年的开始-我们正处于新事物的门槛上-因此让我们期待您在2016年可能会做的事情。现在我知道做出预测的风险&#xff0c;尤其是有记录的预测&#xff0c;但是我很高兴您能在一年后回访&#xff0c;看看我对2016年的预测是如何完成的。 您…

android ini文件格式,ini是什么格式的文件?ini文件怎么操作?

类型&#xff1a;Android平台大小&#xff1a;622KB语言&#xff1a;中文 评分&#xff1a;5.0标签&#xff1a;立即下载ini文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改INI文件,来改变应用程序和系统的很多配置。自定义一个文件&#xff0c;会成一个deskt…

android开发 apk文件,android开发中,将数据库文件与APK一起发布?

2015-11-11 回答可以将xx.db文件复制到eclipse android工程中的res\raw目录中。所有在res\raw目录中的文件不会被压缩&#xff0c;这样可以直接提取该目录中的文件。使用opendatabase方法来打开数据库文件&#xff0c;如果该文件不存在&#xff0c;系统会自动创建/sdcard/dicti…

jpa 关联实体的关联实体_JPA实体锁定模式的差异

jpa 关联实体的关联实体JPA本质上提供了两种锁定机制&#xff0c;以帮助同步对实体的访问。 两种机制都可以防止以下情况&#xff1a;两个事务在不知道的情况下相互覆盖数据。 通过实体锁定&#xff0c;我们通常希望通过2个并行事务来防止以下情况&#xff1a; 亚当的事务读取…

华为p6电信版 android 4.5,华为P6电信版系统应用apk补全教程 完整EMUI

现在要说的是华为P6电信版的系统应用apk补全教程&#xff0c;给你一个非阉割版的完整EMUI系统。大家应该都知道&#xff0c;电信定制版由于华为系统服务与电信的定制APP功能重叠&#xff0c;语音助手、云同步、云端备份、手机找回等系统应用apk全被“阉割”掉了&#xff0c;这几…

黑马ee在职进阶视频_进阶– Java EE 7前端5强

黑马ee在职进阶视频系列继续。 在初步概述和Arjan关于最重要的后端功能的文章之后 &#xff0c;我现在非常高兴让Ed Burns&#xff08; edburns &#xff09;使用他最喜欢的Java EE 7前端功能完成本系列。 感谢Markus Eisele让我有机会在他非常受欢迎的博客上发表帖子。 我和M…

如何构建股票ChatGPT查询全球股票市场以及常用Prompt

Blog&#xff1a;4 ways to use ChatGPT Stock Chatbot for stock analysis of Global Stock Markets NASDAQ NYSE LSE HKEX TSE NSE HANGHAI SHENZHEN 地址&#xff1a;http://deepnlp.org/blog/chatgpt-stock-global-market 全球股票市场&#xff1a;NASDAQ 纳斯达克, NYSE…

web.xml.jsf_看一下即将发布的JSF 2.3 Push支持

web.xml.jsf如前几篇文章所述&#xff0c;下一版本的JavaServer Faces&#xff08;Mojarra&#xff09;已添加了许多增强功能。 JSF 2.3计划于2017年与Java EE 8一起发布&#xff0c;但是您现在可以通过从源代码构建或运行里程碑版本来获得JSF的一些增强功能和更新以用于测试目…

android视频教程那个讲的最好,最全的android视频教程推荐 android视频教程怎么学习效果好...

很多同学对android学习很感兴趣&#xff0c;都对此有这样的疑问&#xff1a;“最全的android视频教程推荐&#xff0c;android视频教程怎么学习效果好?”那这里android培训专家就给我们来具体讲解下。Android开发学习主要是学习Android平台下开发的基础知识以及项目编程的实用…

android size_t在哪个头文件,size_t

size_t 类型定义在cstddef头文件中&#xff0c;该文件是C标准库的头文件stddef.h的C版。它是一个与机器相关的unsigned类型&#xff0c;其大小足以保证存储内存中对象的大小。例如&#xff1a;bitset的size操作返回bitset对象中二进制位中1的个数&#xff0c;返回值类型是size_…

jqgrid mvc_将JQGrid与Spring MVC和Gson集成

jqgrid mvc我在一个单页面应用程序上工作&#xff0c;我想在使用Spring MVC的应用程序的一部分中使用网格功能。 自从我上次使用JQGrid以来已经有一段时间了&#xff0c;找到让我起床所需的信息有点困难。 在这篇文章中&#xff0c;我想整理所有信息并将其放入教程中&#xff0…

javadocs_不会吸引人的JavaDocs源样本

javadocsJavaDoc源代码嵌入很烂&#xff01; 我喜欢JavaDoc&#xff0c;但年龄不理想。 当您使用其他工具&#xff08;例如&#xff0c;在Microsoft世界中&#xff09;时&#xff0c;嵌入式示例突然变得惊人&#xff0c;并且内置了“搜索”功能&#xff01; 我们为什么不能拥…

html语义化有哪些优点,语义化的HTML结构到底有什么好处?

相信大家都知道html和css&#xff0c;知道html结构和css表现分离&#xff0c;知道html语义化&#xff0c;这些都是这几年的热门关键字。语义化的html在国内也是一两年前才开始被追捧的&#xff0c;看看现在群里谈论的html结构&#xff0c;关于html结构的面试题&#xff0c;语义…

vert.x 分布式锁_使用Vert.x进行响应式开发

vert.x 分布式锁最近&#xff0c;似乎我们正在听到有关Java的最新和最好的框架的消息。 Ninja &#xff0c; SparkJava和Play等工具; 但是每个人都固执己见&#xff0c;使您感到需要重新设计整个应用程序以利用它们的出色功能。 这就是为什么当我发现Vert.x时令我感到宽慰的原因…

c语言 char c1,c2; for (c1='0',C语言-5循环结构(PPT)复习课程.ppt

C语言-5循环结构(PPT)复习课程.ppt第五章 循环结构程序设计;课程引入;第五章 循环结构程序设计;5.1 while 语句;例1&#xff1a;求;1. do-while循环语句的形式 do 循环体 while(条件表达式)&#xff1b; ;表达式0&#xff1f;;【例5.3】while和do-while循环的比较。;一般格式&a…

jvm高并发_JVM上的高并发HTTP客户端

jvm高并发HTTP可能是最流行的应用程序级别协议&#xff0c;并且有许多库在网络I / O之上实现它&#xff0c;这是常规I / O的一种特殊&#xff08;面向流&#xff09;情况。 由于所有I / O都有很多共同点1 &#xff0c;所以让我们开始对其进行一些讨论。 我将集中讨论具有大量并…

html双击变成可编辑,jquery 实现双击编辑并保存

jquery 实现双击编辑并保存Jesse2013-12-11 19:47:001153最近在做一个数据修改的例子&#xff0c;一个个点开修改很麻烦&#xff0c;于是就想到ecshop后台里的 只需单击就以编辑了&#xff0c;在网上查阅资料&#xff0c;就想到双击修改&#xff0c;失去鼠标焦点后post执行HTML…