½á¹û»º´æ
½á¹û»º´æ£¬ÓÃÓÚ¼ÓËÙÈÈÃÅÊý¾ÝµÄ·ÃÎÊËÙ¶È£¬DubboÌṩÉùÃ÷ʽ»º´æ£¬ÒÔ¼õÉÙÓû§¼Ó»º´æµÄ¹¤×÷Á¿¡£
2.1.0ÒÔÉϰ汾֧³Ö
ʾÀý´úÂ룺https://github.com/alibaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache
lru »ùÓÚ×î½ü×îÉÙʹÓÃÔÔòɾ³ý¶àÓ໺´æ£¬±£³Ö×îÈȵÄÊý¾Ý±»»º´æ¡£
threadlocal µ±Ç°Ï̻߳º´æ£¬±ÈÈçÒ»¸öÒ³ÃæäÖȾ£¬Óõ½ºÜ¶àportal£¬Ã¿¸öportal¶¼ÒªÈ¥²éÓû§ÐÅÏ¢£¬Í¨¹ýÏ̻߳º´æ£¬¿ÉÒÔ¼õÉÙÕâÖÖ¶àÓà·ÃÎÊ¡£
jcache ÓëJSR107¼¯³É£¬¿ÉÒÔÇŽӸ÷ÖÖ»º´æÊµÏÖ¡£
»º´æÀàÐÍ¿ÉÀ©Õ¹£¬²Î¼û£ºCacheFactoryÀ©Õ¹µã
ÅäÖÃÈ磺
<dubbo:reference
interface="com.foo.BarService"
cache="lru"
/> |
»ò£º
<dubbo:reference
interface="com.foo.BarService">
<dubbo:method
name="findBar"
cache="lru"
/>
</dubbo:reference> |
·º»¯ÒýÓÃ
·º½Ó¿Úµ÷Ó÷½Ê½Ö÷ÒªÓÃÓÚ¿Í»§¶ËûÓÐAPI½Ó¿Ú¼°Ä£ÐÍÀàÔªµÄÇé¿ö£¬²ÎÊý¼°·µ»ØÖµÖеÄËùÓÐPOJO¾ùÓÃMap±íʾ£¬Í¨³£ÓÃÓÚ¿ò¼Ü¼¯³É£¬±ÈÈ磺ʵÏÖÒ»¸öͨÓõķþÎñ²âÊÔ¿ò¼Ü£¬¿Éͨ¹ýGenericServiceµ÷ÓÃËùÓзþÎñʵÏÖ¡£
<dubbo:reference
id="barService"
interface="com.foo.BarService"
generic="true"
/> |
GenericService
barService = (GenericService) applicationContext.getBean("barService");
Object
result = barService.$invoke("sayHello",
new
String[] { "java.lang.String"
}, new
Object[] { "World"
});
|
import
com.alibaba.dubbo.rpc.service.GenericService;
//
ÒýÓÃÔ¶³Ì·þÎñ
ReferenceConfig<GenericService>
reference = new
ReferenceConfig<GenericService>(); //
¸ÃʵÀýºÜÖØÁ¿£¬ÀïÃæ·â×°ÁËËùÓÐÓë×¢²áÖÐÐļ°·þÎñÌṩ·½Á¬½Ó£¬Ç뻺´æ
reference.setInterface("com.xxx.XxxService");
//
ÈõÀàÐͽӿÚÃû
reference.setVersion("1.0.0");
reference.setGeneric(true);
//
ÉùÃ÷Ϊ·º»¯½Ó¿Ú
GenericService
genericService = reference.get(); //
ÓÃcom.alibaba.dubbo.rpc.service.GenericService¿ÉÒÔÌæ´úËùÓнӿÚÒýÓÃ
//
»ù±¾ÀàÐÍÒÔ¼°Date,List,MapµÈ²»ÐèҪת»»£¬Ö±½Óµ÷ÓÃ
Object
result = genericService.$invoke("sayHello",
new
String[] {"java.lang.String"},
new
Object[] {"world"});
//
ÓÃMap±íʾPOJO²ÎÊý£¬Èç¹û·µ»ØÖµÎªPOJOÒ²½«×Ô¶¯×ª³ÉMap
Map<String,
Object> person = new
HashMap<String, Object>();
person.put("name",
"xxx");
person.put("password",
"yyy");
Object
result = genericService.$invoke("findPerson",
new
String[]{"com.xxx.Person"},
new
Object[]{person}); //
Èç¹û·µ»ØPOJO½«×Ô¶¯×ª³ÉMap |
¼ÙÉè´æÔÚPOJOÈ磺
package
com.xxx;
public
class
PersonImpl implements
Person {
private
String name;
private
String password;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this.name
= name;
}
public
String getPassword() {
return
password;
}
public
void
setPassword(String password) {
this.password=
password;
}
} |
ÔòPOJOÊý¾Ý£º
Person
person = new
PersonImpl();
person.setName("xxx");
person.setPassword("yyy"); |
¿ÉÓÃÏÂÃæMap±íʾ£º
Map<String, Object> map = new
HashMap<String, Object>();
map.put("class",
"com.xxx.PersonImpl");
//
×¢Ò⣺Èç¹û²ÎÊýÀàÐÍÊǽӿڣ¬»òÕßListµÈ¶ªÊ§·ºÐÍ£¬¿Éͨ¹ýclassÊôÐÔÖ¸¶¨ÀàÐÍ¡£
map.put("name",
"xxx");
map.put("password",
"yyy"); |
·º»¯ÊµÏÖ
·º½Ó¿ÚʵÏÖ·½Ê½Ö÷ÒªÓÃÓÚ·þÎñÆ÷¶ËûÓÐAPI½Ó¿Ú¼°Ä£ÐÍÀàÔªµÄÇé¿ö£¬²ÎÊý¼°·µ»ØÖµÖеÄËùÓÐPOJO¾ùÓÃMap±íʾ£¬Í¨³£ÓÃÓÚ¿ò¼Ü¼¯³É£¬±ÈÈ磺ʵÏÖÒ»¸öͨÓõÄÔ¶³Ì·þÎñMock¿ò¼Ü£¬¿Éͨ¹ýʵÏÖGenericService½Ó¿Ú´¦ÀíËùÓзþÎñÇëÇó¡£
<bean
id="genericService"
class="com.foo.MyGenericService"
/>
<dubbo:service
interface="com.foo.BarService"
ref="genericService"
/> |
package
com.foo;
public
class
MyGenericService implements
GenericService {
public
Object $invoke(String methodName, String[] parameterTypes,
Object[] args)
throws
GenericException {
if
("sayHello".equals(methodName))
{
return
"Welcome "
+ args[0];
}
}
} |
...
GenericService
xxxService = new
XxxGenericService(); //
ÓÃcom.alibaba.dubbo.rpc.service.GenericService¿ÉÒÔÌæ´úËùÓнӿÚʵÏÖ
ServiceConfig<GenericService>
service = new
ServiceConfig<GenericService>(); //
¸ÃʵÀýºÜÖØÁ¿£¬ÀïÃæ·â×°ÁËËùÓÐÓë×¢²áÖÐÐļ°·þÎñÌṩ·½Á¬½Ó£¬Ç뻺´æ
service.setInterface("com.xxx.XxxService");
//
ÈõÀàÐͽӿÚÃû
service.setVersion("1.0.0");
service.setRef(xxxService);
//
Ö¸ÏòÒ»¸öͨÓ÷þÎñʵÏÖ
//
±©Â¶¼°×¢²á·þÎñ
service.export(); |
»ØÉù²âÊÔ
»ØÉù²âÊÔÓÃÓÚ¼ì²â·þÎñÊÇ·ñ¿ÉÓ㬻ØÉù²âÊÔ°´ÕÕÕý³£ÇëÇóÁ÷³ÌÖ´ÐУ¬Äܹ»²âÊÔÕû¸öµ÷ÓÃÊÇ·ñͨ³©£¬¿ÉÓÃÓÚ¼à¿Ø¡£
ËùÓзþÎñ×Ô¶¯ÊµÏÖEchoService½Ó¿Ú£¬Ö»Ð轫ÈÎÒâ·þÎñÒýÓÃÇ¿ÖÆ×ªÐÍΪEchoService£¬¼´¿ÉʹÓá£
<dubbo:reference
id="memberService"
interface="com.xxx.MemberService"
/> |
MemberService
memberService = ctx.getBean("memberService");
//
Ô¶³Ì·þÎñÒýÓÃ
EchoService
echoService = (EchoService) memberService; //
Ç¿ÖÆ×ªÐÍΪEchoService
String
status = echoService.$echo("OK");
//
»ØÉù²âÊÔ¿ÉÓÃÐÔ
assert(status.equals("OK"))
|
ÉÏÏÂÎÄÐÅÏ¢
ÉÏÏÂÎÄÖдæ·ÅµÄÊǵ±Ç°µ÷Óùý³ÌÖÐËùÐèµÄ»·¾³ÐÅÏ¢¡£
ËùÓÐÅäÖÃÐÅÏ¢¶¼½«×ª»»ÎªURLµÄ²ÎÊý£¬²Î¼û¡¶ÅäÖÃÏîÒ»ÀÀ±í¡·Öеġ°¶ÔÓ¦URL²ÎÊý¡±Ò»ÁС£
×¢Òâ
RpcContextÊÇÒ»¸öThreadLocalµÄÁÙʱ״̬¼Ç¼Æ÷£¬µ±½ÓÊÕµ½RPCÇëÇ󣬻ò·¢ÆðRPCÇëÇóʱ£¬RpcContextµÄ״̬¶¼»á±ä»¯¡£
±ÈÈ磺Aµ÷B£¬BÔÙµ÷C£¬ÔòB»úÆ÷ÉÏ£¬ÔÚBµ÷C֮ǰ£¬RpcContext¼Ç¼µÄÊÇAµ÷BµÄÐÅÏ¢£¬ÔÚBµ÷CÖ®ºó£¬RpcContext¼Ç¼µÄÊÇBµ÷CµÄÐÅÏ¢¡£
(1) ·þÎñÏû·Ñ·½
xxxService.xxx(); // Ô¶³Ìµ÷ÓÃ
boolean
isConsumerSide = RpcContext.getContext().isConsumerSide();
//
±¾¶ËÊÇ·ñΪÏû·Ñ¶Ë£¬ÕâÀï»á·µ»Øtrue
String
serverIP = RpcContext.getContext().getRemoteHost();
//
»ñÈ¡×îºóÒ»´Îµ÷ÓõÄÌṩ·½IPµØÖ·
String
application = RpcContext.getContext().getUrl().getParameter("application");
//
»ñÈ¡µ±Ç°·þÎñÅäÖÃÐÅÏ¢£¬ËùÓÐÅäÖÃÐÅÏ¢¶¼½«×ª»»ÎªURLµÄ²ÎÊý
//
...
yyyService.yyy();
//
×¢Ò⣺ÿ·¢ÆðRPCµ÷Óã¬ÉÏÏÂÎÄ״̬»á±ä»¯
//
...
|
(2) ·þÎñÌṩ·½
public
class
XxxServiceImpl implements
XxxService {
public
void
xxx() { //
·þÎñ·½·¨ÊµÏÖ
boolean
isProviderSide = RpcContext.getContext().isProviderSide();
//
±¾¶ËÊÇ·ñΪÌṩ¶Ë£¬ÕâÀï»á·µ»Øtrue
String
clientIP = RpcContext.getContext().getRemoteHost();
//
»ñÈ¡µ÷Ó÷½IPµØÖ·
String
application = RpcContext.getContext().getUrl().getParameter("application");
//
»ñÈ¡µ±Ç°·þÎñÅäÖÃÐÅÏ¢£¬ËùÓÐÅäÖÃÐÅÏ¢¶¼½«×ª»»ÎªURLµÄ²ÎÊý
//
...
yyyService.yyy();
//
×¢Ò⣺ÿ·¢ÆðRPCµ÷Óã¬ÉÏÏÂÎÄ״̬»á±ä»¯
boolean
isProviderSide = RpcContext.getContext().isProviderSide();
//
´Ëʱ±¾¶Ë±ä³ÉÏû·Ñ¶Ë£¬ÕâÀï»á·µ»Øfalse
//
...
}
}
|
Òþʽ´«²Î
×¢£ºpath,group,version,dubbo,token,timeout¼¸¸ökeyÓÐÌØÊâ´¦Àí£¬ÇëʹÓÃÆäËükeyÖµ¡£

