ǰÑÔ£º
ĿǰÁ÷ÐеķþÎñµ÷Ó÷½Ê½ÓкܶàÖÖ£¬ÀýÈç»ùÓÚ SOAP ÏûÏ¢¸ñʽµÄ Web
Service£¬»ùÓÚ JSON ÏûÏ¢¸ñʽµÄ RESTful ·þÎñµÈ¡£ÆäÖÐËùÓõ½µÄÊý¾Ý´«Ê䷽ʽ°üÀ¨ XML£¬JSON
µÈ£¬È»¶ø XML Ïà¶ÔÌå»ýÌ«´ó£¬´«ÊäЧÂʵͣ¬JSON Ìå»ý½ÏС£¬ÐÂÓ±£¬µ«»¹²»¹»ÍêÉÆ¡£±¾ÎĽ«½éÉÜÓÉ Facebook
¿ª·¢µÄÔ¶³Ì·þÎñµ÷Óÿò¼Ü Apache Thrift£¬Ëü²ÉÓýӿÚÃèÊöÓïÑÔ¶¨Òå²¢´´½¨·þÎñ£¬Ö§³Ö¿ÉÀ©Õ¹µÄ¿çÓïÑÔ·þÎñ¿ª·¢£¬Ëù°üº¬µÄ´úÂëÉú³ÉÒýÇæ¿ÉÒÔÔÚ¶àÖÖÓïÑÔÖУ¬Èç
C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell,
C#, Cocoa, Smalltalk µÈ´´½¨¸ßЧµÄ¡¢ÎÞ·ìµÄ·þÎñ£¬Æä´«ÊäÊý¾Ý²ÉÓöþ½øÖƸñʽ£¬Ïà¶Ô XML
ºÍ JSON Ìå»ý¸üС£¬¶ÔÓڸ߲¢·¢¡¢´óÊý¾ÝÁ¿ºÍ¶àÓïÑԵĻ·¾³¸üÓÐÓÅÊÆ¡£±¾ÎĽ«Ïêϸ½éÉÜ Thrift µÄʹÓ㬲¢ÇÒÌṩ·á¸»µÄʵÀý´úÂë¼ÓÒÔ½âÊÍ˵Ã÷£¬°ïÖúʹÓÃÕß¿ìËÙ¹¹½¨·þÎñ¡£
Ò»¸ö¼òµ¥µÄ Thrift ʵÀý
±¾ÎÄÊ×ÏȽéÉÜÒ»¸ö¼òµ¥µÄ Thrift ʵÏÖʵÀý£¬Ê¹¶ÁÕßÄܹ»¿ìËÙÖ±¹ÛµØÁ˽âʲôÊÇ
Thrift ÒÔ¼°ÈçºÎʹÓà Thrift ¹¹½¨·þÎñ¡£
´´½¨Ò»¸ö¼òµ¥µÄ·þÎñ Hello¡£Ê×Ïȸù¾Ý Thrift µÄÓï·¨¹æ·¶±àд½Å±¾Îļþ
Hello.thrift£¬´úÂëÈçÏ£º
Çåµ¥ 1. Hello.thrift
namespace java service.demo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void helloVoid() string helloNull() } |
ÆäÖж¨ÒåÁË·þÎñ Hello µÄÎå¸ö·½·¨£¬Ã¿¸ö·½·¨°üº¬Ò»¸ö·½·¨Ãû£¬²ÎÊýÁбíºÍ·µ»ØÀàÐÍ¡£Ã¿¸ö²ÎÊý°üÀ¨²ÎÊýÐòºÅ£¬²ÎÊýÀàÐÍÒÔ¼°²ÎÊýÃû¡£
Thrift ÊÇ¶Ô IDL(Interface Definition Language)
ÃèÊöÐÔÓïÑÔµÄÒ»ÖÖ¾ßÌåʵÏÖ¡£Òò´Ë£¬ÒÔÉϵķþÎñÃèÊöÎļþʹÓà IDL Óï·¨±àд¡£Ê¹Óà Thrift ¹¤¾ß±àÒë
Hello.thrift£¬¾Í»áÉú³ÉÏàÓ¦µÄ Hello.java Îļþ¡£¸ÃÎļþ°üº¬ÁËÔÚ Hello.thrift
ÎļþÖÐÃèÊöµÄ·þÎñ Hello µÄ½Ó¿Ú¶¨Ò壬¼´ Hello.Iface ½Ó¿Ú£¬ÒÔ¼°·þÎñµ÷ÓõĵײãͨÐÅϸ½Ú£¬°üÀ¨¿Í»§¶ËµÄµ÷ÓÃÂß¼
Hello.Client ÒÔ¼°·þÎñÆ÷¶ËµÄ´¦ÀíÂß¼ Hello.Processor£¬ÓÃÓÚ¹¹½¨¿Í»§¶ËºÍ·þÎñÆ÷¶ËµÄ¹¦ÄÜ¡£
´´½¨ HelloServiceImpl.java Îļþ²¢ÊµÏÖ Hello.java
ÎļþÖÐµÄ Hello.Iface ½Ó¿Ú£¬´úÂëÈçÏ£º
Çåµ¥ 2. HelloServiceImpl.java
package service.demo; import org.apache.thrift.TException; public class HelloServiceImpl implements Hello.Iface { @Override public boolean helloBoolean(boolean para) throws TException { return para; } @Override public int helloInt(int para) throws TException { try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } return para; } @Override public String helloNull() throws TException { return null; } @Override public String helloString(String para) throws TException { return para; } @Override public void helloVoid() throws TException { System.out.println("Hello World"); } } |
´´½¨·þÎñÆ÷¶ËʵÏÖ´úÂ룬½« HelloServiceImpl ×÷Ϊ¾ßÌåµÄ´¦ÀíÆ÷´«µÝ¸ø Thrift ·þÎñÆ÷£¬´úÂëÈçÏ£º
Çåµ¥ 3. HelloServiceServer.java
package service.server;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import service.demo.Hello;
import service.demo.HelloServiceImpl;
public class HelloServiceServer {
/**
* Æô¶¯ Thrift ·þÎñÆ÷
* @param args
*/
public static void main(String[] args) {
try {
// ÉèÖ÷þÎñ¶Ë¿ÚΪ 7911
TServerSocket serverTransport = new TServerSocket(7911);
// ÉèÖÃÐÒ鹤³§Îª TBinaryProtocol.Factory
Factory proFactory = new TBinaryProtocol.Factory();
// ¹ØÁª´¦ÀíÆ÷Óë Hello ·þÎñµÄʵÏÖ
TProcessor processor = new Hello.Processor(new HelloServiceImpl());
TServer server = new TThreadPoolServer(processor, serverTransport,
proFactory);
System.out.println("Start server on port 7911...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
|
´´½¨¿Í»§¶ËʵÏÖ´úÂ룬µ÷Óà Hello.client ·ÃÎÊ·þÎñ¶ËµÄÂ߼ʵÏÖ£¬´úÂëÈçÏ£º
Çåµ¥ 4. HelloServiceClient.java
package service.client;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import service.demo.Hello;
public class HelloServiceClient {
/**
* µ÷ÓÃ Hello ·þÎñ
* @param args
*/
public static void main(String[] args) {
try {
// ÉèÖõ÷ÓõķþÎñµØÖ·Îª±¾µØ£¬¶Ë¿ÚΪ 7911
TTransport transport = new TSocket("localhost", 7911);
transport.open();
// ÉèÖô«ÊäÐÒéΪ TBinaryProtocol
TProtocol protocol = new TBinaryProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
// µ÷Ó÷þÎñµÄ helloVoid ·½·¨
client.helloVoid();
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
}
|
´úÂë±àдÍêºóÔËÐзþÎñÆ÷£¬ÔÙÆô¶¯¿Í»§¶Ëµ÷Ó÷þÎñ Hello µÄ·½·¨ helloVoid£¬ÔÚ·þÎñÆ÷¶ËµÄ¿ØÖÆÌ¨´°¿ÚÊä³ö¡°Hello
World¡±(helloVoid ·½·¨ÊµÏÖÔÚ¿ØÖÆÌ¨´òÓ¡×Ö·û´®£¬Ã»Óзµ»ØÖµ£¬ËùÒÔ¿Í»§¶Ëµ÷Ó÷½·¨ºóûÓзµ»ØÖµÊä³ö£¬¶ÁÕß¿ÉÒÔ×Ô¼º³¢ÊÔÆäËûÓзµ»ØÖµ·½·¨µÄµ÷Óã¬Æä½á¹û¿ÉÒÔ´òÓ¡ÔÚ¿Í»§¶ËµÄ¿ØÖÆÌ¨´°¿Ú
)¡£
Thrift ¼Ü¹¹
Thrift °üº¬Ò»¸öÍêÕûµÄ¶ÑÕ»½á¹¹ÓÃÓÚ¹¹½¨¿Í»§¶ËºÍ·þÎñÆ÷¶Ë¡£ÏÂͼÃè»æÁË
Thrift µÄÕûÌå¼Ü¹¹¡£

ͼ 1. ¼Ü¹¹Í¼
ÈçͼËùʾ£¬Í¼ÖлÆÉ«²¿·ÖÊÇÓû§ÊµÏÖµÄÒµÎñÂß¼£¬ºÖÉ«²¿·ÖÊǸù¾Ý Thrift
¶¨ÒåµÄ·þÎñ½Ó¿ÚÃèÊöÎļþÉú³ÉµÄ¿Í»§¶ËºÍ·þÎñÆ÷¶Ë´úÂë¿ò¼Ü£¬ºìÉ«²¿·ÖÊǸù¾Ý Thrift ÎļþÉú³É´úÂëʵÏÖÊý¾ÝµÄ¶Áд²Ù×÷¡£ºìÉ«²¿·ÖÒÔÏÂÊÇ
Thrift µÄ´«ÊäÌåϵ¡¢ÐÒéÒÔ¼°µ×²ã I/O ͨÐÅ£¬Ê¹Óà Thrift ¿ÉÒԺܷ½±ãµÄ¶¨ÒåÒ»¸ö·þÎñ²¢ÇÒÑ¡Ôñ²»Í¬µÄ´«ÊäÐÒéºÍ´«Êä²ã¶ø²»ÓÃÖØÐÂÉú³É´úÂë¡£
Thrift ·þÎñÆ÷°üº¬ÓÃÓÚ°ó¶¨ÐÒéºÍ´«Êä²ãµÄ»ù´¡¼Ü¹¹£¬ËüÌṩ×èÈû¡¢·Ç×èÈû¡¢µ¥Ï̺߳ͶàÏ̵߳ÄģʽÔËÐÐÔÚ·þÎñÆ÷ÉÏ£¬¿ÉÒÔÅäºÏ·þÎñÆ÷
/ ÈÝÆ÷Ò»ÆðÔËÐУ¬¿ÉÒÔºÍÏÖÓÐµÄ J2EE ·þÎñÆ÷ /Web ÈÝÆ÷ÎÞ·ìµÄ½áºÏ¡£
·þÎñ¶ËºÍ¿Í»§¶Ë¾ßÌåµÄµ÷ÓÃÁ÷³ÌÈçÏ£º

ͼ 2. Server ¶ËÆô¶¯¡¢·þÎñʱÐòͼ
¸ÃͼËùʾÊÇ HelloServiceServer Æô¶¯µÄ¹ý³ÌÒÔ¼°·þÎñ±»¿Í»§¶Ëµ÷ÓÃʱ£¬·þÎñÆ÷µÄÏìÓ¦¹ý³Ì¡£´ÓͼÖÐÎÒÃÇ¿ÉÒÔ¿´µ½£¬³ÌÐòµ÷ÓÃÁË
TThreadPoolServer µÄ serve ·½·¨ºó£¬server ½øÈë×èÈû¼àÌý״̬£¬Æä×èÈûÔÚ TServerSocket
µÄ accept ·½·¨ÉÏ¡£µ±½ÓÊÕµ½À´×Ô¿Í»§¶ËµÄÏûÏ¢ºó£¬·þÎñÆ÷·¢ÆðÒ»¸öÐÂÏ̴߳¦ÀíÕâ¸öÏûÏ¢ÇëÇó£¬ÔÏß³ÌÔٴνøÈë×èÈû״̬¡£ÔÚÐÂÏß³ÌÖУ¬·þÎñÆ÷ͨ¹ý
TBinaryProtocol ÐÒé¶ÁÈ¡ÏûÏ¢ÄÚÈÝ£¬µ÷Óà HelloServiceImpl µÄ helloVoid
·½·¨£¬²¢½«½á¹ûдÈë helloVoid_result Öд«»Ø¿Í»§¶Ë¡£

ͼ 3. Client ¶Ëµ÷Ó÷þÎñʱÐòͼ
¸ÃͼËùʾÊÇ HelloServiceClient µ÷Ó÷þÎñµÄ¹ý³ÌÒÔ¼°½ÓÊÕµ½·þÎñÆ÷¶ËµÄ·µ»ØÖµºó´¦Àí½á¹ûµÄ¹ý³Ì¡£´ÓͼÖÐÎÒÃÇ¿ÉÒÔ¿´µ½£¬³ÌÐòµ÷ÓÃÁË
Hello.Client µÄ helloVoid ·½·¨£¬ÔÚ helloVoid ·½·¨ÖУ¬Í¨¹ý send_helloVoid
·½·¨·¢ËͶԷþÎñµÄµ÷ÓÃÇëÇó£¬Í¨¹ý recv_helloVoid ·½·¨½ÓÊÕ·þÎñ´¦ÀíÇëÇóºó·µ»ØµÄ½á¹û¡£
Êý¾ÝÀàÐÍ
Thrift ½Å±¾¿É¶¨ÒåµÄÊý¾ÝÀàÐͰüÀ¨ÒÔϼ¸ÖÖÀàÐÍ£º
1.»ù±¾ÀàÐÍ£º
bool£º²¼¶ûÖµ£¬true »ò false£¬¶ÔÓ¦ Java µÄ boolean
byte£º8 λÓзûºÅÕûÊý£¬¶ÔÓ¦ Java µÄ byte
i16£º16 λÓзûºÅÕûÊý£¬¶ÔÓ¦ Java µÄ short
i32£º32 λÓзûºÅÕûÊý£¬¶ÔÓ¦ Java µÄ int
i64£º64 λÓзûºÅÕûÊý£¬¶ÔÓ¦ Java µÄ long
double£º64 λ¸¡µãÊý£¬¶ÔÓ¦ Java µÄ double
string£ºÎ´Öª±àÂëÎı¾»ò¶þ½øÖÆ×Ö·û´®£¬¶ÔÓ¦ Java µÄ String
2.½á¹¹ÌåÀàÐÍ£º
struct£º¶¨Ò幫¹²µÄ¶ÔÏó£¬ÀàËÆÓÚ C ÓïÑÔÖеĽṹÌ嶨Ò壬ÔÚ Java
ÖÐÊÇÒ»¸ö JavaBean
3.ÈÝÆ÷ÀàÐÍ£º
list£º¶ÔÓ¦ Java µÄ ArrayList
set£º¶ÔÓ¦ Java µÄ HashSet
map£º¶ÔÓ¦ Java µÄ HashMap
4.Òì³£ÀàÐÍ£º
exception£º¶ÔÓ¦ Java µÄ Exception
5.·þÎñÀàÐÍ£º
service£º¶ÔÓ¦·þÎñµÄÀà
ÐÒé
Thrift ¿ÉÒÔÈÃÓû§Ñ¡Ôñ¿Í»§¶ËÓë·þÎñ¶ËÖ®¼ä´«ÊäͨÐÅÐÒéµÄÀà±ð£¬ÔÚ´«ÊäÐÒéÉÏ×ÜÌå»®·ÖΪÎı¾
(text) ºÍ¶þ½øÖÆ (binary) ´«ÊäÐÒ飬Ϊ½ÚÔ¼´ø¿í£¬Ìá¸ß´«ÊäЧÂÊ£¬Ò»°ãÇé¿öÏÂʹÓöþ½øÖÆÀàÐ͵Ĵ«ÊäÐÒéΪ¶àÊý£¬ÓÐʱ»¹»áʹÓûùÓÚÎı¾ÀàÐ͵ÄÐÒ飬ÕâÐèÒª¸ù¾ÝÏîÄ¿
/ ²úÆ·ÖеÄʵ¼ÊÐèÇó¡£³£ÓÃÐÒéÓÐÒÔϼ¸ÖÖ£º
TBinaryProtocol ¡ª¡ª ¶þ½øÖƱàÂë¸ñʽ½øÐÐÊý¾Ý´«Êä
ʹÓ÷½·¨ÈçÇåµ¥ 3 ºÍÇåµ¥ 4 Ëùʾ¡£
TCompactProtocol ¡ª¡ª ¸ßЧÂʵġ¢Ãܼ¯µÄ¶þ½øÖƱàÂë¸ñʽ½øÐÐÊý¾Ý´«Êä
¹¹½¨ TCompactProtocol ÐÒéµÄ·þÎñÆ÷ºÍ¿Í»§¶ËÖ»ÐèÌæ»»Çåµ¥
3 ºÍÇåµ¥ 4 ÖÐ TBinaryProtocol ÐÒ鲿·Ö¼´¿É£¬Ìæ»»³ÉÈçÏ´úÂ룺
Çåµ¥ 5. ʹÓà TCompactProtocol ÐÒé¹¹½¨µÄ HelloServiceServer.java
TCompactProtocol.Factory proFactory = new TCompactProtocol.Factory(); |
Çåµ¥ 6. ʹÓà TCompactProtocol ÐÒéµÄ HelloServiceClient.java
TCompactProtocol protocol = new TCompactProtocol(transport); |
TJSONProtocol ¡ª¡ª ʹÓà JSON µÄÊý¾Ý±àÂëÐÒé½øÐÐÊý¾Ý´«Êä
¹¹½¨ TJSONProtocol ÐÒéµÄ·þÎñÆ÷ºÍ¿Í»§¶ËÖ»ÐèÌæ»»Çåµ¥ 3
ºÍÇåµ¥ 4 ÖÐ TBinaryProtocol ÐÒ鲿·Ö¼´¿É£¬Ìæ»»³ÉÈçÏ´úÂ룺
Çåµ¥ 7. ʹÓà TJSONProtocol ÐÒé¹¹½¨µÄ HelloServiceServer.java
TJSONProtocol.Factory proFactory = new TJSONProtocol.Factory(); |
Çåµ¥ 8. ʹÓà TJSONProtocol ÐÒéµÄ HelloServiceClient.java
TJSONProtocol protocol = new TJSONProtocol(transport); |
TSimpleJSONProtocol ¡ª¡ª Ö»Ìṩ JSON ֻдµÄÐÒ飬ÊÊÓÃÓÚͨ¹ý½Å±¾ÓïÑÔ½âÎö
´«Êä²ã
³£ÓõĴ«Êä²ãÓÐÒÔϼ¸ÖÖ£º
1.TSocket ¡ª¡ª ʹÓÃ×èÈûʽ I/O ½øÐд«Ê䣬ÊÇ×î³£¼ûµÄģʽ
ʹÓ÷½·¨ÈçÇåµ¥ 4 Ëùʾ¡£
2.TFramedTransport ¡ª¡ª ʹÓ÷Ç×èÈû·½Ê½£¬°´¿éµÄ´óС½øÐд«Ê䣬ÀàËÆÓÚ
Java ÖÐµÄ NIO
ÈôʹÓà TFramedTransport ´«Êä²ã£¬Æä·þÎñÆ÷±ØÐëÐÞ¸ÄΪ·Ç×èÈûµÄ·þÎñÀàÐÍ£¬¿Í»§¶ËÖ»ÐèÌæ»»Çåµ¥
4 ÖÐ TTransport ²¿·Ö£¬´úÂëÈçÏ£¬Çåµ¥ 9 ÖÐ TNonblockingServerTransport
ÀàÊǹ¹½¨·Ç×èÈû socket µÄ³éÏóÀ࣬TNonblockingServerSocket Àà¼Ì³Ð TNonblockingServerTransport
Çåµ¥ 9. ʹÓà TFramedTransport ´«Êä²ã¹¹½¨µÄ HelloServiceServer.java
TNonblockingServerTransport serverTransport; serverTransport = new TNonblockingServerSocket(10005); Hello.Processor processor = new Hello.Processor(new HelloServiceImpl()); TServer server = new TNonblockingServer(processor, serverTransport); System.out.println("Start server on port 10005 ..."); server.serve(); |
Çåµ¥ 10. ʹÓà TFramedTransport ´«Êä²ãµÄ HelloServiceClient.java
TTransport transport = new TFramedTransport(new TSocket("localhost", 10005)); |
TNonblockingTransport ¡ª¡ª ʹÓ÷Ç×èÈû·½Ê½£¬ÓÃÓÚ¹¹½¨Òì²½¿Í»§¶Ë
ʹÓ÷½·¨Çë²Î¿¼ Thrift Òì²½¿Í»§¶Ë¹¹½¨
·þÎñ¶ËÀàÐÍ
³£¼ûµÄ·þÎñ¶ËÀàÐÍÓÐÒÔϼ¸ÖÖ£º
TSimpleServer ¡ª¡ª µ¥Ï̷߳þÎñÆ÷¶ËʹÓñê×¼µÄ×èÈûʽ I/O
´úÂëÈçÏ£º
Çåµ¥ 11. ʹÓà TSimpleServer ·þÎñ¶Ë¹¹½¨µÄ HelloServiceServer.java
TServerSocket serverTransport = new TServerSocket(7911); TProcessor processor = new Hello.Processor(new HelloServiceImpl()); TServer server = new TSimpleServer(processor, serverTransport); System.out.println("Start server on port 7911..."); server.serve(); |
¿Í»§¶ËµÄ¹¹½¨·½Ê½¿É²Î¿¼Çåµ¥ 4¡£
TThreadPoolServer ¡ª¡ª ¶àÏ̷߳þÎñÆ÷¶ËʹÓñê×¼µÄ×èÈûʽ
I/O
ʹÓ÷½·¨ÈçÇåµ¥ 3 Ëùʾ¡£
TNonblockingServer ¡ª¡ª ¶àÏ̷߳þÎñÆ÷¶ËʹÓ÷Ç×èÈûʽ
I/O
ʹÓ÷½·¨Çë²Î¿¼ Thrift Òì²½¿Í»§¶Ë¹¹½¨
Thrift Òì²½¿Í»§¶Ë¹¹½¨
Thrift Ìṩ·Ç×èÈûµÄµ÷Ó÷½Ê½£¬¿É¹¹½¨Òì²½¿Í»§¶Ë¡£ÔÚÕâÖÖ·½Ê½ÖУ¬Thrift
ÌṩÁËеÄÀà TAsyncClientManager ÓÃÓÚ¹ÜÀí¿Í»§¶ËµÄÇëÇó£¬ÔÚÒ»¸öÏß³ÌÉÏ×·×ÙÇëÇóºÍÏìÓ¦£¬Í¬Ê±Í¨¹ý½Ó¿Ú
AsyncClient ´«µÝ±ê×¼µÄ²ÎÊýºÍ callback ¶ÔÏ󣬷þÎñµ÷ÓÃÍê³Éºó£¬callback ÌṩÁË´¦Àíµ÷Óýá¹ûºÍÒì³£µÄ·½·¨¡£
Ê×ÏÈÎÒÃÇ¿´ callback µÄʵÏÖ£º
Çåµ¥ 12.CallBack µÄʵÏÖ£ºMethodCallback.java
package service.callback;
import org.apache.thrift.async.AsyncMethodCallback;
public class MethodCallback implements AsyncMethodCallback {
Object response = null;
public Object getResult() {
// ·µ»Ø½á¹ûÖµ
return this.response;
}
// ´¦Àí·þÎñ·µ»ØµÄ½á¹ûÖµ
@Override
public void onComplete(Object response) {
this.response = response;
}
// ´¦Àíµ÷Ó÷þÎñ¹ý³ÌÖгöÏÖµÄÒì³£
@Override
public void onError(Throwable throwable) {
}
}
|
Èç´úÂëËùʾ£¬onComplete ·½·¨½ÓÊÕ·þÎñ´¦ÀíºóµÄ½á¹û£¬´Ë´¦ÎÒÃǽ«½á¹û
response Ö±½Ó¸³Öµ¸ø callback µÄ˽ÓÐÊôÐÔ response¡£onError ·½·¨½ÓÊÕ·þÎñ´¦Àí¹ý³ÌÖÐÅ׳öµÄÒì³££¬´Ë´¦Î´¶ÔÒì³£½øÐд¦Àí¡£
´´½¨·Ç×èÈû·þÎñÆ÷¶ËʵÏÖ´úÂ룬½« HelloServiceImpl ×÷Ϊ¾ßÌåµÄ´¦ÀíÆ÷´«µÝ¸øÒì²½
Thrift ·þÎñÆ÷£¬´úÂëÈçÏ£º
Çåµ¥ 13.HelloServiceAsyncServer.java
package service.server;
import org.apache.thrift.server.TNonblockingServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TNonblockingServerTransport;
import org.apache.thrift.transport.TTransportException;
import service.demo.Hello;
import service.demo.HelloServiceImpl;
public class HelloServiceAsyncServer {
/**
* Æô¶¯ Thrift Òì²½·þÎñÆ÷
* @param args
*/
public static void main(String[] args) {
TNonblockingServerTransport serverTransport;
try {
serverTransport = new TNonblockingServerSocket(10005);
Hello.Processor processor = new Hello.Processor(
new HelloServiceImpl());
TServer server = new TNonblockingServer(processor, serverTransport);
System.out.println("Start server on port 10005 ...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
|
HelloServiceAsyncServer ͨ¹ý java.nio.channels.ServerSocketChannel
´´½¨·Ç×èÈûµÄ·þÎñÆ÷¶ËµÈ´ý¿Í»§¶ËµÄÁ¬½Ó¡£
´´½¨Òì²½¿Í»§¶ËʵÏÖ´úÂ룬µ÷Óà Hello.AsyncClient ·ÃÎÊ·þÎñ¶ËµÄÂ߼ʵÏÖ£¬½« MethodCallback
¶ÔÏó×÷Ϊ²ÎÊý´«Èëµ÷Ó÷½·¨ÖУ¬´úÂëÈçÏ£º
Çåµ¥ 14.HelloServiceAsyncClient.java
package service.client;
import java.io.IOException;
import org.apache.thrift.async.AsyncMethodCallback;
import org.apache.thrift.async.TAsyncClientManager;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.transport.TNonblockingSocket;
import org.apache.thrift.transport.TNonblockingTransport;
import service.callback.MethodCallback;
import service.demo.Hello;
public class HelloServiceAsyncClient {
/**
* µ÷ÓÃ Hello ·þÎñ
* @param args
*/
public static void main(String[] args) throws Exception {
try {
TAsyncClientManager clientManager = new TAsyncClientManager();
TNonblockingTransport transport = new TNonblockingSocket(
"localhost", 10005);
TProtocolFactory protocol = new TBinaryProtocol.Factory();
Hello.AsyncClient asyncClient = new Hello.AsyncClient(protocol,
clientManager, transport);
System.out.println("Client calls .....");
MethodCallback callBack = new MethodCallback();
asyncClient.helloString("Hello World", callBack);
Object res = callBack.getResult();
while (res == null) {
res = callBack.getResult();
}
System.out.println(((Hello.AsyncClient.helloString_call) res)
.getResult());
} catch (IOException e) {
e.printStackTrace();
}
}
}
|
HelloServiceAsyncClient ͨ¹ý java.nio.channels.Socketchannel
´´½¨Òì²½¿Í»§¶ËÓë·þÎñÆ÷½¨Á¢Á¬½Ó¡£ÔÚ±¾ÎÄÖÐÒì²½¿Í»§¶Ëͨ¹ýÒÔϵÄÑ»·´úÂëʵÏÖÁËͬ²½Ð§¹û£¬¶ÁÕß¿ÉÈ¥³ýÕⲿ·Ö´úÂëºóÔÙÔËÐжԱȡ£
Çåµ¥ 15. Òì²½¿Í»§¶ËʵÏÖͬ²½Ð§¹û´úÂë¶Î
Object res = callBack.getResult(); // µÈ´ý·þÎñµ÷ÓúóµÄ·µ»Ø½á¹û while (res == null) { res = callBack.getResult(); } |
ͨ¹ýÓëÇåµ¥ 9 ºÍÇåµ¥ 10 µÄ´úÂë±È½Ï£¬ÎÒÃÇ¿ÉÒÔ¹¹½¨Ò»¸ö TNonblockingServer
·þÎñÀàÐ͵ķþÎñ¶Ë£¬ÔÚ¿Í»§¶Ë¹¹½¨Ò»¸ö TFramedTransport ´«Êä²ãµÄͬ²½¿Í»§¶ËºÍÒ»¸ö TNonblockingTransport
´«Êä²ãµÄÒì²½¿Í»§¶Ë£¬ÄÇôһ¸ö·þÎñ¾Í¿ÉÒÔͨ¹ýÒ»¸ö socket ¶Ë¿ÚÌṩÁ½ÖÖ²»Í¬µÄµ÷Ó÷½Ê½¡£ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔ³¢ÊÔһϡ£
³£¼ûÎÊÌâ
NULL ÎÊÌâ
ÎÒÃÇÔÚ¶Ô·þÎñµÄij¸ö·½·¨µ÷ÓÃʱ£¬ÓÐʱ»á³öÏָ÷½·¨·µ»Ø null ÖµµÄÇé¿ö£¬ÔÚ
Thrift ÖУ¬Ö±½Óµ÷ÓÃÒ»¸ö·µ»Ø null ÖµµÄ·½·¨»áÅ׳ö TApplicationException
Òì³£¡£ÔÚÇåµ¥ 2 ÖУ¬HelloServiceImpl ÀïʵÏÖÁË helloNull ·½·¨£¬·µ»Ø null
Öµ£¬ÎÒÃÇÔÚ HelloServiceClient.java ÖмÓÈëµ÷Óø÷½·¨µÄ´úÂ룬³öÏÖÈçÏÂͼËùʾµÄÒì³££º

ͼ 4. TApplicationException
Òì³£
ΪÁË´¦Àí·µ»Ø null ÖµÇé¿ö£¬ÎÒÃÇÒª²¶»ñ¸ÃÒì³££¬²¢½øÐÐÏàÓ¦µÄ´¦Àí£¬¾ßÌå¿Í»§¶Ë´úÂëʵÏÖÈçÏ£º
Çåµ¥ 16. ´¦Àí·þÎñ·µ»ØÖµÎª null µÄ´úÂë
package service.client;
import org.apache.thrift.TApplicationException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import service.demo.Hello;
public class HelloServiceClient {
/**
* µ÷Óà Hello ·þÎñ£¬²¢´¦Àí null ÖµÎÊÌâ
* @param args
*/
public static void main(String[] args) {
try {
TTransport transport = new TSocket("localhost", 7911);
transport.open();
TProtocol protocol = new TBinaryProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
System.out.println(client.helloNull());
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
if (e instanceof TApplicationException
&& ((TApplicationException) e).getType() ==
TApplicationException.MISSING_RESULT) {
System.out.println("The result of helloNull function is NULL");
}
}
}
}
|
µ÷Óà helloNull ·½·¨ºó£¬»áÅ׳ö TApplicationException
Òì³££¬²¢ÇÒÒì³£ÖÖÀàΪ MISSING_RESULT£¬±¾¶Î´úÂëÏÔʾ£¬²¶»ñ¸ÃÒì³£ºó£¬Ö±½ÓÔÚ¿ØÖÆÌ¨´òÓ¡¡°The
result of helloNull function is NULL¡±ÐÅÏ¢¡£
°²×°²¿Êð
Apache Thrift µÄ¹Ù·½ÍøÕ¾Îª£ºhttp://thrift.apache.org/tutorial/£¬¾ßÌå°²×°²½ÖèÈçÏ£º
ÏÂÔØ thrift Ô´Îļþ£¨http://svn.apache.org/repos/asf/thrift/tags/thrift-0.6.1/£©
½« thrift Ô´Îļþµ¼Èë eclipse£¬½øÈë /lib/java
Ŀ¼£¬Ê¹Óà ant ±àÒë build.xml »ñµÃ libthrift-0.6.1-snapshot.jar
½« libthrift-0.6.1-snapshot.jar¡¢slf4j-api-1.5.8.jar¡¢slf4j-log4j12-1.5.8.jar
ºÍ log4j-1.2.14.jar µ¼Èë eclipse ¿ª·¢»·¾³
ÏÂÔØ thrift ±àÒ빤¾ß£¬¸Ã¹¤¾ß¿É½« thrift ½Å±¾Îļþ±àÒë³É
java Îļþ£¬ÏÂÔØµØÖ·£ºhttp://apache.etoak.com//thrift/0.6.0/thrift-0.6.1.exe
´´½¨ Hello.thrift ½Å±¾Îļþ£¬¾ßÌå´úÂëÈçÉÏÒ»Õ½ÚËùÊö£¬½øÈë
thrift-0.6.1.exe ËùÔÚĿ¼£¬Ö´ÐÐÃüÁî"thrift-0.6.1.exe -gen
java x:\Hello.thrift"£¬ÔÚµ±Ç°ÔËÐÐÅÌ·ûÏ£¬¿É¿´¼û gen-java Ŀ¼£¬½øÈëĿ¼¿É¿´µ½Éú³ÉµÄ
Java ´úÂë¡£¸ü¶à thrift µÄÃüÁîÄÚÈÝ£¬Çë²Î¿¼ thrift ×Ô´øµÄ help ÃüÁî
±àд·þÎñ¶ËºÍ¿Í»§¶Ë´úÂ룬Íê³É thrift µÄ°²×°ºÍ²¿Êð
»ùÓÚ Apache Thrift ¿ò¼ÜÉú³ÉµÄ·þÎñ°üÀ¨¿Í»§¶ËºÍ·þÎñÆ÷¶Ë£¬¾ßÌåµÄ²¿ÊðģʽÈçÏÂËùʾ£º

ͼ 5. ²¿Êðͼ
´ÓͼÖÐÎÒÃÇ¿ÉÒÔ¿´µ½£¬¿Í»§¶ËºÍ·þÎñÆ÷¶Ë²¿Êðʱ£¬ÐèÒªÓõ½¹«¹²µÄ jar °üºÍ
java Îļþ£¬Èçͼ¡°Common file¡±ÇøÓò£¬ÆäÖÐ Hello.java ÓÉ Hello.thrift
±àÒë¶øÀ´¡£ÔÚ·þÎñÆ÷¶Ë£¬·þÎñ±ØÐëʵÏÖ Hello.Iface ½Ó¿Ú£¬Í¬Ê±Òª°üÀ¨·þÎñÆ÷µÄÆô¶¯´úÂë HelloServiceServer.java¡£ÔÚ¿Í»§¶Ë£¬°üÀ¨¿Í»§¶Ëµ÷Ó÷þÎñµÄ´úÂë
HelloServiceClient.java¡£¿Í»§¶ËºÍ·þÎñÆ÷ͨ¹ý Hello.java ÌṩµÄ API
ʵÏÖÔ¶³Ì·þÎñµ÷Óá£
×ܽá
±¾ÎĽéÉÜÁË Apache Thrift µÄ°²×°²¿ÊðºÍ¼Ü¹¹£¬²¢Í¨¹ý´óÁ¿ÊµÀý½éÉÜÁËÔÚ²»Í¬Çé¿öÏÂÈçºÎʹÓÃ
Apache Thrift À´¹¹½¨·þÎñ£¬Í¬Ê±×ÅÖØ½éÉÜÁË Thrift Òì²½¿Í»§¶ËµÄ¹¹½¨£¬Ï£ÍûÄܸø¶ÁÕß´øÀ´Ò»Ð©°ïÖú¡£
|