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