`

Dactor发布1.0.7版本

    博客分类:
  • Java
 
阅读更多
# **DActor**  
## Introduction
DActor框架可同时支持同步和异步代码,简化在线异步代码的开发,用同步代码的思维来开发异步代码,兼顾异步代码的高并发、无阻塞和同步代码的易读性,可维护性。
基于协程思想设计
最大程度的降低阻塞,提高单个线程的处理能力,并可有效的降低线程数。
## 项目地址
GitHub:https://github.com/allon2/dactor  
 GitEE:https://gitee.com/handyun/dactor  
## Overview
目前开发过程中的几个常见模型
 -  同步编程
    所有步骤都在一个主线程中完成,调用一个方法,等待其响应返回。一个请求占用一个线程,在有数据库操作、TCP和Http通讯时因为有阻塞情况,会导致占用线程占用而无法及时释放  
    ,因此在同步交易中引入了线程池概念,提高系统的吞吐量
 -  异步编程
    所有步骤都可在不同线程中完成,调用一个方法,不等待响应既返回,典型交易如NodeJs。
    目前市面上的异步框架都比较复杂,市面的通用解决方案是CallBack和Promise/Deferred模式模式。  
## 设计思路  
- 为了保留异步的高性能,简化异步的开发模式,同时使得程序更容易被程序员理解,在性能和代码可阅读性中间取得平衡,设计了此框架。    
- 处理步骤:将请求封装为消息,丢入消息队列,寻找合适步骤处理消息,上述过程不断循环,直到所有可用步骤都执行完毕。  
  因为是对消息队列进行处理,对于同步交易,处理完毕即可丢入消息队列。对于异步交易,等待回调完毕再丢入消息队列。  
  两种情况对于框架来说是无差别的。同时因为通过异步交易避免了阻塞情况的发生,所以可在不大幅度提高线程数的情况下,提高吞吐量,  
  同时也可在一定程度避免流量突增的情况发生。  
- 消息队列采用Disruptor的的高性能队列RingBuffer。
- 以Actor协程并发模型为基础设计框架。 
## Features
- 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
## Release Note
1.0.7版本  
     修正Step中所有条件不为真时,报错问题  
1.0.6版本  
     通过设置async=true的方式,便捷的增加旁路交易  
     移除对javax.mail-api的依赖  
1.0.5版本  
     ServletMessage的用户对象直接从会话中取得  
 1.0.4版本  
     优化程序逻辑  
 1.0.3版本  
    Message增加setUser和getUser对象  
 1.0.2版本
- 初始化版本
## Getting Started
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    
   http://localhost:8080/example/np.randomTxt2.json为使用命名空间的例子,相关配置在conf/namespace.xml中。  

   启动后,可在控制台看到内部调用结果  
   ![Image text](1.png)
   

### Maven dependency

```xml
<dependency>
    <groupId>cn.ymotel</groupId>
    <artifactId>dactor</artifactId>
    <version>1.0.6</version>
</dependency>
```
### Gradle 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
<bean id="MessageRingBufferDispatcher" class="cn.ymotel.dactor.core.disruptor.MessageRingBufferDispatcher">
</bean>
启动框架接收和执行请求

# **配置和API说明**  
## 配置说明
通过在xml中的Step实现内部Actor之间的流程跳转
 在配置文件中包含
 Actor、chain、和global配置 。
 程序整个执行顺序为根据交易码找到对应的Actor,然后执行按照chain->parent->selft的顺序进行执行。  
 chain执行到placeholder处,调用parent交易继续执行,在parent交易中执行到placeholder交易后,调用selft自身交易继续执行。
 自身交易执行完毕,弹出parent的placeholder处交易继续执行.parent执行完毕,弹出chain中代码继续执行。
 global配置如下
``` 
  <actor:global id="actorglobal">
         <actor:param name="beginBeanId" value="beginActor"/>
         <actor:param name="endBeanId" value="endActor"/>
   </actor:global>
