锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品成人久久,日韩精品亚洲aⅴ在线影院,亚洲成av人无码亚洲成av人http://www.tkk7.com/adapterofcoms/category/43828.htmlzh-cnSun, 28 Mar 2010 02:59:29 GMTSun, 28 Mar 2010 02:59:29 GMT60鍦ㄨ繍琛屾椂,浣犺兘淇敼final field鐨勫煎悧?http://www.tkk7.com/adapterofcoms/articles/315748.htmladapterofcomsadapterofcomsThu, 18 Mar 2010 01:36:00 GMThttp://www.tkk7.com/adapterofcoms/articles/315748.htmlhttp://www.tkk7.com/adapterofcoms/comments/315748.htmlhttp://www.tkk7.com/adapterofcoms/articles/315748.html#Feedback0http://www.tkk7.com/adapterofcoms/comments/commentRss/315748.htmlhttp://www.tkk7.com/adapterofcoms/services/trackbacks/315748.html 

浠final int x=911] , [static final int x=912]涓轟緥,jdk1.6.0_16(涓轟綍濡傛鐗堟湰璇︾粏,鏄洜涓轟笅闈㈣繕鏈変釜jdk鐨刡ug).

鏍蜂緥綾?

class Test { 
 private final  int x=911;//modifiers:final->18,non-final->2
 static final private  int y=912;//modifiers:final->26,non-final->10 
 public int getX(){
  return x;
 }  
 public static int getY(){
  return y;
 } 

 Java涓殑final field鎰忔寚甯擱噺,璧嬪間竴嬈?涓嶅彲鏀瑰彉.緙栬瘧鍣ㄤ細瀵筬inal field榪涜濡備笅鐨勪紭鍖?

e.g:

Test t=new Test();

鍑℃槸鍦ㄧ▼搴忎腑瀵箃.x鐨勫紩鐢?緙栬瘧鍣ㄩ兘灝嗕互瀛楅潰鍊?11鏇挎崲,getX()涓殑return x涔熶細琚浛鎹㈡垚return 911;

鎵浠ュ氨綆楀湪榪愯鏃朵綘鏀瑰彉浜唜鐨勫間篃鏃犳祹浜庝簨,緙栬瘧鍣ㄥ瀹冧滑榪涜鐨勬槸闈欐佺紪璇?

浣嗘槸Test.class.getDeclaredField("x").getInt(t)闄ゅ;

 

閭d箞濡備綍鍦ㄨ繍琛屾椂鏀瑰彉final field x鐨勫煎憿?

private final  int x=911;Field.modifiers涓?8,鑰宲rivate int x=911;Field.modifiers涓?.

鎵浠ュ鏋滄垜浠慨鏀笷ield[Test.class.getDeclaredField("x")].modifiers鐢?8[final]鍙樹負2[non-final],閭d箞浣犲氨鍙互淇敼x鐨勫間簡.

 Test tObj=new Test();  
 Field f_x=Test.class.getDeclaredField("x");  
  
  //淇敼modifiers 18->2
  Field f_f_x=f_x.getClass().getDeclaredField("modifiers");
  f_f_x.setAccessible(true);  
  f_f_x.setInt(f_x, 2/*non-final*/);
  
  f_x.setAccessible(true);
  f_x.setInt(tObj, 110);//鏀瑰彉x鐨勫間負110.  
  System.out.println("闈欐佺紪璇戠殑x鍊?"+tObj.getX()+".------.榪愯鏃舵敼鍙樹簡鐨勫?10:"+f_x.getInt(tObj));
   
