美文网首页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 使用学习八(异步调用)

    图片来源:点击打开链接 整个异步过程图片描述的很清楚,下面来看看代码: 一、服务提供者 1、服务提供者接口 [ja...

  • Dubbo中的那些坑(二)异步调用

    Dubbo异步调用 Dubbo原生支持异步调用,但其中依然有坑。 异步调用依赖传递性 问题表现:如果consume...

  • Dubbo剖析-异步调用实现

    一、前言 前面文章讲解了dubbo服务消费方异步调用使用,本文就来讲解如何实现的异步调用。 二、异步调用服务消费端...

  • Dubbo的异步调用

    Dubbo调用的过程会有网络延时,处理耗时等,如果业务上对于调用结果并不实时依赖,可以使用异步调用的方式Dubbo...

  • Java进阶-Dubbo-进阶

    一、服务调用过程 1.1 服务调用方式   Dubbo 服务调用过程:   Dubbo 支持同步和异步两种调用方式...

  • Dubbo使用了CompletableFuture,实现了真异步

    Dubbo在服务调用时支持同步调用和异步调用等方式。 在Dubbo2.6版本及之前的版本在实现异步调用时存在一定的...

  • Dubbo异步调用

    https://developer.aliyun.com/article/608811[https://devel...

  • 2-2 异步调用

    使用 异步调用的使用非常简单,只需要如下配置 async="true" 便是异步调用,默认同步。 异步调用指的...

  • Dubbo 服务调用 总结(八)

    笔记简述结合之前学习的两篇笔记 Dubbo 服务调用 源码学习(上)(六)和 Dubbo 服务调用 源码学习(下)...

  • Dubbo中的那些坑(四)HTTP调用

    Dubbo的HTTP调用 Dubbo实现了HTTP调用,但只是走了HTTP协议而已,并没有使用诸如REST的调用方...

网友评论

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

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