```   
beginBeanId为默认的开始Actor,value中的值是在Spring中对应的beanName,程序初始化时将会取得此值,对未指定beginBeanId或者endBeanId的Actor初始化全局配置。  
beginActor和endActor都需要继承Actor接口。
actor配置如下
```   
    <actor:actor id="actorhttpcore"   parent="chainparent" chain="unLoginChain"  handleException="true"  endBeanId="FinishActor" >

        <actor:steps>
            <actor:step xpoint="" ypont="" fromBeanId="beginActor"  conditon="" toBeanId="placeholderActor"/>
             <actor:step xpoint="" ypont="" fromBeanId="beginActor"  conditon="" async="true"  toBeanId="placeholderActor"/>
           <actor:step xpoint="" ypont=""  fromBeanId="placeholderActor" conditon="context._SUFFIX=='json'"  toBeanId="JsonViewResolverActor"/>
            <actor:step xpoint="" ypont=""  fromBeanId="placeholderActor" conditon="exception==null" toBeanId="ViewResolveActor"/>
            <actor:step xpoint="" ypont=""   fromBeanId="placeholderActor" conditon="exception!=null"  toBeanId="ErrorViewResolveActor"/>
        </actor:steps>
             <results>
                    <result name="success">htmlstream:</result>
             </results>
    </actor:actor>
 ```
属性handleException如果不设置的话,遇到异常,程序将会认为子类中已经执行完毕,跳到parent中PlaceHolder处执行。设置为true,将不会直接跳转到parent中,由子类进行自我处理。  
 parent和chain为调用具体交易前需要调用的公共交易,由于大部分交易都有通用的前置交易和统一的后置交易。通过设置parent或者chain,可提高代码复用度。  
 fromBeanId和toBeanId配置的是Actor或者实现Actor接口的beanId。
 parent和chain中的ref都需要是Actor.  
 results中可定义返回的state和需要处理的viewActor  
 async标记是否是旁路交易,默认值为false,为true值时,会将上下文内容设置复制一份,重新生成一份Message,进行执行,不影响主流程。
chain配置
 ```
   <actor:chain id="isLoginChain">
          <list>
              <ref bean="actorhttpcore"></ref>
              <ref bean="isLoginActor1"></ref>
  
          </list>
      </actor:chain>
```  
chain可直观展现Actor调用顺序.    
在chain中可顺序并列多个parent类。每个parent中的Step都需要有placeHolderActor,以调用子类。      
依次执行list中的交易,再执行自身交易。自身交易执行完毕,再依次回溯责任链中的每个交易,直到无可用交易。 
命名空间
  ```
 <actor:actors xmlns="http://www.ymotel.cn/schema/dactor"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:aop="http://www.springframework.org/schema/aop"
               xmlns:actor="http://www.ymotel.cn/schema/dactor"
               xmlns:beans="http://www.springframework.org/schema/beans"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.ymotel.cn/schema/dactor http://www.ymotel.cn/schema/dactor.xsd"  namespace="np">
     <!-- parent 和beginBeanId为全局name,randomTxt2在Spring中的全程是np.randomTxt2-->
     <actor id="randomTxt2" parent="actorhttpcore" beginBeanId="randomTxtActor">
     </actor>
 </actor:actors>
  ```
在actor中可增加命名空间,简化代码开发。在actor中配置namespace=np,则实例中的actor的id会自动拼装为np.randomTxt2  
     http://localhost:8080/example/np.randomTxt2.json为使用命名空间的例子,相关配置在conf/namespace.xml中。  

## 重要类方法说明
cn.ymotel.dactor.core.MessageDispatcher是交易流转的核心接口类   
    public void startMessage(Message message, ActorTransactionCfg actorcfg, boolean blocked) throws Exception  
方法,用于开始整个流程,其中message需要在执行前进行构造,actorcfg可通过spring的getBean方法得到为Actor对象,如下  
```
<actor id="randomTxt1" parent="randomTxt" beginBeanId="randomTxtActor">
    </actor>