  f_x.setInt(tObj, 111);//浣犲彲浠ョ戶緇敼鍙榵鐨勫間負.  
  System.out.println(f_x.getInt(tObj));

浣嗘槸鎯蟲仮澶嶅師鏉ョ殑modifiers,f_f_x.setInt(f_x, 18/*final*/);榪欐槸鏃犳晥鐨?鍥犱負Field鍙細鍒濆鍖栧畠鐨凢ieldAccessor寮曠敤涓嬈?

 

鍦ㄤ笂闈㈢殑榪囩▼涓?鎴戣繕鍙戠幇浜嗕釜jdk bug,浣犲鏋滃皢涓婇潰鐨勭孩鑹蹭唬鐮佹敼涓哄涓嬬殑浠g爜:

f_f_x.setInt(f_x, 10/*榪欎釜鏁板兼槸static non-final modifiers,鑰寈鏄?strong>non-static鐨?榪欐牱灝變細浣縡_x寰楀埌涓涓猻tatic FieldAccessor*/);閭d箞浼氬紩鍙慉 fatal error has been detected by the Java Runtime Environment.騫朵駭鐢熺浉搴旂殑err log鏂囦歡.鏄劇劧JVM娌℃湁瀵硅繖縐嶆儏鍐靛姞浠ュ鐞?鎴戝凡鎻愪氦to sun bug report site. 

sun 浜?010-3-26閫氱煡鎴?浠栦滑宸叉壙璁よbug,bug id : 6938467.鍙戝竷鍒板緗戝彲鑳芥湁涓鍒頒袱澶╃殑寤惰繜.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6938467 

 

 

 



]]>
MINA,xSocket鍚屾牱鐨勬ц兘緙洪櫡鍙婇櫡闃?Grizzly betterhttp://www.tkk7.com/adapterofcoms/articles/314560.htmladapterofcomsadapterofcomsFri, 05 Mar 2010 01:37:00 GMThttp://www.tkk7.com/adapterofcoms/articles/314560.htmlhttp://www.tkk7.com/adapterofcoms/comments/314560.htmlhttp://www.tkk7.com/adapterofcoms/articles/314560.html#Feedback0http://www.tkk7.com/adapterofcoms/comments/commentRss/314560.htmlhttp://www.tkk7.com/adapterofcoms/services/trackbacks/314560.htmlMINA,Grizzly[grizzly-nio-framework],xSocket閮芥槸鍩轟簬 java nio鐨?server framework.
榪欓噷鐨?strong>鎬ц兘緙洪櫡鐨勭劍鐐?/strong>鏄寚褰撲竴鏉hannel涓婄殑SelectionKey.OP_READ ready鏃?1.鏄敱select thread璇誨畬鏁版嵁涔嬪悗鍐嶅垎鍙戠粰搴旂敤紼嬪簭鐨刪andler,2.榪樻槸鐩存帴灝卞垎鍙?鐢県andler thread鏉ヨ礋璐h鏁版嵁鍜宧andle.
mina,xsocket鏄?strong>1. grizzly-nio-framework鏄?strong>2.
灝界璇籧hannel buffer涓璪ytes鏄緢蹇殑,浣嗘槸濡傛灉鎴戜滑鏀懼ぇ,褰撹繛鎺hannel杈懼埌涓婁竾鏁伴噺綰?鐢氳嚦鏇村,榪欑寤惰繜鍝嶅簲鐨勬晥鏋滃皢浼氭剤鍔犳槑鏄?
MINA:
for all selectedKeys
{
    read data then fireMessageReceived.
}
xSocket:
for all selectedKeys
{
    read data ,append it to readQueue then performOnData.
}
鍏朵腑mina鍦╢ireMessageReceived鏃舵病鏈変嬌鐢╰hreadpool鏉ュ垎鍙?鎵浠ラ渶瑕佸簲鐢ㄧ▼搴忓湪handler.messageReceived涓啀鍒嗗彂.鑰寈socket鐨刾erformOnData榛樿鏄垎鍙戠粰threadpool[WorkerPool],WorkerPool铏界劧瑙e喅浜嗙嚎紼嬫睜涓殑綰跨▼涓嶈兘鍏呭埌鏈澶х殑闂[璺焧omcat6鐨勫仛娉曚竴鏍穄,浣嗘槸瀹冪殑璋冨害鏈哄埗渚濈劧緙轟箯鐏墊椿鎬?/a>.
Grizzly:
for all selectedKeys
{
   [NIOContext---filterChain.execute--->our filter.execute]<------run In DefaultThreadPool
}
grizzly鐨凞efaultThreadPool鍑犱箮閲嶅啓浜唈ava util concurrent threadpool,騫朵嬌鐢ㄨ嚜宸辯殑LinkedTransferQueue,浣嗗悓鏍?a target="_blank" mce_>緙轟箯鐏墊椿鐨勬睜涓嚎紼嬬殑璋冨害鏈哄埗

涓嬮潰鍒嗗埆鏄疢INA,xSocket,Grizzly鐨勬簮鐮佸垎鏋?
Apache MINA (mina-2.0.0-M6婧愮爜涓轟緥):
    鎴戜滑浣跨敤mina nio tcp鏈甯哥敤鐨勬牱渚嬪涓?
        NioSocketAcceptor acceptor = new NioSocketAcceptor(/*NioProcessorPool's size*/);
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();        
        //chain.addLast("codec", new ProtocolCodecFilter(
                //new TextLineCodecFactory()));
        ......
        // Bind
        acceptor.setHandler(/*our IoHandler*/);
        acceptor.bind(new InetSocketAddress(port));
------------------------------------------------------------------------------------
    棣栧厛浠嶯ioSocketAcceptor(extends AbstractPollingIoAcceptor)寮濮?
bind(SocketAddress)--->bindInternal--->startupAcceptor:鍚姩AbstractPollingIoAcceptor.Acceptor.run浣跨敤executor[Executor]鐨勭嚎紼?娉ㄥ唽[interestOps:SelectionKey.OP_ACCEPT],鐒跺悗wakeup selector.
涓鏃︽湁榪炴帴榪涙潵灝辨瀯寤篘ioSocketSession--瀵瑰簲--channal,鐒跺悗session.getProcessor().add(session)灝嗗綋鍓嶇殑channal鍔犲叆鍒癗ioProcessor鐨剆elector涓幓[interestOps:SelectionKey.OP_READ],榪欐牱姣忎釜榪炴帴涓湁璇鋒眰榪囨潵灝辯敱鐩稿簲鐨凬ioProcessor鏉ュ鐞?

榪欓噷鏈夊嚑鐐硅璇存槑鐨勬槸:
1.涓涓狽ioSocketAcceptor瀵瑰簲浜嗗涓狽ioProcessor,姣斿NioSocketAcceptor灝變嬌鐢ㄤ簡SimpleIoProcessorPool DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1.褰撶劧榪欎釜size鍦╪ew NioSocketAcceptor鐨勬椂鍊欏彲浠ヨ瀹?
2.涓涓狽ioSocketAcceptor瀵瑰簲涓涓猨ava nio selector[OP_ACCEPT],涓涓狽ioProcessor涔熷搴斾竴涓猨ava nio selector[OP_READ].
3.涓涓狽ioSocketAcceptor瀵瑰簲涓涓唴閮ㄧ殑AbstractPollingIoAcceptor.Acceptor---thread.
4.涓涓狽ioProcessor涔熷搴斾竴涓唴閮ㄧ殑AbstractPollingIoProcessor.Processor---thread.
5.鍦╪ew NioSocketAcceptor鐨勬椂鍊欏鏋滀綘涓嶆彁渚?strong>Executor(綰跨▼姹?鐨勮瘽,閭d箞榛樿浣跨敤Executors.newCachedThreadPool().
榪欎釜Executor灝嗚NioSocketAcceptor鍜孨ioProcessor鍏敤,涔熷氨鏄涓婇潰鐨凙cceptor---thread(涓鏉?鍜孭rocessor---thread(澶氭潯)閮芥槸婧愪簬榪欎釜Executor.
      褰撲竴涓繛鎺ava nio channal--NioSession琚姞鍒?strong>ProcessorPool[i]--NioProcessor涓幓鍚庡氨杞叆浜咥bstractPollingIoProcessor.Processor.run,
AbstractPollingIoProcessor.Processor.run鏂規硶鏄繍琛屽湪涓婇潰鐨?strong>Executor涓殑涓鏉$嚎紼嬩腑鐨?褰撳墠鐨凬ioProcessor灝嗗鐞嗘敞鍐屽湪瀹冪殑selector涓婄殑鎵鏈夎繛鎺ョ殑璇鋒眰[interestOps:SelectionKey.OP_READ].

AbstractPollingIoProcessor.Processor.run鐨勪富瑕佹墽琛屾祦紼?
for (;;) {      
       ......
       int selected = selector(final SELECT_TIMEOUT = 1000L);
       .......
       if (selected > 0) {
          process();
       }
       ......
}

process()-->for all session-channal:OP_READ -->read(session):榪欎釜read鏂規硶鏄疉bstractPollingIoProcessor.private void read(T session)鏂規硶.
read(session)鐨勪富瑕佹墽琛屾祦紼嬫槸read channal-data to buf,if readBytes>0 then IoFilterChain.fireMessageReceived(buf)/*鎴戜滑鐨処oHandler.messageReceived灝嗗湪鍏朵腑琚皟鐢?/strong>*/;
    鍒版mina Nio 澶勭悊璇鋒眰鐨勬祦紼嬪凡緇忔槑浜?
    mina澶勭悊璇鋒眰鐨勭嚎紼嬫ā鍨嬩篃鍑烘潵浜?鎬ц兘闂涔熸潵浜?/strong>,閭e氨鏄湪AbstractPollingIoProcessor.Processor.run-->process-->read(per session)涓?鍦╬rocess鐨勬椂鍊檓ina鏄?strong>for all selected-channals 閫愭read data鍐峟ireMessageReceived鍒版垜浠殑IoHandler.messageReceived涓?/strong>,鑰屼笉鏄茍鍙戝鐞?/strong>,榪欐牱涓鏉ュ緢鏄庢樉鍚庢潵鐨勮姹傚皢琚?strong>寤惰繜澶勭悊.
鎴戜滑鍋囪:濡傛灉NioProcessorPool's size=2 鐜板湪鏈?00涓鎴風鍚屾椂榪炴帴榪囨潵,鍋囪姣忎釜NioProcessor閮芥敞鍐屼簡100涓繛鎺?瀵逛簬姣忎釜NioProcessor灝?strong>渚濇欏哄簭
澶勭悊榪?00涓姹?閭d箞榪欏叾涓殑絎?00涓姹傝寰楀埌澶勭悊,閭e畠鍙湁絳夊埌鍓嶉潰鐨?9涓澶勭悊瀹屼簡.
    鏈変漢鎻愬嚭浜嗘敼榪涙柟妗?閭e氨鏄湪鎴戜滑鑷繁鐨処oHandler.messageReceived涓埄鐢ㄧ嚎紼嬫睜鍐嶈繘琛屽垎鍙慸ispatching,榪欎釜褰撶劧鏄釜濂戒富鎰?
    浣嗘槸璇鋒眰榪樻槸琚歡榪熷鐞嗕簡,鍥犱負榪樻湁read data鎵娑堣楃殑鏃墮棿,榪欐牱絎?00涓姹傚畠鐨勬暟鎹琚,灝辮絳夊墠闈㈢殑99涓兘琚瀹屾墠琛?鍗充究鏄鍔燩rocessorPool鐨勫昂瀵鎬篃涓嶈兘瑙e喅榪欎釜闂.
    姝ゅmina鐨?strong>闄烽槺(榪欎釜璇嶈緝鏃墮)
涔熷嚭鏉ヤ簡,灝辨槸鍦?strong>read(session)涓?鍦ㄨ榪欎釜闄烽槺涔嬪墠鍏堣鏄庝竴涓?鎴戜滑鐨刢lient绔悜server绔彂閫佷竴涓秷鎭綋鐨勬椂鍊欎笉涓瀹氭槸瀹屾暣鐨勫彧鍙戦佷竴嬈?鍙兘鍒嗗嬈″彂閫?鐗瑰埆鏄湪client绔繖鎴栬鍙戦佺殑娑堟伅浣撶殑闀垮害杈冮暱鐨勬椂鍊?/strong>.鑰宮ina鍦ㄨ繖縐嶆儏鍐典笅灝變細call鎴戜滑鐨処oHandler.messageReceived澶氭,緇撴灉灝辨槸娑堟伅浣撹鍒嗗壊浜嗚嫢騫蹭喚,絳変簬鎴戜滑鍦↖oHandler.messageReceived涓瘡嬈″鐞嗙殑鏁版嵁閮芥槸涓嶅畬鏁寸殑,榪欎細瀵艱嚧鏁版嵁涓㈠け,鏃犳晥.
涓嬮潰鏄痳ead(session)鐨勬簮鐮?
private void read(T session) {
        IoSessionConfig config = session.getConfig();
        IoBuffer buf = IoBuffer.allocate(config.getReadBufferSize());

        final boolean hasFragmentation =
            session.getTransportMetadata().hasFragmentation();

        try {
            int readBytes = 0;
            int ret;

            try {
                if (hasFragmentation/*hasFragmentation涓瀹氫負ture,涔熻mina鐨勫紑鍙戜漢鍛樹篃鎰忚瘑鍒頒簡浼犺緭鏁版嵁鐨勭鐗囬棶棰?浣嗘槸闈犱笅闈㈢殑澶勭悊鏄繙榪滀笉澶熺殑,鍥犱負client涓鏃﹂棿闅斿彂閫?ret灝卞彲鑳戒負0,閫鍑簑hile,涓嶅畬鏁寸殑readBytes灝嗚fire*/) {
                    while ((ret = read(session, buf)) > 0) {
                        readBytes += ret;
                        if (!buf.hasRemaining()) {
                            break;
                        }
                    }
                } else {
                    ret = read(session, buf);
                    if (ret > 0) {
                        readBytes = ret;
                    }
                }
            } finally {
                buf.flip();
            }

            if (readBytes > 0) {
                IoFilterChain filterChain = session.getFilterChain();
                filterChain.fireMessageReceived(buf);
                buf = null;

                if (hasFragmentation) {
                    if (readBytes << 1 < config.getReadBufferSize()) {
                        session.decreaseReadBufferSize();
                    } else if (readBytes == config.getReadBufferSize()) {
                        session.increaseReadBufferSize();
                    }
                }
            }
            if (ret < 0) {
                scheduleRemove(session);
            }
        } catch (Throwable e) {
            if (e instanceof IOException) {
                scheduleRemove(session);
            }
            IoFilterChain filterChain = session.getFilterChain();
            filterChain.fireExceptionCaught(e);
        }
    }
榪欎釜闄烽槺澶у鍙互嫻嬭瘯涓涓?鐪嬩細涓嶄細涓涓畬鏁寸殑娑堟伅琚嬈″彂閫?浣犵殑IoHandler.messageReceived鏈夋病鏈夎澶氭璋冪敤.
瑕佷繚鎸佹垜浠簲鐢ㄧ▼搴忔秷鎭綋鐨勫畬鏁存т篃寰堢畝鍗曞彧闇鍒涘緩涓涓柇鐐筨reakpoint,鐒跺悗set it to the current IoSession,涓鏃︽秷鎭綋鏁版嵁瀹屾暣灝眃ispatching it and remove it from the current session.
-------------------------------------------------------------------------------------------------- 
涓嬮潰浠Socket v2_8_8婧愮爜涓轟緥:
tcp usage e.g:
IServer srv = new Server(8090, new EchoHandler());
srv.start() or run();
-----------------------------------------------------------------------
class EchoHandler implements IDataHandler {  
    public boolean onData(INonBlockingConnection nbc)
             throws IOException,
             BufferUnderflowException,
             MaxReadSizeExceededException {
       String data = nbc.readStringByDelimiter("\r\n");
       nbc.write(data + "\r\n");
       return true;
    }
  }
------------------------------------------------------------------------
璇存槑1.Server:Acceptor:IDataHandler ------1:1:1
Server.run-->IoAcceptor.accept()鍦╬ort涓婇樆濉?涓鏃︽湁channel灝變粠IoSocketDispatcherPool涓幏鍙栦竴涓狪oSocketDispatcher,鍚屾椂鏋勫緩涓涓狪oSocketHandler鍜孨onBlockingConnection,璋冪敤Server.LifeCycleHandler.onConnectionAccepted(ioHandler)  initialize the IoSocketHandler.娉ㄦ剰:IoSocketDispatcherPool.size榛樿涓?,涔熷氨鏄鍙湁2鏉o select鐨勭嚎紼嬪拰鐩稿簲鐨?涓狪oSocketDispatcher.榪欎釜鍜孧INA鐨凬ioProcessor鏁版槸涓鏍風殑.
璇存槑2.IoSocketDispatcher[java nio Selector]:IoSocketHandler:NonBlockingConnection------1:1:1
鍦↖oSocketDispatcher[瀵瑰簲涓涓猄elector].run涓?-->IoSocketDispatcher.handleReadWriteKeys:
for all selectedKeys
{
    IoSocketHandler.onReadableEvent/onWriteableEvent.

IoSocketHandler.onReadableEvent鐨勫鐞嗚繃紼嬪涓?
1.readSocket();
2.NonBlockingConnection.IoHandlerCallback.onData
NonBlockingConnection.onData--->appendDataToReadBuffer: readQueue append data
3.NonBlockingConnection.IoHandlerCallback.onPostData
NonBlockingConnection.onPostData--->HandlerAdapter.onData[our dataHandler] performOnData in WorkerPool[threadpool]. 

鍥犱負鏄妸channel涓殑鏁版嵁璇誨埌readQueue涓?搴旂敤紼嬪簭鐨刣ataHandler.onData浼氳澶氭璋冪敤鐩村埌readQueue涓殑鏁版嵁璇誨畬涓烘.鎵浠ヤ緷鐒跺瓨鍦ㄧ被浼糾ina鐨勯櫡闃?瑙e喅鐨勬柟娉曚緷鐒剁被浼?鍥犱負榪欓噷鏈塏onBlockingConnection.
----------------------------------------------------------------------------------------------
鍐嶄笅闈互grizzly-nio-framework v1.9.18婧愮爜涓轟緥:
tcp usage e.g:
Controller sel = new Controller();
         sel.setProtocolChainInstanceHandler(new DefaultProtocolChainInstanceHandler(){
             public ProtocolChain poll() {
                 ProtocolChain protocolChain = protocolChains.poll();
                 if (protocolChain == null){
                     protocolChain = new DefaultProtocolChain();
                     //protocolChain.addFilter(our app's filter/*搴旂敤紼嬪簭鐨勫鐞嗕粠filter寮濮?綾諱技mina.ioHandler,xSocket.dataHandler*/);
                     //protocolChain.addFilter(new ReadFilter());
                 }
                 return protocolChain;
             }
         });
         //濡傛灉浣犱笉澧炲姞鑷繁鐨凷electorHandler,Controller灝遍粯璁や嬌鐢═CPSelectorHandler port:18888
         sel.addSelectorHandler(our app's selectorHandler on special port);        
  sel.start();
------------------------------------------------------------------------------------------------------------
 璇存槑1.Controller:ProtocolChain:Filter------1:1:n,Controller:SelectorHandler------1:n,
SelectorHandler[瀵瑰簲涓涓猄elector]:SelectorHandlerRunner------1:1,
Controller. start()--->for per SelectorHandler start SelectorHandlerRunner to run.
SelectorHandlerRunner.run()--->selectorHandler.select()  then handleSelectedKeys:
for all selectedKeys
{
   NIOContext.execute:dispatching to threadpool for ProtocolChain.execute--->our filter.execute.

浣犱細鍙戠幇榪欓噷娌℃湁read data from channel鐨勫姩浣?鍥犱負榪欏皢鐢變綘鐨刦ilter鏉ュ畬鎴?鎵浠ヨ嚜鐒舵病鏈塵ina,xsocket瀹冧滑鐨勯櫡闃遍棶棰?鍒嗗彂鎻愬墠浜?浣嗘槸浣犺娉ㄦ剰SelectorHandler:Selector:SelectorHandlerRunner:Thread[SelectorHandlerRunner.run]閮芥槸1:1:1:1,涔熷氨鏄鍙湁涓鏉$嚎紼嬪湪doSelect then handleSelectedKeys.

    鐩告瘮涔嬩笅铏界劧grizzly鍦?strong>騫跺彂鎬ц兘涓婃洿浼?浣嗘槸鍦?strong>鏄撶敤鎬?/strong>鏂歸潰鍗翠笉濡俶ina,xsocket,姣斿綾諱技mina,xsocket涓〃紺哄綋鍓嶈繛鎺ユ垨浼氳瘽鐨処oSession,INonBlockingConnection瀵硅薄鍦╣rizzly涓敱NIOContext鏉ヨ礋璐?浣嗘槸NIOContext騫舵病鏈夋彁渚泂ession/connection lifecycle event,浠ュ強甯歌鐨剅ead/write鎿嶄綔,榪欎簺閮介渶瑕佷綘鑷繁鍘繪墿灞昐electorHandler鍜孭rotocolFilter,浠庡彟涓涓柟闈篃鍙互璇存槑grizzly鐨勫彲鎵╁睍鎬?鐏墊椿鎬ф洿鑳滀竴絳?

 



]]>
Java綰跨▼姹犵殑鐟曠柕,For java util concurrent threadpool Since jdk1.5http://www.tkk7.com/adapterofcoms/articles/313482.htmladapterofcomsadapterofcomsSat, 20 Feb 2010 12:15:00 GMThttp://www.tkk7.com/adapterofcoms/articles/313482.htmlhttp://www.tkk7.com/adapterofcoms/comments/313482.htmlhttp://www.tkk7.com/adapterofcoms/articles/313482.html#Feedback0http://www.tkk7.com/adapterofcoms/comments/commentRss/313482.htmlhttp://www.tkk7.com/adapterofcoms/services/trackbacks/313482.html    java.util.concurrent鐨勪綔鑰呮槸Doug Lea : 涓栫晫涓婂Java褰卞搷鍔涙渶澶х殑涓漢,鍦╦dk1.5涔嬪墠澶у涓瀹氱啛鎮変粬鐨刡ackport-util-concurrent.jar."榪欎釜榧繪鎸傜潃鐪奸暅錛岀暀鐫寰風帇濞佸粔浜屼笘鐨勮儭瀛愶紝鑴鎬笂姘歌繙鎸傜潃璋﹂婅吋鑵嗙瑧瀹癸紝鏈嶅姟浜庣航綰﹀窞绔嬪ぇ瀛swego鍒嗘牎璁$畻鍣ㄧ瀛︾郴鐨勮佸ぇ鐖楓?,浠栧彲鏄茍鍙戠紪紼嬬殑澶у笀綰т漢鐗╁摝!
    Since jdk1.5,鍦╦ava.util.concurrent鍖呬笅鐨勭嚎紼嬫睜妯″瀷鏄熀浜巕ueue鐨?threadpool鍙湁涓涓?鑰宷ueue鍗存湁澶氫釜LinkedBlockingQueue,SynchronousQueue,ScheduledThreadPoolExecutor.DelayedWorkQueue絳夊彲鍙傝java.util.concurrent.Executors.娉ㄦ剰:鎴戜笅闈㈢殑闂鏄拡瀵筁inkedBlockingQueue鐨?/strong>,鍙傝冪殑src涓簀dk1.6.
    Threadpool閫氳繃浠ヤ笅鐨?涓睘鎬ф潵鏍囧織姹犱腑鐨勭嚎紼嬫暟:
corePoolSize(綾諱技minimumPoolSize),poolSize(褰撳墠姹犱腑鐨勭嚎紼嬫暟),maximumPoolSize(鏈澶х殑綰跨▼鏁?.
榪?涓睘鎬ц〃杈劇殑鎰忔濇槸姣忔鏂板垱寤烘垨緇撴潫涓涓嚎紼媝oolSize++/--,鍦ㄦ渶蹇欑殑鎯呭喌涓媡hreadpool鍒涘緩鐨勭嚎紼嬫暟涓嶈兘瓚呰繃maximumPoolSize,
褰撶┖闂茬殑鎯呭喌涓媝oolSize搴旇闄嶅埌corePoolSize,褰撶劧threadpool濡傛灉浠庡垱寤烘椂瀹冨氨浠庢潵娌℃湁澶勭悊榪囦竴嬈¤姹傜殑璇?閭d箞poolSize褰撶劧涓?.
    閫氳繃浠ヤ笂2孌電殑璇存槑涓嬮潰鎴戣寮曞嚭鎴戞墍瑕佽鐨勯棶棰?
鎴戜滑鏉ョ湅涓涓媕ava.util.concurrent.ThreadPoolExecutor鐨別xecute鏂規硶:
public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
            if (runState == RUNNING && workQueue.offer(command)) {
                if (runState != RUNNING || poolSize == 0)
                    ensureQueuedTaskHandled(command);
            }
            else if (!addIfUnderMaximumPoolSize(command))
                reject(command); // is shutdown or saturated
        }
}
瀹冭〃杈劇殑涓諱綋鎰忔濇槸:濡傛灉褰撳墠鐨刾oolSize<corePoolSize,閭d箞灝卞鍔犵嚎紼嬬洿鍒皃oolSize==corePoolSize.
濡傛灉poolSize宸茬粡鍒拌揪corePoolSize,閭d箞灝辨妸command(task) put to workQueue,濡傛灉workQueue涓篖inkedBlockingQueue鐨勮瘽,
閭d箞鍙湁褰搘orkQueue offer commands杈懼埌workQueue.capacity鍚?threadpool鎵嶄細緇х畫澧炲姞綰跨▼鐩村埌maximumPoolSize.
1.*****濡傛灉LinkedBlockingQueue.capacity琚緗負Integer.MAX_VALUE,閭d箞姹犱腑鐨勭嚎紼嬪嚑涔庝笉鍙兘鍒拌揪maximumPoolSize.*****
鎵浠ヤ綘濡傛灉浣跨敤浜咵xecutors.newFixedThreadPool鐨勮瘽,閭d箞maximumPoolSize鍜宑orePoolSize鏄竴鏍風殑騫朵笖LinkedBlockingQueue.capacity==Integer.MAX_VALUE,鎴栬呭鏋滆繖鏍穘ew ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,timeUnit,new LinkedBlockingQueue<Runnable>(/*Integer.MAX_VALUE*/))鐨勮瘽,
涓婅堪鐨勪嬌鐢ㄩ兘灝嗗鑷磎aximumPoolSize鏄棤鏁堢殑,涔熷氨鏄綰跨▼姹犱腑鐨勭嚎紼嬫暟涓嶄細瓚呭嚭corePoolSize.
榪欎釜涔熻閭d簺tomcat6鐨勫紑鍙戜漢鍛樺彲鑳戒篃閮侀椃浜?浠栦滑涓嶅緱涓嶆敼鍐橪inkedBlockingQueue,浠omcat-6.0.20-src涓轟緥:
org.apache.tomcat.util.net.NioEndpoint.TaskQueue extends LinkedBlockingQueue<Runnable> override offer method: 
 public void setParent(ThreadPoolExecutor tp, NioEndpoint ep) {
            parent = tp;
            this.endpoint = ep;
        }
       
        public boolean offer(Runnable o) {
            //we can't do any checks
            if (parent==null) return super.offer(o);
            //we are maxed out on threads, simply queue the object
            if (parent.getPoolSize() == parent.getMaximumPoolSize()) return super.offer(o);
            //we have idle threads, just add it to the queue
            //this is an approximation, so it could use some tuning
            if (endpoint.activeSocketProcessors.get()<(parent.getPoolSize())) return super.offer(o);
            //if we have less threads than maximum force creation of a new thread
            if (parent.getPoolSize()<parent.getMaximumPoolSize()) return false;
            //if we reached here, we need to add it to the queue
            return super.offer(o);
        } 

org.apache.tomcat.util.net.NioEndpoint.start()-->
   TaskQueue taskqueue = new TaskQueue();/***queue.capacity==Integer.MAX_VALUE***/
                     TaskThreadFactory tf = new TaskThreadFactory(getName() + "-exec-");
                     executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), 60,TimeUnit.SECONDS,taskqueue, tf);
                     taskqueue.setParent( (ThreadPoolExecutor) executor, this);
