zoukankan      html  css  js  c++  java
  • AsyncToken模式替换通用的Listener模式

    对于一个异步的方法调用,我们需要异步的得到调用结果,通常我们会使用Listener模式,用于监听方法异步调用的结果.

    但应用该方法在实际使用中其实并不灵活.

    1.因为由于Service的方法很多,可能会导致Listener要监听的事件过多.

    2.一般Listenner都是事先设置好监听器,不能在方法调用的过程中灵活的增加新的监听器

    3.对如发送消息失败再次发送消息这种需求处理会比较别扭.

    以下为应用AsyncToken的使用示例:

    Java代码 复制代码 收藏代码
    1. public void testSendEmail() {   
    2.     final String address = "badqiu(a)gmail.com";   
    3.     final String subject = "test";   
    4.     final String content = "async token test";   
    5.        
    6.     //返回的token,包含token.addResponder()用于监听异步方法的执行结果   
    7.     AsyncToken token = sendAsyncEmail(address,subject,content);   
    8.        
    9.     //token可以继续传递给外部,以便外面感兴趣的listener监听这个异步方法的执行结果   
    10.     token.addResponder(new IResponder() {   
    11.         public void onFault(Exception fault) {   
    12.             System.out.println("email send fail,cause:"+fault);   
    13.             //此处可以直接引用address,subject,content,如,我们可以再次发送一次   
    14.             sendAsyncEmail(address,subject,content);   
    15.         }   
    16.         public void onResult(Object result) {   
    17.             System.out.println("email send success,result:"+result);   
    18.         }   
    19.     });   
    20. }   
    21.   
    22. public AsyncToken sendAsyncEmail(String address,String subject,String content) {   
    23.     final AsyncToken token = new AsyncToken();   
    24.        
    25.     Thread thread = new Thread(new Runnable() {   
    26.         public void run() {   
    27.             try {   
    28.                 //do send email job...   
    29.                 token.setComplete(executeResult); //通知Responder token执行完   
    30.             }catch(Exception e) {   
    31.                 token.setFault(e); //通知Responder token发生错误   
    32.             }   
    33.         }   
    34.     });   
    35.     thread.start();   
    36.        
    37.     return token;   
    38. }  
    	public void testSendEmail() {
    		final String address = "badqiu(a)gmail.com";
    		final String subject = "test";
    		final String content = "async token test";
    		
    		//返回的token,包含token.addResponder()用于监听异步方法的执行结果
    		AsyncToken token = sendAsyncEmail(address,subject,content);
    		
    		//token可以继续传递给外部,以便外面感兴趣的listener监听这个异步方法的执行结果
    		token.addResponder(new IResponder() {
    			public void onFault(Exception fault) {
    				System.out.println("email send fail,cause:"+fault);
    				//此处可以直接引用address,subject,content,如,我们可以再次发送一次
    				sendAsyncEmail(address,subject,content);
    			}
    			public void onResult(Object result) {
    				System.out.println("email send success,result:"+result);
    			}
    		});
    	}
    	
    	public AsyncToken sendAsyncEmail(String address,String subject,String content) {
    		final AsyncToken token = new AsyncToken();
    		
    		Thread thread = new Thread(new Runnable() {
    			public void run() {
    				try {
    					//do send email job...
    					token.setComplete(executeResult); //通知Responder token执行完
    				}catch(Exception e) {
    					token.setFault(e); //通知Responder token发生错误
    				}
    			}
    		});
    		thread.start();
    		
    		return token;
    	}

    如上代码,使用AsyncToken的好处:

    1. token可以无限传递,只要对方法的执行结果感兴趣,都可以监听方法的执行结果.

    2. 拥有上下文,还可以引用前面的参数,以执行任务email重发这种任务

    3. 一个token与一个方法对应,方法调用时你即知道token对应的事件,不需要使用listener模式中的一般用EventType来区别不现的事件

    3. 灵活转换,也可以将上面的token再转至listener,再由listener以事件的方式派发事件

    与Listener的异同:

    1.token可以无限传递

    2.没有使用事件或是监听不同的方法,listener一般配合需要使用事件,然后由事件进行参数的绑定.

    3.listener模式一般是先设置好listener,而AsyncToken可以得到token后再添加监听方法

    AsyncToken的源码:

    http://code.google.com/p/rapid-framework/source/browse/trunk/rapid-framework/src/rapid_framework_common/cn/org/rapid_framework/util/concurrent/async/AsyncToken.java

  • 相关阅读:
    Struts2框架详解
    Eclipse利用Axis2插件构建Web Service并测试
    解决JS中各浏览器Date格式不兼容的问题
    Struts2框架下表单数据的流向以及映射关系
    JMS总结
    第一次博客园
    微信OAuth2网页授权
    将List转换成DataTable
    对文件的读写操作
    Excel文件的导出操作
  • 原文地址:https://www.cnblogs.com/pyrmkj/p/2479887.html
Copyright © 2011-2022 走看看