(1) ·þÎñÏû·Ñ·½
RpcContext.getContext().setAttachment("index", "1"); // Òþʽ´«²Î£¬ºóÃæµÄÔ¶³Ìµ÷Óö¼»áÒþʽ½«ÕâЩ²ÎÊý·¢Ë͵½·þÎñÆ÷¶Ë£¬
ÀàËÆcookie£¬ÓÃÓÚ¿ò¼Ü¼¯³É£¬²»½¨Òé³£¹æÒµÎñʹÓÃ
xxxService.xxx();
//
Ô¶³Ìµ÷ÓÃ
//
...
|
¡¾×¢¡¿ setAttachmentÉèÖõÄKV£¬ÔÚÍê³ÉÏÂÃæÒ»´ÎÔ¶³Ìµ÷ÓûᱻÇå¿Õ¡£¼´¶à´ÎÔ¶³Ìµ÷ÓÃÒª¶à´ÎÉèÖá£
(2) ·þÎñÌṩ·½
public
class
XxxServiceImpl implements
XxxService {
public
void
xxx() { //
·þÎñ·½·¨ÊµÏÖ
String
index = RpcContext.getContext().getAttachment("index");
//
»ñÈ¡¿Í»§¶ËÒþʽ´«ÈëµÄ²ÎÊý£¬ÓÃÓÚ¿ò¼Ü¼¯³É£¬²»½¨Òé³£¹æÒµÎñʹÓÃ
//
...
}
}
|
Òì²½µ÷ÓÃ
»ùÓÚNIOµÄ·Ç×èÈûʵÏÖ²¢Ðе÷Ó㬿ͻ§¶Ë²»ÐèÒªÆô¶¯¶àÏ̼߳´¿ÉÍê³É²¢Ðе÷Óöà¸öÔ¶³Ì·þÎñ£¬Ïà¶Ô¶àÏ߳̿ªÏú½ÏС¡£
2.0.6¼°ÆäÒÔÉϰ汾֧³Ö