2.*****濡傛灉鎶奓inkedBlockingQueue.capacity璁劇疆涓轟竴涓傚綋鐨勫艱繙灝忎簬Integer.MAX_VALUE,閭d箞鍙湁put鍒皅ueue鐨勪換鍔℃暟鍒拌揪LinkedBlockingQueue鐨刢apacity鍚?鎵嶄細緇х畫澧炲姞姹犱腑鐨勭嚎紼?浣垮緱poolSize瓚呭嚭corePoolSize浣嗕笉瓚呰繃maximumPoolSize,榪欎釜鏃跺欐潵澧炲姞綰跨▼鏁版槸涓嶆槸鏈夌偣鏅氫簡鍛??????*****.
榪欐牱涓鏉eject(command)涔熷彲鑳介殢涔嬭屾潵浜?LinkedBlockingQueue.capacity璁劇疆涓轟綍鍊煎張鏄釜澶寸柤鐨勯棶棰?
鎵浠hreadPoolExecutor+LinkedBlockingQueue琛ㄨ揪鐨勬剰鎬濇槸棣栧厛浼氬鍔犵嚎紼嬫暟鍒癱orePoolSize,浣嗗彧鏈塹ueue鐨勪換鍔″閲忓埌杈炬渶澶apacity鍚?鎵嶄細緇х畫鍦╟orePoolSize鐨勫熀鏁頒笂澧炲姞綰跨▼鏉ュ鐞嗕換鍔?鐩村埌maximumPoolSize.
    浣嗕負浠涔堟垜浠笉鑳借繖鏍峰憿:灝哃inkedBlockingQueue.capacity璁劇疆涓篒nteger.MAX_VALUE,璁﹖ask灝藉彲鑳界殑寰楀埌澶勭悊,鍚屾椂鍦ㄥ繖鐨勬儏鍐典笅,澧炲姞姹犱腑鐨勭嚎紼嬪厖鍒癿aximumPoolSize鏉ュ敖蹇殑澶勭悊榪欎簺浠誨姟.鍗充究鏄妸LinkedBlockingQueue.capacity璁劇疆涓轟竴涓傚綋鐨勫?lt;<<榪滃皬浜嶪nteger.MAX_VALUE,涔熶笉涓瀹氶潪寰楀湪浠誨姟鏁板埌杈綥inkedBlockingQueue鐨刢apacity涔嬪悗鎵嶅幓澧炲姞綰跨▼浣縫oolSize瓚呭嚭corePoolSize瓚嬪悜maximumPoolSize.
    鎵浠ava util concurrent涓殑ThreadPoolExecutor+LinkedBlockingQueue緇勫悎鐨勭己鐐逛篃灝卞嚭鏉ヤ簡:濡傛灉鎴戜滑鎯寵綰跨▼姹犲敖鍙兘澶氱殑澶勭悊澶ч噺鐨勪換鍔$殑璇?鎴戜滑浼氭妸LinkedBlockingQueue.capacity璁劇疆涓篒nteger.MAX_VALUE,浣嗘槸濡傛灉榪欐牱鐨勮瘽姹犱腑鐨勭嚎紼嬫暟閲忓氨涓嶈兘鍏呭埌鏈澶aximumPoolSize,涔熷氨涓嶈兘鍏呭垎鍙戞尌綰跨▼姹犵殑鏈澶у鐞嗚兘鍔?濡傛灉鎴戜滑鎶奓inkedBlockingQueue.capacity璁劇疆涓轟竴涓緝灝忕殑鍊?閭d箞綰跨▼姹犱腑鐨勭嚎紼嬫暟閲忎細鍏呭埌鏈澶aximumPoolSize,浣嗘槸濡傛灉姹犱腑鐨勭嚎紼嬮兘蹇欑殑璇?綰跨▼姹犲張浼歳eject璇鋒眰鐨勪換鍔?鍥犱負闃熷垪宸叉弧.
    濡傛灉鎴戜滑鎶奓inkedBlockingQueue.capacity璁劇疆涓轟竴涓緝澶х殑鍊間絾涓嶆槸Integer.MAX_VALUE,閭d箞絳夊埌綰跨▼姹犵殑綰跨▼鏁伴噺鍑嗗寮濮嬭秴鍑篶orePoolSize鏃?涔熷氨鏄換鍔¢槦鍒楁弧浜?榪欎釜鏃跺欐墠鍘誨鍔犵嚎紼嬬殑璇?璇鋒眰浠誨姟鐨勬墽琛屼細鏈変竴瀹氱殑寤舵椂,涔熷氨鏄病鏈夊緱鍒板強鏃剁殑澶勭悊.
    鍏跺疄涔熷氨鏄ThreadPoolExecutor緙轟箯鐏墊晱鐨勭嚎紼嬭皟搴︽満鍒?娌℃湁鏍規嵁褰撳墠浠誨姟鐨勬墽琛屾儏鍐?鏄繖,榪樻槸闂?浠ュ強闃熷垪涓殑寰呭鐞嗕換鍔$殑鏁伴噺綰ц繘琛屽姩鎬佺殑璋冮厤綰跨▼鏁?浣垮緱瀹冪殑澶勭悊鏁堢巼鍙楀埌褰卞搷.
