`
badqiu
  • 浏览: 670256 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

[设计模式]AsyncToken模式,替换通常的Listener模式

    博客分类:
  • Java
阅读更多

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

 

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

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

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

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

 

 

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

	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

 

参考:

Flex中的AsyncToken

 

 

3
0
分享到:
评论
6 楼 Loudyn 2011-04-10  
实在是看不出哪点异步了。
AsyncToken可以直接在客户端实例化,更想不通。
5 楼 badqiu 2009-09-13  
这个也是跟Listener的区别,忘提了. 实际使用就是这样.

Listener就是要先设置好,而应用token则随便都可以添加responder,这样灵活.

4 楼 julyboxer 2009-09-13  
julyboxer 写道
  是否应该在启动线程的之前就添加相应的response呢?.  线程启动后再去添加一些responser是否会误导人呢??

感觉不是一个好的编程习惯
3 楼 julyboxer 2009-09-13  
  是否应该在启动线程的之前就添加相应的response呢?.  线程启动后再去添加一些responser是否会误导人呢??
2 楼 badqiu 2009-09-10  
上面代码只是演示AsyncToken的使用,实际使用肯定会使用如线程池等东西,而且高负载的应用才需要使用异步来优化性能,如发送邮件,你可能需要专门的邮件发送服务器,再加JMS服务器来实现消息可靠的异步转发至邮件发送服务器
1 楼 ixu 2009-09-10  
异步是个好东西,楼主这个用在客户端应该不错。不过,如果是一个高负载的后台服务程序,由于线程资源是有限的,如果异步事件很多,每次这样创建新的线程,很可能消耗大量的线程资源,不知有没有考虑这个问题?

相关推荐

    设计模式系列之观察者模式

    观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...

    java 设计模式 观察者 源码

    观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...

    观察者模式的一个应用

    观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。...

    C++设计模式之观察者模式(Observer)

    观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...

    观察者模式

    观察者设计模式观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者<Source/Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它...

    观察者模式java实现观察者设计模式

    java实现观察者设计模式,利用ApplicationListener和ApplicationEvent。Test包里有测试代码

    listener 实例

    监听实例 记录 远程登录监听实例 记录 远程登录监听实例 记录 远程登录

    C#Winform使用TCPListener加多线程编程实现客户端服务器端聊天模式

    C#Winform使用TCPListener和TCPClient加多线程编程实现客户端服务器端聊天模式,使用委托避免控件访问异常

    Servlet中的八大Listener

    Servlet中的八大Listener.docServlet中的八大Listener.docServlet中的八大Listener.docServlet中的八大Listener.docServlet中的八大Listener.docServlet中的八大Listener.docServlet中的八大Listener.docServlet中的...

    Java 观察者模式的浅析

    Java 观察者模式的浅析 ... 观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。

    TcpClient TcpListener Demo

    TcpClient TcpListener Demo 案例 TcpClient TcpListener Demo 案例 TcpClient TcpListener Demo 案例 TcpClient TcpListener Demo 案例 QQ:574311505

    TcpListener 监听服务端

    TcpListener 监听服务端,可实现多客户端连接

    SpringBoot整合Listener的两种方式.docx

    SpringBoot整合Listener的两种方式: 1.通过注解扫描完成Listener组件的注册 1.创建一个类实现 ServletContextListener (具体实现哪个Listener根据情况来判断) 2.在类上加入注解 @WebListener 3.重写 context...

    java jsp listener小用法

    java jsp listener小用法,记录登录次数。

    listener监听器demo

    listener监听器小例子

    ORA-12541 TNSno listener 的解决方案

    ORA-12541 TNSno listener 的解决方案 ORA-12541 TNSno listener 的解决方案

    mac_Listener.dmg

    mac_Listener

    Android Listener侦听的N种写法

    Android Listener侦听的N种写法

    c# tcplistener tcp监控

    c# tcplistener tcp 监控

    SpringBoot ApplicationListener观察者模式示例

    1. 发布订阅/观察者模型,实现业务之间的解耦。 2.比如新增用户完成需要发短信、记录日志等,这些逻辑堆在新增方法的最后面实在不太合理,而且不易复用。 3.对解耦代码有很大的帮助,比如多种业务场景做完都要插入...

Global site tag (gtag.js) - Google Analytics