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

图片来源:点击打开链接

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

一、服务提供者

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 这两步,没有了其他的步骤所以速度也就比较快……

推荐阅读更多精彩内容