閭d箞浠涔堟槸蹇欑殑鎯呭喌鐨勫垽鏂憿? 
busy[1]:濡傛灉poolSize==corePoolSize,騫朵笖鐜板湪蹇欑潃鎵ц浠誨姟鐨勭嚎紼嬫暟(currentBusyWorkers)絳変簬poolSize.[鑰屼笉綆$幇鍦╬ut鍒皅ueue鐨勪換鍔℃暟鏄惁鍒拌揪queue.capacity]
busy[2].1:濡傛灉poolSize==corePoolSize,騫朵笖put鍒皅ueue鐨勪換鍔℃暟宸插埌杈緌ueue.capacity.[queue.capacity鏄拡瀵規湁浠誨姟闃熷垪鏋侀檺闄愬埗鐨勬儏鍐礭
busy[2].2:綰跨▼姹犵殑鍩烘湰鐩爣鏄敖鍙兘鐨勫揩閫熷鐞嗗ぇ閲忕殑璇鋒眰浠誨姟,閭d箞灝變笉涓瀹氶潪寰楀湪put鍒皅ueue鐨勪換鍔℃暟鍒拌揪queue鐨刢apacity涔嬪悗鎵嶅垽鏂負蹇欑殑鎯呭喌,鍙queue涓幇鏈夌殑浠誨姟鏁?task_counter)涓巔oolSize鎴栬卪aximumPoolSize瀛樺湪涓瀹氱殑姣斾緥鏃跺氨鍙互鍒ゆ柇涓哄繖鎯?姣斿task_counter>=poolSize鎴栬卪aximumPoolSize鐨?NumberOfProcessor+1)鍊?榪欐牱queue.capacity榪欎釜闄愬埗鍙互鍙栨秷浜?
鍦ㄤ笂榪癰usy[1],busy[2]榪?縐嶆儏鍐典笅閮藉簲澧炲姞綰跨▼鏁?鐩磋嚦maximumPoolSize,浣胯姹傜殑浠誨姟寰楀埌鏈蹇殑澶勭悊.

