Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Thrift¿ò¼Ü--¿ÉÉìËõµÄ¿çÓïÑÔ·þÎñ¿ª·¢¿ò¼Ü
 
×÷Õߣºhustfxj À´Ô´£ºChinaunix ·¢²¼ÓÚ 2014-12-18
  2373  次浏览      27
 

ǰÑÔ£º

ĿǰÁ÷ÐеķþÎñµ÷Ó÷½Ê½ÓкܶàÖÖ£¬ÀýÈç»ùÓÚ 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 Òì²½¿Í»§¶ËµÄ¹¹½¨£¬Ï£ÍûÄܸø¶ÁÕß´øÀ´Ò»Ð©°ïÖú¡£

   
2373 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö


Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ


Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