DActor框架可同时支持同步和异步代码,简化在线异步代码的开发,用同步代码的思维来开发异步代码,兼顾异步代码的高并发、无阻塞和同步代码的易读性,可维护性。 基于协程思想设计 最大程度的降低阻塞,提高单个线程的处理能力,并可有效的降低线程数。
目前开发过程中的几个常见模型
同步编程 所有步骤都在一个主线程中完成,调用一个方法,等待其响应返回。一个请求占用一个线程,在有数据库操作、TCP和Http通讯时因为有阻塞情况,会导致占用线程占用而无法及时释放
,因此在同步交易中引入了线程池概念,提高系统的吞吐量
异步编程 所有步骤都可在不同线程中完成,调用一个方法,不等待响应既返回,典型交易如NodeJs。 目前市面上的异步框架都比较复杂,市面的通用解决方案是CallBack和Promise/Deferred模式模式。
为了保留异步的高性能,简化异步的开发模式,同时使得程序更容易被程序员理解,在性能和代码可阅读性中间取得平衡,设计了此框架。
处理步骤:将请求封装为消息,丢入消息队列,寻找合适步骤处理消息,上述过程不断循环,直到所有可用步骤都执行完毕。
因为是对消息队列进行处理,对于同步交易,处理完毕即可丢入消息队列。对于异步交易,等待回调完毕再丢入消息队列。
两种情况对于框架来说是无差别的。同时因为通过异步交易避免了阻塞情况的发生,所以可在不大幅度提高线程数的情况下,提高吞吐量,
同时也可在一定程度避免流量突增的情况发生。
消息队列采用Disruptor的的高性能队列RingBuffer。
以Actor协程并发模型为基础设计框架。
1、集成Netty
2、集成HttpClient
3、集成HttpServlet
4、支持多层父子结构
5、支持责任链模式
6、J2EE支持json,csv,pdf,xml,html格式输出
7、J2EE支持数据流输出,动态文件下载、动态图片输出、跳转和可根据配置动态输出
环境要求
JDK 1.8
Spring FrameWork 4.3.22.RELEASE +
Servlet 3.0+(因为需要使用Servlet的异步功能)
注意事项
请求的完整逻辑是分散在不同的线程中执行的,所以尽量避免使用ThreadLocal
example是J2EE程序,下载后,可直接运行,其中集成了若干例子
默认使用.do提交相关交易,但如果是.json将会返回json数据 启动后,在浏览器中输入http://localhost:8080/example/randomTxt2.json
输出的是json格式的字符串
randomTxt2:只有一级父子关系
randomTxt1:有二级父子关系 chaintest1:只使用责任链
chaintest2:同时使用责任链和一级父子关系
exceptionTest:子交易抛出错误,框架对错误的处理
httptest演示的是通过httpclient异步方式访问百度网站
访问URL:http://localhost:8080/example/ httptest.do
启动后,可在控制台看到内部调用结果
<dependency> <groupId>cn.ymotel</groupId> <artifactId>dactor</artifactId> <version>1.0.6</version> </dependency>
compile group: 'cn.ymotel', name: 'dactor', version:'1.0.6'
执行过程为chain->grandfather->parent->Selft。 依次调用执行责任链中逻辑,grandfather中的逻辑,parent的逻辑和自身逻辑。 chain,grandfather,parent都可为空,不设置 在grandfather和parent中的Steps中至少有一个为placeholderActor交易,以调用子逻辑
整个过程中,需要先设置全局占位符
<actor:global id="actorglobal">
<actor:param name="beginBeanId" value="beginActor"/>
<actor:param name="endBeanId" value="endActor"/>
</actor:global>
交易中如果未填写beginBeanId或者endBeanId时,系统默认使用全局中配置的beginBeanId或者endBeanId
<actor id="randomTxt" parent="actorhttpcore" beginBeanId="randomTxtActor"> <steps> <step fromBeanId="randomTxtActor" toBeanId="placeholderActor" conditon=""/> <step fromBeanId="placeholderActor" toBeanId="endActor" conditon=""/> </steps> </actor>
condtion可为空,空字符串,或者是ognl表达式
placeholderActor的作用是在暂存当前环境,并调用子交易,待子交易执行完毕后,再恢复当前环境继续执行
如果在Step中未找到toBeanIdActor,会直接调用endBeanId方法,认为自身交易已执行结束。
交易的请求和流转信息都保存在Message中
如果指定handleException=false或者使用默认设置,直接返回父中执行,如果父中也未捕获,则继续返回上一级执行,一般来说至少有要有一个actor中指定handleException=true 启动框架接收和执行请求
DActor框架可同时支持同步和异步代码,简化在线异步代码的开发,用同步代码的思维来开发异步代码,兼顾异步代码的高并发、无阻塞和同步代码的易读性,可维护性。 基于协程思想设计 最大程度的降低阻塞,提高单个线程的处理能力,并可有效的降低线程数。 1.0.6版本 通过设置async=true的方式,便捷的增加旁路交易 移除对javax.mail-api的依赖 1.0.5
孰能浊以澄?静之徐清; 孰能安以久?动之徐生。 老子,《道德经》 计算机的核心部分称为处理器,它执行构成我们程序的各个步骤。 到目前为止,我们看到的程序都是让处理器忙碌,直到他们完成工作。 处理数字的循环之类的东西,几乎完全取决于处理器的速度。 但是许多程序与处理器之外的东西交互。 例如,他们可能通过计算机网络进行通信或从硬盘请求数据 - 这比从内存获取数据要慢很多。 当发生这种事情时,让处理器处
介绍 Javascript 是一个单线程的编程语言,单线程的特点就是一次只能处理一件事情,当前代码任务耗时执行会阻塞后续代码的执行。异步编程则是一种事件驱动编程,请求调用函数或方法后,无需立即等待响应,可以继续执行其他任务,而之前任务响应返回后可以通过状态、通知和回调来通知调用者。 异步编程方法 js 中的异步编程方法有回调函数、事件处理函数、观察者、Promise、Generator、async
NodeJS最大的卖点——事件机制和异步IO,对开发者并不是透明的。开发者需要按异步方式编写代码才用得上这个卖点,而这一点也遭到了一些 NodeJS反对者的抨击。但不管怎样,异步编程确实是NodeJS最大的特点,没有掌握异步编程就不能说是真正学会了NodeJS。本章将介绍与异步编 程相关的各种知识。 回调 在代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异
目前为止,我们在做的都是同步编程。同步编程执行过程很简单:一个程序从第一行开始,逐行执行一直到末尾。每次调用一个函数时,程序就会等待这个函数返回然后在执行下一行。 在异步编程中,函数地执行通常是非阻塞的。换句话说,每次你调用一个函数它就会立即返回,但相对得,这就表示函数并不会立即被执行。它有了一种机制(名为 调度程序),让可以随时在未来执行这些函数。 使用异步编程会导致程序在任何异步函数开始之前就
JavaScript 的一个强大特性就是它可以轻松地处理异步编程。作为面向互联网设计的语言,JavaScript 从一开始就需要响应一些诸如点击和按键这些用户交互的能力。Node.js 通过使用回调函数来替代事件进一步推广了 JavaScript 的异步编程。随着越来越多的项目开始使用异步编程,事件和回调函数已不能满足开发者的所有需求。因此 Promise 应运而生。 Promise 是异步编程的
问题内容: 我该如何做这项工作 我试图从异步之一获取同步功能,我需要它来使用FreeTds异步查询作为同步之一 问题答案: 使用deasync-用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。该模块还公开了一个函数,该函数阻止后续代码,但不阻止整个线程,也不引起繁忙的等待。您可以将函数放入循环中:
我意识到这是一个基本问题,但我没能在别处找到答案。 是
概述 JavaScript 层层回调的异步编程让人望而生畏。而 Promise 的诞生就是为了解决这个问题,它提供了一种 Future 模式,大大简化了异步编程的复杂性。而 Promise/A+(中文版)是一个通用的、标准化的规范,它提供了一个可互操作的 then 方法的实现定义。Promise/A+ 规范的实现有很多,它们的共同点就是都有一个标准的 then 方法,而其它的 API 则各不相同。