鍓嶉潰璁茬殑鏄繖鐨勬椂鍊橳hreadPoolExecutor+LinkedBlockingQueue鍦ㄥ鐞嗕笂鐨勭憰鐤?閭d箞絀洪棽鐨勬椂鍊欏張瑕佸浣曞憿?
濡傛灉corePoolSize<poolSize<maximumPoolSize,閭d箞綰跨▼絳夊緟keepAliveTime涔嬪悗搴旇闄嶄負corePoolSize,鍢垮樋,榪欎釜灝辯湡鐨勬垚浜哹ug浜嗗摝,涓涓緢闅懼彂鐜扮殑bug,poolSize鏄闄嶄笅鏉ヤ簡,鍙槸寰堝彲鑳介檷榪囦簡澶?lt;corePoolSize,鐢氳嚦闄嶄負0涔熸湁鍙兘.
ThreadPoolExecutor.Worker.run()-->ThreadPoolExecutor.getTask():
Runnable getTask() {
        for (;;) {
            try {
                int state = runState;
                if (state > SHUTDOWN)
                    return null;
                Runnable r;
                if (state == SHUTDOWN)  // Help drain queue
                    r = workQueue.poll();
                else if (poolSize > corePoolSize || allowCoreThreadTimeOut)
      /*queue is empty,榪欓噷timeout涔嬪悗,return null,涔嬪悗call workerCanExit() return true.*/
                    r = workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS);
                else
                    r = workQueue.take();
                if (r != null)
                    return r;
                if (workerCanExit()) {
                    if (runState >= SHUTDOWN) // Wake up others
                        interruptIdleWorkers();
                    return null;
                }
                // Else retry
            } catch (InterruptedException ie) {
                // On interruption, re-check runState
            }
        }
}//end getTask.
private boolean workerCanExit() {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        boolean canExit;
        try {
            canExit = runState >= STOP ||
                workQueue.isEmpty() ||
                (allowCoreThreadTimeOut &&
                 poolSize > Math.max(1, corePoolSize));
        } finally {
            mainLock.unlock();
        }
        return canExit;
}//end workerCanExit.

