- 浏览: 646473 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (213)
- JAVA (53)
- Tomcat (14)
- EXTJS专栏 (2)
- 数据库 (23)
- JavaScript (13)
- jQuery (11)
- 需求分析 (2)
- css (1)
- 手机 (1)
- php (7)
- 生活 (1)
- ssh (11)
- JFReeChart (2)
- Delphi (1)
- junit (0)
- liunx (10)
- 项目管理 (11)
- 文件下载 (1)
- Eclipse (2)
- jsp (2)
- 外挂、游戏 (1)
- 面试题 (8)
- 性能测试 (2)
- apache (1)
- MyBatis (1)
- Webservice (2)
- ant (1)
- IDEA (2)
- log4j (1)
- 小程序 (1)
最新评论
-
hll127:
请问service这个方法里为什么要while(true)啊? ...
jsp页面静态化例子 -
tarena1:
Spring 源码解读 推荐流程 -
konglx:
springaop_springmvc 写道可以参考最新的文档 ...
Web项目添加Maven支持步骤 -
springaop_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Web项目添加Maven支持步骤 -
9976:
很好,谢谢
Spring 源码解读 推荐流程
例子:
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();
采用的默认参数为,
- (maxCacheWork)最大工作队列缓存工作数 – 300(默认值)
- (addWorkWaitTime)当工作队列满时添加工作等待时间-- Long.MAX_VALUE(默认值)
- (workThreadNum)异步工作执行线程池大小 ---- CPU核数/2 +1(默认值)
- (callBackThreadNum)回调执行线程池大小 --- CPU核数/2(默认值)
- (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
发表评论
-
tomcat7下对HTTPS的部署配置
2018-11-09 15:33 7491、申请CA证书,可以在腾讯云或者阿里云申请到免费的CA ... -
IDEA切换 svn 问题
2017-11-27 09:21 4910今天项目,本来以为就几分钟的事没想到,还出现报错了,错误日记 ... -
log4j cfx 接口请求、返回信息 日志文件分离
2017-06-28 15:04 2101log4j.rootLogger=info,stdout, ... -
junit 启动报错:java.lang.NoClassDefFoundError
2013-04-17 19:31 1603junit 启动报错:java.lang.NoClassDe ... -
Java中抽象类和接口的区别
2013-04-16 12:12 990小结 1.abstract class 在 Java ... -
web.xml中servlet, bean, filter, listenr 加载顺序汇总
2013-03-28 16:17 1512web.xml中servlet, bean, filter, ... -
深入Java虚拟机JVM类加载初始化学习笔记
2013-03-26 20:39 12071. Classloader的作用,概括来说就是将编译后的c ... -
http代理出错Proxy Error
2013-03-22 09:15 1609最近项目突然访问几下次报: Proxy Error ... -
通过javamelody监控web应用的性能指标
2013-03-04 12:00 17381、问题背景 为了提升应用的性能我们可能需要做很多分析和 ... -
javamelody监控
2013-03-04 11:50 1481. 将 javamelody-1.42.0.war 文件部署 ... -
myeclipse安装svn插件的肯定可行的方法
2012-12-18 21:26 9201、下载最新的SVN包:http://subclipse.ti ... -
WordTemplate 使用
2012-03-27 11:28 1195http://wiki.softartisans.com/di ... -
asyn4j -- 异步方法调用框架
2012-03-14 14:15 01.3更新 优化代码 新增任务持久与恢复功能 ... -
JasperReport
2011-09-01 13:45 1242“在JRE 5以上的java环境中,java会自动加载$JAV ... -
解决Linux操作系统下AES解密失败的问题
2011-03-11 16:00 6995现象描述: windows上加解密正常,linu ... -
使用set+list进行过滤重复并排序
2011-02-28 11:30 1796有时要把有重复的数据用set去掉重复元素,但用set后又把元素 ... -
ssh 事务
2011-01-12 23:03 1149ssh在做事务提交时,不能直接用Sql语句进行insert i ... -
struts2与 json
2011-01-10 09:17 1199需要注意的是,如果用JSON插件把返回结果定为JSON。而JS ... -
struts2返回json数据问题
2011-01-06 20:58 1269最近同事反映struts2返回数据不了json数据,特意测试了 ... -
如何使用xFire开发webService返回复杂对象List
2011-01-04 09:53 1869调用 Web Services 时,经常需要返回集合( col ...
相关推荐
`asyn4j for java 1.4` 是一个专为Java 1.4及更高版本设计的异步方法调用框架。在Java早期版本中,由于并发处理能力的限制,开发者往往需要手动处理多线程,这增加了代码的复杂性和出错的可能性。`asyn4j` 提供了一...
Spring 框架提供了 @Async 注解来实现异步调用,该注解可以在方法上添加,以使得方法被异步调用。下面我们将详细介绍 Spring @Async 方法如何添加注解实现异步调用。 什么是 @Async 注解 @Async 注解是一个 Spring...
在【压缩包子文件的文件名称列表】"Asyn_Ice_WinformDemo"中,我们可以推测这个压缩包包含了一个完整的winform项目,可能有以下几个部分: 1. **解决方案文件(Solution File)**:通常为`.sln`文件,包含了项目的...
然后,在方法上添加@Async注解,声明该方法为异步调用方法。这样,在执行该方法时,将会在独立的线程中被执行,调用者无需等待它的完成。 四、使用@Async注解 @Async注解可以应用于无返回值方法和有返回值方法。在...
使用传统的同步编程模型时,如果请求中的某个操作需要等待I/O响应(如数据库操作或调用外部Web API),那么这个线程就会被阻塞,直到该操作完成。这将导致线程池中的线程数量有限而无法处理更多的并发请求。 异步...
- **asyn**:布尔值,表示是否采用异步方式处理请求,默认为 true 表示异步。 #### 2.2 函数逻辑分析 1. **初始化 XMLHttpRequest 对象**: - 检查浏览器环境,尝试创建 XMLHttpRequest 对象。对于现代浏览器使用...
// asyn network mHandler.sendEmptyMessageDelayed(MSG_POLLING, POLLING_INTERVAL); } ``` 在上面的代码中,我们使用 `Handler` 对象来实现轮询机制。我们首先定义了一个 `MSG_POLLING` 消息,然后在 `...
`getA`方法中的`this`指向`a`实例,所以`funA()`调用时,`this.name`输出`123`。 4. 找出字符串中出现次数最多的字符及其次数: 这道编程题可以通过遍历字符串,使用哈希表(对象)记录每个字符出现的次数,最后找...
#### 四、不用中间变量,用两种方法交换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;...
- **静态方法 实例方法区别**:静态方法不依赖于对象存在,实例方法通过对象调用。 - **静态内部类、成员内部类、局部内部类、匿名内部类**:不同类型的内部类,具有不同的作用域和生命周期。 - **equals方法**:...
三次握手过程包括了主机A向主机B请求建立连接、主机B确认请求、主机A确认主机B的数据段三个步骤,而四次挥手则是结束TCP连接的四个步骤。此外,面试官还可能询问你如何解决SYNFLOOD攻击这一常见的DDoS攻击。 在Web...
4. **TCP的三次握手与四次挥手**:三次握手确保了双方都能通信,四次挥手用于断开连接,防止"半关闭"状态。 5. **设计汽车摇号系统**:涉及概率计算和随机数生成,需要确保公平性和效率。 6. **Linux命令**:例如`...
- **反射原理**:通过Class对象获取类的信息,创建实例、调用方法等。 - **创建实例方式**:使用Class对象的newInstance()方法、Constructor对象的newInstance()方法等。 ##### 4.2.2 Class.forName与ClassLoader的...