dubbo 使用學習八(非同步呼叫)
阿新 • • 發佈:2019-02-01
整個非同步過程圖片描述的很清楚,下面來看看程式碼:
一、服務提供者
1、服務提供者介面
package com.test.dubboser;
public interface ServiceDemo2 {
public Person getPerson(String str,int age);
}
2、Person 類
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、服務提供者介面實現類
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、配置檔案
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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 "> <!-- 提供方應用資訊,用於計算依賴關係,這個和client沒必要一致 --> <dubbo:application name="hello-world-app-my" /> <!-- 多註冊中心配置 --> <dubbo:registry protocol="zookeeper" address="192.168.0.102:2181"/> <!-- 用dubbo協議在20880埠暴露服務 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- 宣告需要暴露的服務介面 --> <dubbo:service interface="com.test.dubboser.ServiceDemo" ref="demoService"/> <dubbo:service interface="com.test.dubboser.ServiceDemo2" ref="demoService2"/> <dubbo:service interface="com.test.dubboser.CacheService" ref="cacheService"/> <!--和本地bean一樣實現服務 --> <bean id="demoService" class="com.test.dubboser.ServiceImp"/> <bean id="demoService2" class="com.test.dubboser.ServiceImp2"/> <!-- 結果快取 --> <bean id="cacheService" class="com.test.dubboser.CacheServiceImp"/> </beans>
二、服務消費者
1、配置檔案
注意這裡的這一行,實現非同步配置<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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 "> <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方一樣 --> <dubbo:application name="consumer-of-helloworld-app-my" /> <!-- 使用zookeeper廣播註冊中心暴露發現服務地址 --> <dubbo:registry protocol="zookeeper" address="192.168.0.102:2181"/> <!--獲取服務 --> <dubbo:reference id="demoServicemy" interface="com.test.dubboser.ServiceDemo"/> <!--非同步功能實現--> <dubbo:reference id="demoServicemy2" interface="com.test.dubboser.ServiceDemo2"> <dubbo:method name="getPerson" async="true" /> </dubbo:reference> <!--結果快取配置 --> <dubbo:reference id="cacheService" interface="com.test.dubboser.CacheService" cache="true"/> </beans>
<dubbo:reference id="demoServicemy2" interface="com.test.dubboser.ServiceDemo2">
<dubbo:method name="getPerson" async="true" />
</dubbo:reference>
2、消費者程式碼
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<Person> pFuture = RpcContext.getContext().getFuture();
//如果Person已返回,直接拿到返回值,否則執行緒wait,等待Person返回後,執行緒會被notify喚醒。
person = pFuture.get();
System.out.println("返回的有值"+person);
System.out.println(person);
}
}
3、執行結果
立即返回的為null:null
future中獲取值:name:www age:13
三、非同步返回值,和非同步無返回值
你也可以設定是否等待訊息發出:(非同步總是不等待返回)
1、sent="true" 等待訊息發出,訊息傳送失敗將丟擲異常。
2、sent="false" 不等待訊息發出,將訊息放入IO佇列,即刻返回。
<dubbo:reference id="demoServicemy2" interface="com.test.dubboser.ServiceDemo2">
<dubbo:method name="getPerson" async="true" sent="true" />
</dubbo:reference>
3、如果你只是想非同步,完全忽略返回值,可以配置return="false",以減少Future物件的建立和管理成本:
<dubbo:reference id="demoServicemy2" interface="com.test.dubboser.ServiceDemo2">
<dubbo:method name="getPerson" async="true" return="false" />
</dubbo:reference>
設定了return =“false”後我們就獲取不到Future物件,當然就獲取不到返回值,這樣就只有非同步呼叫了服務端方法而沒有返回值,執行的流程也就是最開始圖形中的1和2 這兩步,沒有了其他的步驟所以速度也就比較快……