鍦╳orkerCanExit() return true涔嬪悗,poolSize浠嶇劧澶т簬corePoolSize,pooSize鐨勫兼病鏈夊彉鍖?
ThreadPoolExecutor.Worker.run()灝嗙粨鏉?->ThreadPoolExecutor.Worker.workerDone-->榪欎釜鏃跺欐墠灝唒oolSize--,鍙儨鏅氫簡,鍦ㄥ綰跨▼鐨勭幆澧冧笅,poolSize鐨勫煎皢鍙樹負灝忎簬corePoolSize,鑰屼笉鏄瓑浜巆orePoolSize!!!!!!
渚嬪:濡傛灉poolSize(6)澶т簬corePoolSize(5),閭d箞鍚屾椂timeout鐨勫氨涓嶄竴瀹氭槸涓鏉$嚎紼?鑰屾槸澶氭潯,瀹冧滑閮芥湁鍙兘閫鍑簉un,浣垮緱poolSize--鍑忚繃浜哻orePoolSize.
    鎻愪竴涓媕ava.util.concurrent.ThreadPoolExecutor鐨刟llowCoreThreadTimeOut鏂規硶, @since 1.6 public void allowCoreThreadTimeOut(boolean value);
瀹冭〃杈劇殑鎰忔濇槸鍦ㄧ┖闂茬殑鏃跺欒綰跨▼絳夊緟keepAliveTime,timeout鍚庝嬌寰梡oolSize鑳藉闄嶄負0.[鍏跺疄鎴戞槸甯屾湜瀹冮檷涓簃inimumPoolSize,鐗瑰埆鏄湪鏈嶅姟鍣ㄧ殑鐜涓?鎴戜滑闇瑕佺嚎紼嬫睜淇濇寔涓瀹氭暟閲忕殑綰跨▼鏉ュ強鏃跺鐞?闆墮浂紕庣鐨?鏂柇緇畫鐨?涓鑲′竴娉㈢殑,涓嶆槸寰堟湁鍘嬪姏鐨?璇鋒眰],褰撶劧浣犲彲浠ユ妸corePoolSize褰撲綔minimumPoolSize,鑰屼笉璋冪敤璇ユ柟娉?
    閽堝涓婅堪java util concurrent綰跨▼姹犵殑鐟曠柕,鎴戝java util concurrent綰跨▼姹犳ā鍨嬭繘琛屼簡淇,鐗瑰埆鏄湪"蹇?(busy[1],busy[2])鐨勬儏鍐典笅鐨勪換鍔″鐞嗚繘琛屼簡浼樺寲,浣垮緱綰跨▼姹犲敖鍙兘蹇殑澶勭悊灝藉彲鑳藉鐨勪換鍔?
