`
pan_java
  • 浏览: 285619 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

asyn4j -- 异步方法调用框架

    博客分类:
  • java
阅读更多
asyn4j 是一个java异步方法调用框架,基于消费者与生产者模式。包括了异步方法执行,异步回调执行,异步工作缓存模块.支持Spring.

让我们写异步方法不再写很多的相关多线程代码。用asyn4j轻松搞定异步方法调用.提高程序的响应能力.



设计图


1.调用普通方法
主方法
        public static void main(String[] args) { 
                // 初始化异步工作服务 
                AsynService asynService =  AsynServiceImpl.getService(300, 3000L, 3, 2); 
                // 启动服务 
                asynService.init(); 
                // 异步回调对象 
                AsynCallBack back = new TargetBack(); 
                for (int i = 0; i < 1000; i++) { 
                        // 添加加异步工作- TargetService 的 test 方法 ,方法参数 asynej+ i 
                        asynService.addWork(new Object[] { "asyn4j" + i }, 
                                        TargetService.class, "test", new TargetBack()); 
                        //实例化目标对象再调用 
                       // TargetService targetService = new TargetService (); 
                       //asynService.addWork(new Object[] { "asyn4j" + i }, 
                //              targetService , "test", new TargetBack()); 
                        
                } 
        }


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



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


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"> 
                 
   </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.addWorkWithSpring(new Object[] { "panxiuyan" + i }, "testBean", "myName"); 
                } 
        } 
 
}


3.使用异步工作缓冲器
AsynService anycService = AsynServiceImpl.getService(300, 3000L, 100, 
                                100); 
                anycService.setWorkQueueFullHandler(new CacheAsynWorkHandler(100)); 
                anycService.init();

当工作队列中的工作超过300个时,异步工作将由CacheAsynWorkHandler?处理;

4.异步工作优级
默认优先级为5  ,相关API 
//目标对象为指定实例 
public void addWork(Object[] params, Object tagerObject, String method,AsynCallBack asynCallBack, int weight); 
 
//目标对象为class 
public void addWork(Object[] params,Class clzss,String method,AsynCallBack asynCallBack,int weight); 
 
//Spring对应 
public void addWorkWithSpring(Object[] params,String target,String method,AsynCallBack asynCallBack,int weight);



看到这里感兴趣了吗?想了解更多查看如下资料或站内信联络.

项目地址:http://asyn4j.googlecode.com
源码SVN : http://asyn4j.googlecode.com/svn/branches/asyn4j
WIKI: http://code.google.com/p/asyn4j/wiki/user_guide






分享到:
评论
25 楼 xiaokang1582830 2012-08-17  
有一点没有考虑到的就是是否可以提供目前已经在调用的calss和class中的方法,其实这功能很简单!不过这样的话使用的时候就可以知道哪些方法已经在调用了如果重复调用此方法就不会多次异步调用
24 楼 pan_java 2011-07-26  
zeng7960983 写道
lz 应该写下api 从google上面下载了代码根据楼主的demo示例发现有问题 请及时更新


现在asyn4j已经是1.3了.这个文章是1.0发表,所以有些问题。你可以到googlecode上下载最新的源码。有问题可以联系我。
23 楼 zeng7960983 2011-07-25  
lz 应该写下api 从google上面下载了代码根据楼主的demo示例发现有问题 请及时更新
22 楼 michael9418 2010-11-17  
duooluu 写道
pan_java 写道
duooluu 写道
为啥不看看java jdk里的Executor框架呢?


这个框架就是用Executor实行的线程池功能.

看到Executor框架中的线程池ThreadPoolExecutor了吗?


这个评论的人真恶心,先不说asyn4j本身如何,就这个这态度,真想打它。他完全就是为了批评而批评,言语间到处流露着对asyn4j作者的不屑。你觉得不好,你可以有两个选择:1、就事论事,说出那儿不好,提出一些修改的意见,言语要中肯。2、你可以走人嘛,没有人把刀架你脖子上强迫你用吧。

将心比心,试想如果这位评论者自己写的代码被别人这样说,心里是什么滋味。更何况asyn4j作者态度还这么好,耐心地跟你这个傲慢的无理取闹者解释。

另外,我觉得asyn4j这个名字取得特别好听,我已决定在自己的一个项目的基础服务中,使用asyn4j来提供异步服务。希望作者再接再励,不被这些负面的评论所打击。将asyn4j做的更好。

随便说一句:中国人老强调国内IT水平太差,中国人自己做不出什么框架来,如今有人尝试,我们却大加指责,这算什么,请问这些指责的人,你们是什么用心?

其实你们没什么用心,无非就是偏见罢了。收起你们可怜巴巴的偏见吧,看看你们自己知道多少,你们自己都做了什么?

只让人想起一句悲凉的话:做和不做的最大区别,就是后者拥有对前者的评论权。仅此而已,奉劝这些人:please do something !
21 楼 sunrie 2010-08-27  
没觉得哪里比Executor优秀,封装意义何在?
20 楼 pan_java 2010-08-27  
<div class="quote_title">cutesource 写道</div>
<div class="quote_div">
<p> </p>
<div style="color: #000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; margin: 8px;">
<p style="margin: 0px;">感觉和直接使用ThreadPoolExecutor没多大区别吧</p>
<p style="margin: 0px;">关于JDK的线程池可以参考一下这篇博文<a href="http://blog.csdn.net/cutesource/archive/2010/08/04/5788534.aspx">http://blog.csdn.net/cutesource/archive/2010/08/04/5788534.aspx</a></p>
</div>
<p> </p>
</div>
<p>我是在ThreadPoolExecutor基础上再封装了一层。</p>
19 楼 cutesource 2010-08-26  
<p>
</p>
<div style="color: #000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; margin: 8px;">
<p style="margin: 0px;">感觉和直接使用ThreadPoolExecutor没多大区别吧</p>
<p style="margin: 0px;">关于JDK的线程池可以参考一下这篇博文<a href="http://blog.csdn.net/cutesource/archive/2010/08/04/5788534.aspx">http://blog.csdn.net/cutesource/archive/2010/08/04/5788534.aspx</a></p>
</div>

<p> </p>
18 楼 tarsean 2010-08-26  
异步调用,为什么不直接使用JMS呢?
17 楼 JavaLanguageFun 2010-08-26  
我想知道你这个是干啥饿 。。
16 楼 pan_java 2010-08-26  
integergx 写道
再进一步讨论吧,你的框架考虑的还是很不全面的。

是的,下一个版本将包含这些功能,谢谢你们.
15 楼 integergx 2010-08-26  
再进一步讨论吧,你的框架考虑的还是很不全面的。
14 楼 sharkhu 2010-08-26  
integergx 写道
我目前也在寻找这样的框架技术
Spring3已经有个一个Future的异步执行。
自己用线程写也是可以实现的。
我的问题是,如何保证异步调用的容错性?
:调用的程序运行一半,系统死掉了,而该异步调用又是必须完成的业务?



如果能解决这个问题,我想这个框架还是很有用的。

13 楼 pan_java 2010-08-26  
pangyi 写道

askyuan 写道
我只能说胡扯蛋


诸如此类评贴,实在让人不敢恭维啊。

我需到过此类需求。非常感谢楼主的分享。




谢谢,这个贴有两个目的。
1.由于我是闭门造车,对这个框架考虑可能不是很周全.希望积思广义.不断的完善.
2.了解大家项目中是否需要类似这样的框架.
12 楼 pangyi 2010-08-26  

askyuan 写道
我只能说胡扯蛋


诸如此类评贴,实在让人不敢恭维啊。

我需到过此类需求。非常感谢楼主的分享。



11 楼 cya55 2010-08-25  
楼主考虑超时了吗?
10 楼 pan_java 2010-08-25  
integergx 写道
我目前也在寻找这样的框架技术
Spring3已经有个一个Future的异步执行。
自己用线程写也是可以实现的。
我的问题是,如何保证异步调用的容错性?
:调用的程序运行一半,系统死掉了,而该异步调用又是必须完成的业务?


这部份还没有做,不过这个框架要可以清松的扩展.谢谢你的建议.我将会完善这个功能.谢谢!
9 楼 integergx 2010-08-25  
我目前也在寻找这样的框架技术
Spring3已经有个一个Future的异步执行。
自己用线程写也是可以实现的。
我的问题是,如何保证异步调用的容错性?
:调用的程序运行一半,系统死掉了,而该异步调用又是必须完成的业务?
8 楼 duooluu 2010-08-25  
pan_java 写道
duooluu 写道
为啥不看看java jdk里的Executor框架呢?


这个框架就是用Executor实行的线程池功能.

看到Executor框架中的线程池ThreadPoolExecutor了吗?
7 楼 pan_java 2010-08-25  
duooluu 写道
为啥不看看java jdk里的Executor框架呢?


这个框架就是用Executor实行的线程池功能.
6 楼 duooluu 2010-08-25  
为啥不看看java jdk里的Executor框架呢?

相关推荐

    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 对象。对于现代浏览器使用...

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

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

    iOS-面试宝典3.0.pdf

    例如,在Objective-C中,可以使用`performSelector:`方法动态调用对象的方法。 #### 七、runtime实现的机制是什么,怎么用,一般用于干嘛。你还能记得你所使用的相关的头文件或者某些方法的名称吗? Runtime机制是...

    互联网大厂Java面试题合集

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

    Android两种轮询的实现方法

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

    字节跳动(抖音面试题)

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

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

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

    JAVA面试题(2018)

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

Global site tag (gtag.js) - Google Analytics