收藏 分享(赏)

Java 异步消息处理.doc

上传人:fmgc7290 文档编号:8727856 上传时间:2019-07-09 格式:DOC 页数:10 大小:56.50KB
下载 相关 举报
Java 异步消息处理.doc_第1页
第1页 / 共10页
Java 异步消息处理.doc_第2页
第2页 / 共10页
Java 异步消息处理.doc_第3页
第3页 / 共10页
Java 异步消息处理.doc_第4页
第4页 / 共10页
Java 异步消息处理.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、Java 异步消息处理一. 它要能适应不同类型的请求:本节用 makeString 来说明要求有返回值的请求. 用 displayString 来说明不需要返回值的请求.二. 要能同时并发处理多个请求,并能按一定机制调度:本节将用一个队列来存放请求,所以只能按 FIFO 机制调度,你可以改用LinkedList,就可以简单实现一个优先级(优先级高的 addFirst,低的 addLast).三. 有能力将调用的边界从线程扩展到机器间(RMI)四. 分离过度耦合,如分离调用句柄(取货凭证)和真实数据的实现. 分离调用和执行的过程,可以尽快地将调返回.现在看具体的实现:public interfa

2、ce Axman Result resultTest(int count,char c);void noResultTest(String str);这个接口有两个方法要实现,就是有返回值的调用 resultTest 和不需要返回值的调用noResultTest, 我们把这个接口用一个代理类来实现,目的是将方法调用转化为对象,这样就可以将多个请求(多个方法调)放到一个容器中缓存起来,然后统一处理,因为 Java 不支持方法指针,所以把方法调用转换为对象,然后在这个对象上统一执行它们的方法,不仅可以做到异步处理,而且可以将代表方法调用的请求对象序列化后通过网络传递到另一个机器上执行(RMI).

3、这也是 Java 回调机制最有力的实现.一个简单的例子.如果 1: 做 A如果 2: 做 B如果 3: 做 C如果有1000个情况,你不至于用 1000个 case 吧?以后再增加呢?所以如果 C/C+程序员,会这样实现 : (c 和 c+定义结构不同 )type define struct MyStructint mark;(*fn) (); MyList;然后你可以声明这个结构数据:1,A,2,B3,C做一个循环:for(i=0;i= this.requestQueue.length)try this.wait();catch (Throwable t) this.requestQueue

4、this.tail = request;tail = (tail + 1)%this.requestQueue.length;count + ;this.notifyAll();public synchronized MethodRequest takeRequest()while(this.count = 0)try this.wait();catch (Throwable t) MethodRequest request = this.requestQueuethis.head;this.head = (this.head + 1) % this.requestQueue.length;c

5、ount -;this.notifyAll();return request;为了将方法调用转化为对象,我们通过实现 MethodRequest 对象的 execute 方法来方法具体方法转换成具体对象:abstract class MethodRequestprotected final Servant servant;protected final FutureResult future;protected MethodRequest(Servant servant,FutureResult future)this.servant = servant;this.future = futur

6、e;public abstract void execute();class ResultRequest extends MethodRequestprivate final int count;private final char c;public ResultRequest(Servant servant,FutureResult future,int count,char c)super(servant,future);this.count = count;this.c = c;public void execute()Result result = servant.resultTest

7、(this.count,this.c);this.future.setResult(result);class NoResultRequest extends MethodRequestprivate String str;public NoResultRequest(Servant servant,String str)super(servant,null);this.str = str;public void execute()this.servant.noResultTest(str);而返回的数据我们也将真实数据的获取和取货凭证逻辑分离:package com.axman.jasync

8、;public abstract class Result public abstract Object getResult();class FutureResult extends Resultprivate Result result;private boolean completed;public synchronized void setResult(Result result)this.result = result;pleted = true;this.notifyAll();public synchronized Object getResult()while(!pleted)t

9、rythis.wait();catch(Throwable t)return this.result.getResult();class RealResult extends Resultprivate final Object result;public RealResult(Object result)this.result = result;public Object getResult()return this.result;OK,现在这个异步消息处理器已经有了模型,这个异步处理器中有昭雪些对象参与呢?Servant 忠心做真实的事务ActivationQueue 将请求缓存起来以便调

10、度Scheduler 对容器中的请求根据一定原则进行调度执行Proxy 将特定方法请求转换为特定对象所有这些都是这个异步处理器的核心部件,虽然是核心部件 ,我们就要进行封装而不能随便让调用者来修改,所以我们用工厂模式(我 KAO,我实在不想提模式但有时找不到其它词来表述)来产生处理器 Axman 对象:package com.axman.jasync;public class AxmanFactory public static Axman createAxman() Servant s = new Servant();ActivationQueue queue = new Activatio

11、nQueue();Scheduler st = new Scheduler(queue);Proxy p = new Proxy(st,s);st.start();return p;好了,我们现在用两个请求的产生者不停产生请求:ResultInvokeThreadv 发送有返回值的请求 :package com.axman.jasync;public class ResultInvokeThread extends Threadprivate final Axman ao;private final char c;public ResultInvokeThread(String name,Ax

12、man ao)this.ao = ao;this.c = name.charAt(0);public void run()tryint i = 0;while(true)Result result = this.ao.resultTest(i+,c);Thread.sleep(10);String = (String)result.getResult();System.out.println(Thread.currentThread().getName() + “ = “ + );catch(Throwable t)NoResultInvokeThread 发送无返回值的请求 :package

13、 com.axman.jasync;public class NoResultInvokeThread extends Threadprivate final Axman ao;public NoResultInvokeThread(String name,Axman ao)super(name);this.ao = ao;public void run()tryint i = 0;while(true)String s = Thread.currentThread().getName() + i+;ao.noResultTest(s);Thread.sleep(20);catch(Throw

14、able t)对了,我们还需要一个什么东西来产生一个演示:package com.axman.jasync;public class Program public static void main(String args) Axman ao = AxmanFactory.createAxman();new ResultInvokeThread(“Axman“,ao).start();new ResultInvokeThread(“Sager“,ao).start();new NoResultInvokeThread(“Macke“,ao).start();看看结果吧.你可以把不同类型的请求不断

15、地向处理器发送 ,处理器会不断地接收请求,放到队列中,并同时不断从队列中提出请求进行处理.在调用一个方法的时候,程序会进入被调用方法体内,执行完这个被调用方法后,才返回执行下一条语句。怎么做到像 ajax 异步请求一样,发送请求后,没等请求响应就执行下一条语句呢?对于 java 的异步请求,找了许多教材都没有找到,如 thinking in java、core java2 等等。受多线程下载工具以及 mootools 的Request 的启发,做了一个 java 版的 Request,不知它的性能如何。Request:请求载体public class Request private Reque

16、stContent rc;/请求主体public Request(RequestContent rc)this.rc=rc;protected void start() /开始请求final Thread t=new Thread(new Runnable()public void run()tryrc.doSomeThing();/响应请求catch (Exception e) e.printStackTrace();rc.onFailure(); /如果执行失败rc.onSuccess();/如果执行成功);t.start();RequestContent:请求主体abstract cla

17、ss RequestContent void onSuccess() /执行成功的动作。用户可以覆盖此方法System.out.println(“onSuccess“);void onFailure() /执行失败的动作。用户可以覆盖此方法System.out.println(“onFailure“);abstract void doSomeThing(); /用户必须实现这个抽象方法,告诉子线程要做什么Test:测试new Request(new RequestContent()void doSomeThing()System.out.println(“doSomething“);void onSuccess()System.out.println(“override onSuccess“);).start();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报