涓嬮潰鎻愪緵浜嗛珮鏁堢殑綰跨▼姹犵殑婧愮爜璐拱:
java鐗坱hreadpool:
http://item.taobao.com/auction/item_detail-0db2-9078a9045826f273dcea80aa490f1a8b.jhtml
c [not c++]鐗坱hreadpool in windows NT:
http://item.taobao.com/auction/item_detail-0db2-28e37cb6776a1bc526ef5a27aa411e71.jhtml



]]>
DWR鍦ㄥ拰spring闆嗘垚鏃剁殑bug,SpringCreator.getType???http://www.tkk7.com/adapterofcoms/articles/312495.htmladapterofcomsadapterofcomsWed, 10 Feb 2010 04:04:00 GMThttp://www.tkk7.com/adapterofcoms/articles/312495.htmlhttp://www.tkk7.com/adapterofcoms/comments/312495.htmlhttp://www.tkk7.com/adapterofcoms/articles/312495.html#Feedback0http://www.tkk7.com/adapterofcoms/comments/commentRss/312495.htmlhttp://www.tkk7.com/adapterofcoms/services/trackbacks/312495.html
public Class<?> getType()
{
if (clazz == null)
{
try
{
clazz = getInstance().getClass();
}
catch (InstantiationException ex)
{
log.error("Failed to instansiate object to detect type.", ex);
return Object.class;
}
}

return clazz;
}

鎴戜滑鍐嶆潵鐪嬬湅瀹冪殑getInstance,鏈緇堢敱spring鏉ュ垱寤哄疄渚?