```
    通过getBean('randomTxt1')即可得到ActorTransactionCfg对象。  
    blocked为是否阻塞,一般在交易初次放入队列是为false,表示如果队列满,则直接扔给客户端进行处理。为true则一般为内部交易,必须提交给队列进行处理。
sendMessage方法内部调用,用于将处理完毕的Message重新放入队列,继续下一步流程。
 cn.ymotel.dactor.core.disruptor.MessageRingBufferDispatcher是MessageDispatcher的接口实现类。,在启动Spring是需要在配置中加上
 ```
  <bean id="MessageRingBufferDispatcher" class="cn.ymotel.dactor.core.disruptor.MessageRingBufferDispatcher">
    </bean>
 ```   
MessageRingBufferDispatcher的strategy、bufferSize、threadNumber为三个可设置属性.正常情况下使用默认设置即可。  
 strategy默认使用ringBuffer的BlockingWaitStrategy策略进行调度,如果交易量比较大,可调整此策略。  
 bufferSize默认使用1024。   
 threadNumber默认使用CPU个数的线程数。   
 ## 其他默认Actor说明
cn.ymotel.dactor.message.Message.Actor,所有需要在执行的交易都必须继承此接口。   
 public Object HandleMessage(Message message) throws Exception;程序通过调用HandleMessage对象,如果返回的不是message对象或者为NULL,则认为此交易是异步执行,不再自行调度。由异步交易在收到请求后,自己调用将Message再此放入队列中。  
 cn.ymotel.dactor.action.PlaceholderActor 交易为特殊交易,用来将当前队列暂存,并调用子交易。  
 cn.ymotel.dactor.action.BeginActor 为Actor中step的默认开始交易。  
 cn.ymotel.dactor.action.EndActor 为Actor中step的默认结束交易。
 cn.ymotel.dactor.action.JsonViewResolverActor为需要返回Json的J2EE view
  cn.ymotel.dactor.action.ViewResolveActor为需要返回J2EE view的统一处理Actor  
  cn.ymotel.dactor.action.httpclient.HttpClientActor 提供的异步调用httpClient的Actor  
cn.ymotel.dactor.action.netty.aysnsocket.TcpClientActor 提供的异步调用netty的Actor  
 ## 交易流程举例说明
 ```
   <actor:actor id="actorhttpcore" handleException="true"  endBeanId="FinishActor" >
 
         <actor:steps>
             <actor:step xpoint="" ypont="" fromBeanId="beginActor"  conditon="" toBeanId="placeholderActor"/>
             <actor:step xpoint="" ypont=""  fromBeanId="placeholderActor" conditon="context._SUFFIX=='json'"  toBeanId="JsonViewResolverActor"/>
             <actor:step xpoint="" ypont=""  fromBeanId="placeholderActor" conditon="exception==null" toBeanId="ViewResolveActor"/>
             <actor:step xpoint="" ypont=""   fromBeanId="placeholderActor" conditon="exception!=null"  toBeanId="ErrorViewResolveActor"/>
         </actor:steps>
 
     </actor:actor>

  <actor id="randomTxt2" parent="actorhttpcore" beginBeanId="randomTxtActor">
     </actor>
 ```
以上交易的交易流程图如下
 ![Image text](randomTxt2.png)
以上的完整例子都可在example中得到
分享到:
评论

相关推荐

    最新Peak码支付系统源码1.0.7版本

    V1.0.7此版本之后都用sw扩展 废除SG14扩展 (确保你安装了再更新,否则进入不了平台) 1. 修复后台数据在线更新 2.优化支付宝扫码回调 3.优化uos微信协议(支持百分之99的微信) 更新时间:2024/04/08

    正式发布最新版本1.0.7!

    手机理财1.0.7 博文链接:https://iwinyeah.iteye.com/blog/213328

    jxls-core-1.0.7.jar包,支持poi4.0即以上

    jxls-core-1.0.7.jar包源码,支持jdkl8以及poi4.0以上的版本,原jar包作者的最高版本多年没有维护,通过修改原作者源码,为1.0.7版本支持高版本的poi库如poi4.0.1及以上。

    2024年peak码支付最新1.0.7版本

    Peak码支付-是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。用全新轻量化的界面UI,让您可以更加方便快捷地解决知识付费和运营赞助的难题。同时,它基于高性能SpeedPHP+Layui+PearAdmin架构,提供...

    p0sixspwn 1.0.7 mac

    这个版本的发布,无疑为大量持有这些旧版iOS设备的用户带来了福音,因为他们现在可以享受到更多的定制化选项和第三方应用程序。 越狱,简单来说,就是通过特定的软件或工具绕过苹果设备的操作系统限制,让使用者...

    p0sixspwn v1.0.7 win

    p0sixspwn是一款知名的越狱工具,其1.0.7版本专为Windows用户设计,尤其在2014年1月8日发布后,迅速成为iOS 6.1.3至6.1.5版本设备越狱的热门选择。本文将详细介绍p0sixspwn v1.0.7及其操作流程。 一、p0sixspwn概述...

    libfastcommon-v1.0.7.tar.gz

    此次我们关注的是libfastcommon的v1.0.7版本,这个版本可能包含了性能优化、错误修复以及新增的功能。 libfastcommon库主要包含以下几个方面的知识点: 1. **内存管理**:libfastcommon提供了高效的内存分配和释放...

    acegi-security-1.0.7.jar.zip

    这个"acegi-security-1.0.7.jar.zip"文件包含的是Acegi Security 1.0.7版本的库,它是一个压缩的Java Archive(JAR)文件,专门设计用于增强Spring框架的安全功能。 Acegi Security的核心功能包括身份验证、授权和...

    Versions1.0.7破解版

    Versions1.0.7破解版,新版version v1.3+在新系统10.10.3上总是崩溃,还没有1.0.7好用

    libfastcommon-1.0.7.tar.gz

    1.0.7版本作为最新稳定版本,意味着它经过了充分的测试和优化,能够保证系统的稳定性与兼容性。 在FastDFS 5.05中,libfastcommon-1.0.7的安装和配置是必不可少的步骤。首先,我们需要下载libfastcommon-1.0.7的...

    Firefox火狐浏览器官方1.0.7-win32版本exe安装包

    《Firefox火狐浏览器1.0.7-win32版本安装详解》 Firefox火狐浏览器,作为全球知名的开源网络浏览器,自发布以来就以其强大的安全性能、丰富的扩展插件以及高度的定制性深受用户喜爱。本文将针对提供的"Firefox火狐...

    Firefox火狐浏览器官方1.0.7-mac版本dmg安装包

    Firefox 1.0.7是该系列的一个早期版本,发布于2004年,当时的互联网环境与现在大不相同,浏览器的功能和安全特性也相对较少。 描述中的“解压后可用,资源全名:Firefox 1.0.7.dmg”意味着用户下载这个.dmg文件后,...

    SmartUIDemo+1.0.7z

    SmartUIDemo+1.0.7zSmartUIDemo+1.0.7zSmartUIDemo+1.0.7zSmartUIDemo+1.0.7zSmartUIDemo+1.0.7zSmartUIDemo+1.0.7zSmartUIDemo+1.0.7zSmartUIDemo+1.0.7z

    baiduNetdisk-1.0.7.zip

    通常情况下,这样的描述可能适用于软件更新或版本发布,其中包含的zip文件是经过压缩的,可以减小下载大小,便于用户快速获取并安装。 【标签】"NAS"(Network Attached Storage)是指网络附加存储,是一种将存储...

    libfastcommon-1.0.7.zip

    本篇文章将详细介绍libfastcommon-1.0.7版本及其在FastDFS 5.05版本中的关键作用。 首先,libfastcommon是一个开源的C语言库,它包含了大量常用的数据结构和工具函数,如字符串处理、内存管理、线程同步、网络通信...

    bzip2-1.0.7.tar.gz

    bzip2是一款广泛使用的开源数据压缩工具,其1.0.7版本是它的一个经典发行版。这款软件由 Julian Seward 创建,以提供比传统gzip更高的压缩率而著名。bzip2采用的是Burrows-Wheeler变换和霍夫曼编码相结合的压缩算法...

    evasi0n7 win 1.0.7

    这个版本是1.0.7,由知名越狱团队在2014年03月02日发布,意味着它是当时最新的更新。 描述中提到的“支持全系列 iOS 7.0 - 7.0.6,以及7.1(b1-b4) 越狱”揭示了evasi0n7的兼容性范围。这意味着用户可以使用此工具对...

    PhoenixSuit1.0.7

    1.0.7版本的发布,是对前一版本的优化与改进,旨在提高刷机的成功率和稳定性。 二、主要功能 1. 固件升级:用户可以通过PhoenixSuit将新的系统固件刷入设备,实现系统升级。 2. 固件恢复:当设备出现系统故障或误...

    洛雪音乐助手自定义音源 v1.0.7 下载后请先解压

    4. **sixyin-music-source-v1.0.7.js**:这可能是洛雪音乐助手中的一个音源插件,名字中的“sixyin”可能是指“音乐”的拼音缩写,而“v1.0.7”与标题中的版本号相呼应,表明这是该音源插件的一个特定版本。...

Global site tag (gtag.js) - Google Analytics