ÅäÖÃÉùÃ÷£º
consumer.xml
<dubbo:reference
id="fooService"
interface="com.alibaba.foo.FooService">
<dubbo:method
name="findFoo"
async="true"
/>
</dubbo:reference>
<dubbo:reference
id="barService"
interface="com.alibaba.bar.BarService">
<dubbo:method
name="findBar"
async="true"
/>
</dubbo:reference>
|
µ÷ÓôúÂ룺
fooService.findFoo(fooId); // ´Ëµ÷ÓûáÁ¢¼´·µ»Ønull
Future<Foo>
fooFuture = RpcContext.getContext().getFuture();
//
Äõ½µ÷ÓõÄFutureÒýÓ㬵±½á¹û·µ»Øºó£¬»á±»Í¨ÖªºÍÉèÖõ½´ËFuture¡£
barService.findBar(barId);
//
´Ëµ÷ÓûáÁ¢¼´·µ»Ønull
Future<Bar>
barFuture = RpcContext.getContext().getFuture();
//
Äõ½µ÷ÓõÄFutureÒýÓ㬵±½á¹û·µ»Øºó£¬»á±»Í¨ÖªºÍÉèÖõ½´ËFuture¡£
//
´ËʱfindFooºÍfindBarµÄÇëÇóͬʱÔÚÖ´ÐУ¬¿Í»§¶Ë²»ÐèÒªÆô¶¯¶àÏß³ÌÀ´Ö§³Ö²¢ÐУ¬¶øÊǽèÖúNIOµÄ·Ç×èÈûÍê³É¡£
Foo
foo = fooFuture.get(); //
Èç¹ûfooÒÑ·µ»Ø£¬Ö±½ÓÄõ½·µ»ØÖµ£¬·ñÔòÏß³Ìwaitס£¬µÈ´ýfoo·µ»Øºó£¬Ï̻߳ᱻnotify»½ÐÑ¡£
Bar
bar = barFuture.get(); //
ͬÀíµÈ´ýbar·µ»Ø¡£
//
Èç¹ûfooÐèÒª5Ãë·µ»Ø£¬barÐèÒª6Ãë·µ»Ø£¬Êµ¼ÊÖ»ÐèµÈ6Ã룬¼´¿É»ñÈ¡µ½fooºÍbar£¬½øÐнÓÏÂÀ´µÄ´¦Àí¡£
|
ÄãÒ²¿ÉÒÔÉèÖÃÊÇ·ñµÈ´ýÏûÏ¢·¢³ö£º(Òì²½×ÜÊDz»µÈ´ý·µ»Ø)
sent="true" µÈ´ýÏûÏ¢·¢³ö£¬ÏûÏ¢·¢ËÍʧ°Ü½«Å׳öÒì³£¡£
sent="false" ²»µÈ´ýÏûÏ¢·¢³ö£¬½«ÏûÏ¢·ÅÈëIO¶ÓÁУ¬¼´¿Ì·µ»Ø¡£
<dubbo:method
name="findFoo"
async="true"
sent="true"
/>
|
Èç¹ûÄãÖ»ÊÇÏëÒì²½£¬ÍêÈ«ºöÂÔ·µ»ØÖµ£¬¿ÉÒÔÅäÖÃreturn="false"£¬ÒÔ¼õÉÙFuture¶ÔÏóµÄ´´½¨ºÍ¹ÜÀí³É±¾£º
<dubbo:method
name="findFoo"
async="true"
return="false"
/>
|
±¾µØµ÷ÓÃ
±¾µØµ÷Óã¬Ê¹ÓÃÁËInjvmÐÒ飬ÊÇÒ»¸öαÐÒ飬Ëü²»¿ªÆô¶Ë¿Ú£¬²»·¢ÆðÔ¶³Ìµ÷Óã¬Ö»ÔÚJVMÄÚÖ±½Ó¹ØÁª£¬µ«Ö´ÐÐDubboµÄFilterÁ´¡£
Define injvm protocol:
<dubbo:protocol
name="injvm"
/> |
»ò
<dubbo:provider
protocol="injvm"
/>
|
Set service protocol:
<dubbo:service
protocol="injvm"
/>
|
Use injvm first:
<dubbo:consumer
injvm="true"
.../>
<dubbo:provider
injvm="true"
.../> |
»ò
<dubbo:reference
injvm="true"
.../>
<dubbo:service
injvm="true"
.../> |
×¢Ò⣺·þÎñ±©Â¶Óë·þÎñÒýÓö¼ÐèÒªÉùÃ÷injvm="true"
×Ô¶¯±©Â¶¡¢ÒýÓñ¾µØ·þÎñ
´Ó dubbo 2.2.0 ¿ªÊ¼£¬Ã¿¸ö·þÎñĬÈ϶¼»áÔÚ±¾µØ±©Â¶£»ÔÚÒýÓ÷þÎñµÄʱºò£¬Ä¬ÈÏÓÅÏÈÒýÓñ¾µØ·þÎñ£»Èç¹ûÏ£ÍûÒýÓÃÔ¶³Ì·þÎñ¿ÉÒÔʹÓÃÒ»ÏÂÅäÖÃÇ¿ÖÆÒýÓÃÔ¶³Ì·þÎñ¡£
<dubbo:reference
... scope="remote"
/> |
²ÎÊý»Øµ÷
²ÎÊý»Øµ÷·½Ê½Óëµ÷Óñ¾µØcallback»òlistenerÏàͬ£¬Ö»ÐèÒªÔÚSpringµÄÅäÖÃÎļþÖÐÉùÃ÷Äĸö²ÎÊýÊÇcallbackÀàÐͼ´¿É£¬Dubbo½«»ùÓÚ³¤Á¬½ÓÉú³É·´Ïò´úÀí£¬ÕâÑù¾Í¿ÉÒÔ´Ó·þÎñÆ÷¶Ëµ÷Óÿͻ§¶ËÂß¼¡£
2.0.6¼°ÆäÒÔÉϰ汾֧³Ö
´úÂë²Î¼û£ºhttps://github.com/alibaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/callback
(1) ¹²Ïí·þÎñ½Ó¿Ú£º
·þÎñ½Ó¿ÚʾÀý£º
CallbackService.java
package
com.callback;
public
interface
CallbackService {
void
addListener(String key, CallbackListener listener);
}
|
CallbackListener.java
package
com.callback;
public
interface
CallbackListener {
void
changed(String msg);
}
|
(2) ·þÎñÌṩÕߣº
·þÎñÌṩÕß½Ó¿ÚʵÏÖʾÀý£º
CallbackServiceImpl.java
package
com.callback.impl;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.Map;
import
java.util.concurrent.ConcurrentHashMap;
import
com.callback.CallbackListener;
import
com.callback.CallbackService;
public
class
CallbackServiceImpl implements
CallbackService {
private
final
Map<String, CallbackListener> listeners
= new
ConcurrentHashMap<String, CallbackListener>();
public
CallbackServiceImpl() {
Thread
t = new
Thread(new
Runnable() {
public
void
run() {
while(true)
{
try
{
for(Map.Entry<String,
CallbackListener> entry : listeners.entrySet()){
try
{
entry.getValue().changed(getChanged(entry.getKey()));
}
catch
(Throwable t) {
listeners.remove(entry.getKey());
}
}
Thread.sleep(5000);
//
¶¨Ê±´¥·¢±ä¸ü֪ͨ
}
catch
(Throwable t) { //
·ÀÓùÈÝ´í
t.printStackTrace();
}
}
}
});
t.setDaemon(true);
t.start();
}
public
void
addListener(String key, CallbackListener listener)
{
listeners.put(key,
listener);
listener.changed(getChanged(key));
//
·¢Ëͱä¸ü֪ͨ
}
private
String getChanged(String key) {
return
"Changed: "
+ new
SimpleDateFormat("yyyy-MM-dd
HH:mm:ss").format(new
Date());
}
}
|
·þÎñÌṩÕßÅäÖÃʾÀý£º
<bean
id="callbackService"
class="com.callback.impl.CallbackServiceImpl"
/>
<dubbo:service
interface="com.callback.CallbackService"
ref="callbackService"
connections="1"
callbacks="1000">
<dubbo:method
name="addListener">
<dubbo:argument
index="1"
callback="true"
/>
<!--Ò²¿ÉÒÔͨ¹ýÖ¸¶¨ÀàÐ͵ķ½Ê½-->
<!--<dubbo:argument
type="com.demo.CallbackListener" callback="true"
/>-->
</dubbo:method>
</dubbo:service>
|
(3) ·þÎñÏû·ÑÕߣº
·þÎñÏû·ÑÕßÅäÖÃʾÀý£º
consumer.xml
<dubbo:reference
id="callbackService"
interface="com.callback.CallbackService"
/>
|
·þÎñÏû·ÑÕßµ÷ÓÃʾÀý£º
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:consumer.xml"); context.start(); CallbackService callbackService = (CallbackService) context.getBean("callbackService"); callbackService.addListener("http://10.20.160.198/wiki/display/dubbo/foo.bar", new CallbackListener(){ public void changed(String msg) { System.out.println("callback1:" + msg); } }); |
ʼþ֪ͨ
ÔÚµ÷ÓÃ֮ǰ£¬µ÷ÓÃÖ®ºó£¬³öÏÖÒ쳣ʱ£¬»á´¥·¢oninvoke, onreturn,
onthrowÈý¸öʼþ£¬¿ÉÒÔÅäÖõ±Ê¼þ·¢Éúʱ£¬Í¨ÖªÄĸöÀàµÄÄĸö·½·¨¡£
Ö§³Ö°æ±¾£º2.0.7Ö®ºó
(1) ·þÎñÌṩÕßÓëÏû·ÑÕß¹²Ïí·þÎñ½Ó¿Ú£º
IDemoService.java
interface
IDemoService {
public
Person get(int
id);
}
|
(2) ·þÎñÌṩÕßʵÏÖ£º
DemoServiceImpl.java
class
NormalDemoService implements
IDemoService {
public
Person get(int
id) {
return
new
Person(id, "charles`son",
4);
}
}
|
(3) ·þÎñÌṩÕßÅäÖãº
provider.xml
<dubbo:application name="rpc-callback-demo" />
<dubbo:registry address="http://10.20.160.198/wiki/display/dubbo/10.20.153.186"
/>
<bean id="demoService" class="com.alibaba.dubbo.callback.implicit.NormalDemoService"
/>
<dubbo:service interface="com.alibaba.dubbo.callback.implicit.IDemoService"
ref="demoService" version="1.0.0"
group="cn"/> |
(4) ·þÎñÏû·ÑÕßCallback½Ó¿Ú¼°ÊµÏÖ£º
Nofify.java
interface
Nofify {
public
void
onreturn(Person msg, Integer id);
public
void
onthrow(Throwable ex, Integer id);
}
|
class
NofifyImpl implements
Nofify {
public
Map<Integer, Person> ret = new
HashMap<Integer, Person>();
public
Map<Integer, Throwable> errors = new
HashMap<Integer, Throwable>();
public
void
onreturn(Person msg, Integer id) {
System.out.println("onreturn:"
+ msg);
ret.put(id,
msg);
}
public
void
onthrow(Throwable ex, Integer id) {
errors.put(id,
ex);
}
}
|
(5) ·þÎñÏû·ÑÕßCallback½Ó¿Ú¼°ÊµÏÖ£º
consumer.xml
×¢£º
callbackÓëasync¹¦ÄÜÕý½»·Ö½â£º
async=true£¬±íʾ½á¹ûÊÇ·ñÂíÉÏ·µ»Ø.
onreturn ±íʾÊÇ·ñÐèÒª»Øµ÷.
×éºÏÇé¿ö£º(async=false ĬÈÏ)
Òì²½»Øµ÷ģʽ£ºasync=true onreturn="xxx"
ͬ²½»Øµ÷ģʽ£ºasync=false onreturn="xxx"
Òì²½Î޻ص÷ £ºasync=true
ͬ²½Î޻ص÷ £ºasync=false
(6) TEST CASE£º
Test.java
<bean
id
="demoCallback"
class
= "com.alibaba.dubbo.callback.implicit.NofifyImpl"
/>
<dubbo:reference
id="demoService"
interface="com.alibaba.dubbo.callback.implicit.IDemoService"
version="1.0.0"
group="cn"
>
<dubbo:method
name="get"
async="true"
onreturn
= "demoCallback.onreturn"
onthrow="demoCallback.onthrow"
/>
</dubbo:reference>
|
|