public Object getInstance() throws InstantiationException
{
try
{
if (overrideFactory != null)
{
return overrideFactory.getBean(beanName);
}

if (factory == null)
{
factory = getBeanFactory();
}

if (factory == null)
{
log.error("DWR can't find a spring config. See following info logs for solutions");
log.info("- Option 1. In dwr.xml, <create creator='spring' ...> add
log.info("- Option 2. Use a spring org.springframework.web.context.ContextLoaderListener.");
log.info("- Option 3. Call SpringCreator.setOverrideBeanFactory() from your web-app");
throw new InstantiationException("DWR can't find a spring config. See the logs for solutions");
}

return factory.getBean(beanName);
}
catch (InstantiationException ex)
{
throw ex;
}
catch (Exception ex)
{
throw new InstantiationException("Illegal Access to default constructor on " + clazz.getName() + " due to: " + ex);
}
}

getInstance灝嗚繑鍥炵敱spring鏉ュ垱寤虹殑瀹炰緥,寰堟槑鏄維pringCreator.getType鏈夌偣澶氭涓涓?瀹冨厛鍒涘緩浜嗗疄渚?鍐嶄粠瀹炰緥鐨刧etClass鑾峰彇瀵硅薄鐨勭被鍨?鑰宻pring鐨刡eanFactory.getType鍚屾牱鏈夋鍔熻兘,浣嗗畠涓嶉渶瑕佸厛鍒涘緩瀹炰緥.

涔熻鍐欒繖浣嶄唬鐮佺殑浠佸厔鏄笉鐭ラ亾spring beanFactory.getType榪欎釜鏂規硶鍚?


鎴戞妸SpringCreator.getType鏀規鍚庣殑浠g爜 濡備笅:

public Class<?> getType()
{
if (clazz == null)
{
try
{
if(overrideFactory != null){
clazz=overrideFactory.getType(beanName);
}else {
if(factory == null)
factory = getBeanFactory();
clazz=factory.getType(beanName);
}

}
catch (Exception ex)
{
log.error("Failed to detect type.", ex);
return Object.class;
}
}

return clazz;
}

濡傛灉鍑虹幇 Error loading class for creator ...... 閭d箞灝變慨鏀筍pringCreator鍚?


]]>
嫻忚鍣╗IE,Firefox]涓嶆敮鎸乧omet鎶鏈?AJAX涓嶈兘鏀寔鏈嶅姟绔帹娑堟伅http://www.tkk7.com/adapterofcoms/articles/311551.htmladapterofcomsadapterofcomsMon, 01 Feb 2010 12:43:00 GMThttp://www.tkk7.com/adapterofcoms/articles/311551.htmlhttp://www.tkk7.com/adapterofcoms/comments/311551.htmlhttp://www.tkk7.com/adapterofcoms/articles/311551.html#Feedback0http://www.tkk7.com/adapterofcoms/comments/commentRss/311551.htmlhttp://www.tkk7.com/adapterofcoms/services/trackbacks/311551.htmlcomet鎶鏈?鏈嶅姟绔悜瀹㈡埛绔富鍔ㄦ帹娑堟伅鐨勬妧鏈?浣嗕晶閲嶅熀浜巋ttp鐨勫崗璁?濡傛灉鏄痵ocket鍒欎笉瀛樺湪榪欎釜闂.

浠巘omcat6寮濮?澧炲姞浜唎rg.apache.catalina.CometProcessor鎺ュ彛鏉ュ疄鐜板comet鎶鏈殑鏀寔.
淇敼conf/server.xml 

<Connector port="8080" protocol="HTTP/1.1"-鏀逛負->"org.apache.coyote.http11.Http11NioProtocol"
java:璇峰弬鐪媡omcat.apache.org涓婄殑CometServlet鐨勪緥瀛?
import javax.servlet.http.HttpServlet;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;

CometServlet extends HttpServlet implements CometProcessor

javascript:

function installComet(){  
 var xmlReq = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
 xmlReq.onreadystatechange = handler;
 xmlReq.open("GET", "/yourapp/comet",true);
 xmlReq.send();
}
function handler(){
 try{
  if(xmlReq.readyState){  
   if(xmlReq.readyState>=3){   
    alert(xmlReq.responseText);
   }
  }
 }catch(e){  
  alert(xmlReq.readyState+":e->:"+e.message);
 } 
}

    鍦↖E嫻忚鍣ㄥ悇涓増鏈腑handler鍙細琚洖璋冧竴嬈¤屼笉綆℃湇鍔$閽堝姝ゆ榪炴帴鍙戝灝戞娑堟伅,姝ゆ椂鐨剅eadyState涓?
瀵箁esponseText鐨勬搷浣滀細寮曞彂javascript error:瀹屾垚璇ユ搷浣滄墍闇鐨勬暟鎹繕涓嶅彲浣跨敤銆?/p>

    鍦‵irefox涓環andler浼氳澶氭璋冪敤,浣唕esponseText浼氱紦瀛樺墠涓嬈$殑娑堟伅鑰屼笉浼氭竻闄?responseText鐨勬暟鎹細闅忕潃鏈嶅姟绔秷鎭殑鍒拌揪鑰岀瘡縐?

    鍒扮洰鍓嶄負姝?嫻忚鍣ㄥ彧鑳介氳繃鎻掍歡鐨勬柟寮忔潵瀹炵幇瀵筩omet鎶鏈湪瀹㈡埛绔殑鏀寔,鎵浠ユ祦琛岀殑flash player,ActionScript灝辨垚涓轟簡棣栭?
ActionScript閫氳繃socket鏉ュ緩绔嬮暱榪炴帴.

    鎵浠ラ偅浜汚JAX妗嗘灦閮戒笉鑳界湡姝g殑鏀寔comet,鑰屽彧鑳介氳繃poll,setTimeout/setInterval,
鑰宒wr鐨凴everseAjax姝f槸浣跨敤浜唖etTimeout鏉oll杞鏈嶅姟绔殑,璇峰弬鐪媎wr鐨別ngine.js鐨勬簮鐮?



]]>
主站蜘蛛池模板: 国产亚洲精品a在线观看| 无码av免费毛片一区二区 | 99国产精品免费观看视频| 亚洲国产精品激情在线观看| 亚洲AV无码国产剧情| 国产精品无码素人福利免费| 亚洲AV无码一区二区三区性色 | 亚洲午夜精品久久久久久人妖| 免费在线中文日本| 亚洲人成依人成综合网| 久久不见久久见免费视频7| 亚洲精品视频在线观看免费 | 久久九九全国免费| 久久亚洲中文字幕精品有坂深雪| 99久久人妻精品免费一区| 亚洲精品第一国产综合野| 天天看免费高清影视| 黄色三级三级三级免费看| 久久亚洲精品无码播放| 国产一精品一av一免费爽爽| 7777久久亚洲中文字幕蜜桃 | 久久亚洲欧洲国产综合| 免费无码av片在线观看| 久久狠狠高潮亚洲精品| 免费观看毛片视频| 免费无码婬片aaa直播表情| 亚洲精品国产品国语在线| 91免费在线播放| 亚洲爆乳少妇无码激情| 国产啪亚洲国产精品无码 | 91福利视频免费| 亚洲国产欧美一区二区三区| 亚洲熟妇少妇任你躁在线观看无码| baoyu122.永久免费视频| 亚洲人成网站在线观看播放动漫 | 一本岛v免费不卡一二三区| 久久精品国产亚洲AV网站| 国产香蕉九九久久精品免费| 色偷偷噜噜噜亚洲男人| 亚洲天堂久久精品| 国产一级淫片a视频免费观看|