美文网首页Dubbo
dubbo 使用学习八(异步调用)

dubbo 使用学习八(异步调用)

作者: 安琪拉_4b7e | 来源:发表于2017-11-09 11:29 被阅读0次

    图片来源:点击打开链接

    整个异步过程图片描述的很清楚,下面来看看代码:

    一、服务提供者

    1、服务提供者接口

    [java]view plaincopyprint?

    packagecom.test.dubboser;

    publicinterfaceServiceDemo2 {

    publicPerson getPerson(String str,intage);

    }

    package com.test.dubboser;

    public interface ServiceDemo2 {

    public Person getPerson(String str,int age);

    }

    2、Person 类

    [java]view plaincopyprint?

    packagecom.test.dubboser;

    importjava.io.Serializable;

    publicclassPersonimplementsSerializable {

    /**

    *

    */

    privatestaticfinallongserialVersionUID = 8661104133888956335L;

    privateintage;

    privateString name;

    publicPerson(){}

    publicPerson(intage ,String name){

    this.age= age;

    this.name=name;

    }

    publicintgetAge() {

    returnage;

    }

    publicvoidsetAge(intage) {

    this.age = age;

    }

    publicString getName() {

    returnname;

    }

    publicvoidsetName(String name) {

    this.name = name;

    }

    @Override

    publicString  toString(){

    StringBuffer  buffer=newStringBuffer();

    buffer.append("name:"+name+"\t");

    buffer.append("age:"+age);

    returnbuffer.toString();

    }

    }

    package com.test.dubboser;

    import java.io.Serializable;

    public class Person implements Serializable {

    /**

    *

    */

    private static final long serialVersionUID = 8661104133888956335L;

    private int age;

    private String name;

    public Person(){}

    public Person(int age ,String name){

    this.age= age;

    this.name=name;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    @Override

    public String  toString(){

    StringBuffer  buffer= new StringBuffer();

    buffer.append("name:"+name+"\t");

    buffer.append("age:"+age);

    return buffer.toString();

    }

    }

    3、服务提供者接口实现类

    [java]view plaincopyprint?

    packagecom.test.dubboser;

    publicclassServiceImp2implementsServiceDemo2{

    publicPerson getPerson(String str,intage) {

    Person person=newPerson();

    person.setName(str);

    person.setAge(age);

    returnperson;

    }

    }

    package com.test.dubboser;

    public class ServiceImp2 implements ServiceDemo2{

    public Person getPerson(String str,int age) {

    Person person=new Person();

    person.setName(str);

    person.setAge(age);

    return person;

    }

    }

    4、配置文件

    [html]view plaincopyprint?

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://code.alibabatech.com/schema/dubbo

    http://code.alibabatech.com/schema/dubbo/dubbo.xsd

    ">

    ref="demoService"/>

    ref="demoService2"/>

    ref="cacheService"/>

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://code.alibabatech.com/schema/dubbo

    http://code.alibabatech.com/schema/dubbo/dubbo.xsd

    ">

    ref="demoService"/>

    ref="demoService2"/>

    ref="cacheService"/>

    二、服务消费者

    1、配置文件

    [html]view plaincopyprint?

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://code.alibabatech.com/schema/dubbo

    http://code.alibabatech.com/schema/dubbo/dubbo.xsd

    ">

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://code.alibabatech.com/schema/dubbo

    http://code.alibabatech.com/schema/dubbo/dubbo.xsd

    ">

    注意这里的这一行,实现异步配置

    [html]view plaincopyprint?

    2、消费者代码

    [java]view plaincopyprint?

    packagecom.test.dubbocli;

    importjava.util.concurrent.ExecutionException;

    importjava.util.concurrent.Future;

    importorg.springframework.context.support.ClassPathXmlApplicationContext;

    importcom.alibaba.dubbo.rpc.RpcContext;

    importcom.test.dubboser.CacheService;

    importcom.test.dubboser.Person;

    importcom.test.dubboser.ServiceDemo;

    importcom.test.dubboser.ServiceDemo2;

    publicclassMain {

    publicstaticvoidmain(String[] args)throwsInterruptedException, ExecutionException {

    run();

    }

    publicstaticvoidrun()throwsInterruptedException, ExecutionException{

    ClassPathXmlApplicationContext context =newClassPathXmlApplicationContext(newString[] {"applicationConsumer.xml"});

    context.start();

    //ServiceDemo demoServer = (ServiceDemo) context.getBean("demoServicemy");

    ServiceDemo2 demoServer2 = (ServiceDemo2) context.getBean("demoServicemy2");

    /*ServiceDemo demoServer3 = (ServiceDemo) context.getBean("demoServicemy3");*/

    /*String str=demoServer.say("java ---->>>");*/

    //调用后立即返回null

    Person person=demoServer2.getPerson("www",13);

    System.err.println("立即返回的为null:"+person);

    //拿到调用的Future引用,当结果返回后,会被通知和设置到此Future。

    Future pFuture = RpcContext.getContext().getFuture();

    //如果Person已返回,直接拿到返回值,否则线程wait,等待Person返回后,线程会被notify唤醒。

    person = pFuture.get();

    System.out.println("返回的有值"+person);

    System.out.println(person);

    }

    }

    package com.test.dubbocli;

    import java.util.concurrent.ExecutionException;

    import java.util.concurrent.Future;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import com.alibaba.dubbo.rpc.RpcContext;

    import com.test.dubboser.CacheService;

    import com.test.dubboser.Person;

    import com.test.dubboser.ServiceDemo;

    import com.test.dubboser.ServiceDemo2;

    public class Main {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

    run();

    }

    public static void run() throws InterruptedException, ExecutionException{

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationConsumer.xml" });

    context.start();

    //ServiceDemo demoServer = (ServiceDemo) context.getBean("demoServicemy");

    ServiceDemo2 demoServer2 = (ServiceDemo2) context.getBean("demoServicemy2");

    /*ServiceDemo demoServer3 = (ServiceDemo) context.getBean("demoServicemy3");*/

    /*String str=demoServer.say("java ---->>>");*/

    //调用后立即返回null

    Person person=demoServer2.getPerson("www", 13);

    System.err.println("立即返回的为null:"+person);

    //拿到调用的Future引用,当结果返回后,会被通知和设置到此Future。

    Future pFuture = RpcContext.getContext().getFuture();

    //如果Person已返回,直接拿到返回值,否则线程wait,等待Person返回后,线程会被notify唤醒。

    person = pFuture.get();

    System.out.println("返回的有值"+person);

    System.out.println(person);

    }

    }

    3、运行结果

    [html]view plaincopyprint?

    立即返回的为null:null

    future中获取值:name:www age:13

    立即返回的为null:null

    future中获取值:name:www age:13

    三、异步返回值,和异步无返回值

    你也可以设置是否等待消息发出:(异步总是不等待返回)

    1、sent="true" 等待消息发出,消息发送失败将抛出异常。

    2、sent="false" 不等待消息发出,将消息放入IO队列,即刻返回。

    [html]view plaincopyprint?

    3、如果你只是想异步,完全忽略返回值,可以配置return="false",以减少Future对象的创建和管理成本:

    [html]view plaincopyprint?

    设置了return =“false”后我们就获取不到Future对象,当然就获取不到返回值,这样就只有异步调用了服务端方法而没有返回值,执行的流程也就是最开始图形中的1和2 这两步,没有了其他的步骤所以速度也就比较快……

    相关文章

      网友评论

        本文标题:dubbo 使用学习八(异步调用)

        本文链接:https://www.haomeiwen.com/subject/wyspmxtx.html