`

asyn4j 异步方法调用框架

    博客分类:
  • JAVA
 
阅读更多

例子:

1.调用普通方法

主方法

        public static void main(String[] args) { 
                // 初始化异步工作服务 
                AsynService anycService = AsynServiceImpl.getService(300, 3000L, 100, 100,1000); 
                //异步工作缓冲处理器 
                anycService.setWorkQueueFullHandler(new CacheAsynWorkHandler(100)); 
                //服务启动和关闭处理器 
                anycService.setServiceHandler(new FileAsynServiceHandler()); 
                //异步工作执行异常处理器 
                anycService.setErrorAsynWorkHandler(new DefaultErrorAsynWorkHandler()); 
                // 启动服务 
                asynService.init(); 
                // 异步回调对象 
                AsynCallBack back = new TargetBack(); 
                for (int i = 0; i < 1000; i++) { 
                        // 添加加异步工作- TargetService 的 test 方法 ,方法参数 asynej+ i 
                        asynService.addWork(TargetService.class, "test", new Object[] { "asyn4j" + i },new TargetBack()); 
                        //实例化目标对象再调用 
                       // TargetService targetService = new TargetService (); 
                       //asynService.addWork( 
                //              targetService , "test",new Object[] { "asyn4j" + i }, new TargetBack()); 
                        
                } 
        }

回调方法

//回调需继承AsynCallBack抽象类 
public class TargetBack extends AsynCallBack { 
 
        @Override 
        public void doNotify() { 
                //输出异步方法调用结果 
                System.out.println(this.methodResult); 
 
        } 
 
}

目标对象

//异步调用对象 
public class TargetService { 
        public String test(String name){ 
                System.out.println(name +" test is execute!"); 
                return name; 
        } 
 
}

2.调用Spring Bean的异步方法

调用 Spring testBean 的 myName 方法

   applicationContext.xml 加入 
    <bean id="springBeanUtil" class="com.googlecode.asyn4j.spring.AsynSpringUtil"> 
        </bean> 
 
  <bean id="asynService" class="com.googlecode.asyn4j.spring.AsynServiceFactoryBean"> 
            <!--设置自定义相关参数--> 
            <property name="maxCacheWork" value="100"></property> 
                <property name="addWorkWaitTime" value="2000"></property> 
                <property name="workThreadNum" value="3"></property> 
                <property name="callbackThreadNum" value="2"></property> 
                 <property name="closeServiceWaitTime" value="2000"></property> 
                <!--添加相关处理器--> 
                <property name="errorAsynWorkHandler"> 
                        <bean class="com.googlecode.asyn4j.core.handler.DefaultErrorAsynWorkHandler"/> 
            </property> 
                <property name="workQueueFullHandler"> 
                        <bean class="com.googlecode.asyn4j.core.handler.CacheAsynWorkHandler"/> 
           </property> 
<property name="asynServiceHandler"> 
                        <bean class="com.googlecode.asyn4j.core.handler.FileAsynServiceHandler"/> 
           </property> 
   </bean> 
 
 
  public class TestMain { 
         
        public AsynService asynService; 
 
        public void setAsynService(AsynService asynService) { 
                this.asynService = asynService; 
        } 
         
        public void maintest(){ 
                for(int i=0;i<10000;i++){ 
                        asynService.addWork("testBean", "myName",new Object[] { "panxiuyan" + i }); 
                } 
        } 
 
}

3.相关处理器

3.1异步工作缓冲器--(当工作队列工作数超过maxCacheWork时由处里器处理)

AsynService anycService = AsynServiceImpl.getService(300, 3000L, 100, 
                                100); 
                anycService.setWorkQueueFullHandler(new CacheAsynWorkHandler(100)); 
                anycService.init();
当工作队列中的工作超过300个时,异步工作将由CacheAsynWorkHandler处理;
自定义处理器 继承 WorkQueueFullHandler 抽象类

3.2服务启动和关闭处理器 --(当服务启动和关闭调用)

      anycService.setCloseHander(new FileAsynServiceHandler("c:/asyn4j.data"));
设置c:/asyn4j.data为持久化文件 FileAsynServiceHandler 是 AsynServiceHandler 的一个例子将任务持久化到文件,当系统启动时加载文件内容到内存,关闭时将未执行的任务持久化到文件。大家可以参考源码将任务持久化到别外的地方(memcached)
自定义处理器 继承 AsynServiceHandler 抽象类

3.3异步工作执行异常处理器 --(当工作执行出现异常时处理器)

    anycService.setErrorAsynWorkHandler(new DefaultErrorAsynWorkHandler());
自定义处理器 继承 ErrorAsynWorkHandler 抽象类

3.4所有处理器为可选配置,建议根据自己的业务继承相关的类实现自己的处理器

4.异步工作优级

分成三个等级WorkWeight.LOW,WorkWeight.MIDDLE, WorkWeight.HIGH 默认优先级为WorkWeight.MIDDLE 。

API说明

一.默认构造函数

   AsynServiceImpl.getService();

采用的默认参数为,

  1. (maxCacheWork)最大工作队列缓存工作数 – 300(默认值)
  2. (addWorkWaitTime)当工作队列满时添加工作等待时间-- Long.MAX_VALUE(默认值)
  3. (workThreadNum)异步工作执行线程池大小 ---- CPU核数/2 +1(默认值)
  4. (callBackThreadNum)回调执行线程池大小 --- CPU核数/2(默认值)
  5. (closeServiceWaitTime) 服务关闭等待时间 ---- 60000s(默认值)

 

二.自定义参数构造函数,参数顺序对应前面的说明

 AsynServiceImpl.getService (1000, 1000L, 3, 2,60 * 1000);

AsynServiceImpl 是线程安全的,可以初始化一个实例,所有程序再引用.

三.设置缓存工作队列处理器(在init方法调用前设置)

 public void setWorkQueueFullHandler(WorkQueueFullHandler workQueueFullHandler);

系统有一个默认的处理器 CacheAsynWorkHandler 建议实现自己的处理器,需实现 addAsynWork,process 方法 。process建议启动一个守护线程监听.

四.启动服务

 public void init(); 

五.添加异步工作API

 /** 
     * 添加异步工作 
     * @param tagerObject -- 目标对象(可以是 Class,Object,String(spring)) 
     * @param method  -- 目标方法 
     */ 
    public void addWork(Object tagerObject, String method); 
 
    /** 
     * 添加异步工作 
     * @param tagerObject -- 目标对象(可以是 Class,Object,String(spring)) 
     * @param method -- 目标方法 
     * @param params -- 目标方法参数 
     */ 
    public void addWork(Object tagerObject, String method,Object[] params); 
 
    /** 
     * 添加异步工作 
     *  
     *  
     * @param tagerObject -- 目标对象(可以是 Class,Object,String(spring)) 
     * @param method -- 目标方法 
     * @param asynCallBack --回调对象 
     * @param params -- 目标方法参数 
     */ 
    public void addWork(Object tagerObject, String method,Object[] params, AsynCallBack asynCallBack); 
 
     
    /** 
     * 添加异步工作 
     *  
     *  
     * @param tagerObject -- 目标对象(可以是 Class,Object,String(spring)) 
     * @param method -- 目标方法 
     * @param asynCallBack --回调对象 
     * @param params -- 目标方法参数 
     * @param weight -- 工作权重 
      
     */ 
    public void addWork(Object tagerObject, String method, Object[] params,AsynCallBack asynCallBack, WorkWeight weight); 
     
     
    /** 
     * 添加异步工作 
     * @param tagerObject -- 目标对象(可以是 Class,Object,String(spring)) 
     * @param method -- 目标方法 
     * @param asynCallBack --回调对象 
     * @param params -- 目标方法参数 
     * @param weight -- 工作权重 
     * @param cache --  如果目标对象为class,实例化后是否缓存 
     */ 
    public void addWork(Object tagerObject, String method, Object[] params, AsynCallBack asynCallBack, WorkWeight weight, 
            boolean cache); 
 
 
    /** 
     *  Spring 添加异步工作 
     *  
     * @param target -- 目标对象BeanName 
     * @param method -- 目标方法 
     * @param asynCallBack --回调对象 
     * @param params -- 目标方法参数 
     * @param weight -- 工作权重 
     */ 
    public void addWorkWithSpring( String target, String method,Object[] params, AsynCallBack asynCallBack, WorkWeight weight); 
 
    /** 
     * 添加异步工作  
     *  
     * @param asynWork -- 异步工作实例 
     */ 
    public void addAsynWork(AsynWork asynWork); 
        

六.获取运行状态信息

/** 
         *  
         * 获取运行状态MAP 
         * @return 
         */ 
        public Map<String,Integer> getRunStatMap(); 
 
   Map key说明 
   total:累计接收异步工作数 
   execute:执行异步工作数 
   callback:执行回调数
        /** 
         *  获取运行状态字符信息 
         * @return 
         */ 
        public String getRunStatInfo();

七. 调用基于Spring Bean的异步方法

1.applicationContext.xml 加入

<bean id="springBeanUtil" class="com.googlecode.asyn4j.spring.AsynSpringUtil"> 
        </bean>

 

使用下列方法添加异步工作

   asynService.addWork("testBean", "myName",new Object[] { "asyn4j" + i });

八.创建基于Spring 的依赖Bean

asynService spring bean 工厂

   <bean id="asynService" class="com.googlecode.asyn4j.spring.AsynServiceFactoryBean"> 
            <!--设置自定义相关参数--> 
            <property name="maxCacheWork" value="100"></property> 
                <property name="addWorkWaitTime" value="2000"></property> 
                <property name="workThreadNum" value="3"></property> 
                <property name="callbackThreadNum" value="2"></property> 
                <!--添加相关处理器--> 
                <property name="errorAsynWorkHandler"> 
                        <bean class="com.googlecode.asyn4j.core.handler.DefaultErrorAsynWorkHandler"/> 
            </property> 
                <property name="workQueueFullHandler"> 
                        <bean class="com.googlecode.asyn4j.core.handler.CacheAsynWorkHandler"/> 
           </property> 
   </bean>

九.关闭服务

   /** 
     * 关闭服务等待 waitTime 秒 
     * @ wait time 
     */ 
    public void close(long waitTime); 
     
    /** 
     * 关闭服务等待1分钟 
     */ 
    public void close();

十.注意

查找异步工作目标方法时,无法区分方法同名的并且参数是继承关系的方法. 

 

 

 

 

 

源文地址:http://code.google.com/p/asyn4j/wiki/user_guide

分享到:
评论

相关推荐

    asyn4j for java 1.4

    `asyn4j for java 1.4` 是一个专为Java 1.4及更高版本设计的异步方法调用框架。在Java早期版本中,由于并发处理能力的限制,开发者往往需要手动处理多线程,这增加了代码的复杂性和出错的可能性。`asyn4j` 提供了一...

    Spring @async方法如何添加注解实现异步调用

    Spring 框架提供了 @Async 注解来实现异步调用,该注解可以在方法上添加,以使得方法被异步调用。下面我们将详细介绍 Spring @Async 方法如何添加注解实现异步调用。 什么是 @Async 注解 @Async 注解是一个 Spring...

    winform ICE异步demo

    在【压缩包子文件的文件名称列表】"Asyn_Ice_WinformDemo"中,我们可以推测这个压缩包包含了一个完整的winform项目,可能有以下几个部分: 1. **解决方案文件(Solution File)**:通常为`.sln`文件,包含了项目的...

    深入理解Spring注解@Async解决异步调用问题

    然后,在方法上添加@Async注解,声明该方法为异步调用方法。这样,在执行该方法时,将会在独立的线程中被执行,调用者无需等待它的完成。 四、使用@Async注解 @Async注解可以应用于无返回值方法和有返回值方法。在...

    ASP.NET上的AsynWait简介

    使用传统的同步编程模型时,如果请求中的某个操作需要等待I/O响应(如数据库操作或调用外部Web API),那么这个线程就会被阻塞,直到该操作完成。这将导致线程池中的线程数量有限而无法处理更多的并发请求。 异步...

    ajax 核心代码

    - **asyn**:布尔值,表示是否采用异步方式处理请求,默认为 true 表示异步。 #### 2.2 函数逻辑分析 1. **初始化 XMLHttpRequest 对象**: - 检查浏览器环境,尝试创建 XMLHttpRequest 对象。对于现代浏览器使用...

    Android两种轮询的实现方法

    // asyn network mHandler.sendEmptyMessageDelayed(MSG_POLLING, POLLING_INTERVAL); } ``` 在上面的代码中,我们使用 `Handler` 对象来实现轮询机制。我们首先定义了一个 `MSG_POLLING` 消息,然后在 `...

    字节跳动(抖音面试题)

    `getA`方法中的`this`指向`a`实例,所以`funA()`调用时,`this.name`输出`123`。 4. 找出字符串中出现次数最多的字符及其次数: 这道编程题可以通过遍历字符串,使用哈希表(对象)记录每个字符出现的次数,最后找...

    iOS-面试宝典3.0.pdf

    #### 四、不用中间变量,用两种方法交换A和B的值 - 方法1:使用加减运算实现。 ```objective-c A = A + B; B = A - B; A = A - B; ``` - 方法2:使用异或运算实现。 ```objective-c A = A ^ B; B = A ^ B; A = A ^ B;...

    后端开发基础知识整理JAVA、JVM、操作系统、网络、设计模式、mysql、redis、多线程、spring、springboo

    - **静态方法 实例方法区别**:静态方法不依赖于对象存在,实例方法通过对象调用。 - **静态内部类、成员内部类、局部内部类、匿名内部类**:不同类型的内部类,具有不同的作用域和生命周期。 - **equals方法**:...

    JAVA面试题(2018)

    三次握手过程包括了主机A向主机B请求建立连接、主机B确认请求、主机A确认主机B的数据段三个步骤,而四次挥手则是结束TCP连接的四个步骤。此外,面试官还可能询问你如何解决SYNFLOOD攻击这一常见的DDoS攻击。 在Web...

    百度校园招聘历年经典面试题汇总:C++研发 1

    4. **TCP的三次握手与四次挥手**:三次握手确保了双方都能通信,四次挥手用于断开连接,防止"半关闭"状态。 5. **设计汽车摇号系统**:涉及概率计算和随机数生成,需要确保公平性和效率。 6. **Linux命令**:例如`...

    互联网大厂Java面试题合集

    - **反射原理**:通过Class对象获取类的信息,创建实例、调用方法等。 - **创建实例方式**:使用Class对象的newInstance()方法、Constructor对象的newInstance()方法等。 ##### 4.2.2 Class.forName与ClassLoader的...

Global site tag (gtag.js) - Google Analytics