锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
鏈変漢璇磈ava nio鍦ㄥ綰跨▼鐜涓嬬紪紼嬬畝鐩村氨鏄釜鎭舵ⅵ,鍏跺疄浣犲鏋滆兘鎶婃彙浣廽ava nio API鐨勮棰?浣犲氨鍙互灝嗕箣椹鵑┉.
0. 涓涓?channal 瀵瑰簲涓涓猄electionKey in the same selector.
e.g:
SelectionKey sk=sc.register(selector, SelectionKey.OP_READ, handler);
sk==sc.register(selector, SelectionKey.OP_WRITE, handler) true?
selector.select() 姣忔榪斿洖鐨勫鍚屼竴channal鐨剆k鏄惁鐩稿悓?
1.channel.register(...) may block if invoked concurrently with another registration[another.register(...)] or selection operation[selector.select(...)] involving *****the same selector*****.
榪欎釜鏄痳egister鏂規硶jdk src涓婄殑鍘熸枃,
e.g:
濡傛灉涓涓猻election thread宸茬粡鍦╯elect鏂規硶涓婄瓑寰卛ng,閭d箞榪欎釜鏃跺欏鏋滄湁鍙︿竴鏉$嚎紼嬭皟鐢╟hannal.register鏂規硶鐨勮瘽,閭d箞瀹冨皢琚玝locking.
2.selectionKey.cancel() : The key will be removed from all of the selector's key sets during *****the next selection operation[selector.select(...)]*****.
may block briefly if invoked concurrently with a cancellation[cancel()] or selection operation[select(...)] involving ***the same selector***.
榪欎釜涔熸槸cancel鏂規硶jdk src涓婄殑鍘熸枃,
e.g:
浣犲厛灝嗕竴涓猻electionKey.cancel(),鐒跺悗闅忓嵆鍐峜hannel.register to the same selector,
鍦╟ancel鍜宺egister涔嬮棿,濡傛灉娌℃湁綰跨▼(鍖呮嫭褰撳墠綰跨▼)榪涜select鎿嶄綔鐨勮瘽,
閭d箞 throws java.nio.channels.CancelledKeyException.
鎵浠?nbsp;cancel-->select-->re-register.
3.if don't remove the current selectedKey from selector.selectedKeys()[Set] 灝嗗鑷?selector.select(...) not block [may be cpu 100%,specially when client cut the current channel(connection)].
e.g:
Iterator<SelectionKey> it=selector.selectedKeys().iterator();
...for/while it.hasNext()...
it.remove();<------*****must do it. or Keys' Set.clear() finally;
if remove the current selectedKey from selector.selectedKeys()[Set] but don't sk.interestOps(sk.interestOps()& (~sk.readyOps()));灝嗗鑷?selector.select(...) not block [select() not block several times, or excepted exception]
4.op_write should not be registered to the selector. [may be cpu100%]
5. if involving wakeup() before select() [wakeup called several times >=1],the next select() not block [not block just once].
灝界浠ュ墠鏈変簺浜哄垎鏋愪簡nio鐨剋akeup鎬ц兘鍙妌ot block in linux鐨刡ug,浣嗘槸java nio渚濈劧鏄珮鏁堢殑,閭d簺c/c++鐨勭墰浜轟滑鍘葷湅鐪媕re/bin鐩綍涓嬬殑nio.dll/nio.so鍚?java nio鏄熀浜巗elect妯″瀷(榪欎釜鏄痗/c++涓父鐢ㄧ綉緇滅紪紼嬫ā鍨嬩箣涓)鐨?
鍩轟簬java nio鐨勬湇鍔″櫒:mina,girzzly[glassfish],jetty(鍩轟簬girzzly),tomcat6[鍙互閰嶇疆Http11NioProtocol]...
鍏朵腑浠庢湰浜哄girzzly,tomcat6鐨勬簮鐮佸垎鏋愭潵鐪?瀹冧滑閮借繕娌℃湁鐪熸鍙戞尌鍑簄io寮傛澶勭悊璇鋒眰鐨勪紭鐐?瀹冧滑鐨勮鍐欒繕閮芥槸blocking鐨勮櫧鐒朵嬌鐢ㄤ簡selectorPool,姝ゅtomcat6瑕佸墺紱誨嚭socket閫氫俊榪樿鑺辮垂涓瀹氱殑鍔熷か.鑰?strong>mina鍗存槸鍚?font class="" style="font-family: " color="#ff0000">涓?/font>絎﹀叾瀹?/strong>,榪樻湁bug鍝?
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Iterator; import java.util.LinkedList; import java.util.Set; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.channels.ServerSocketChannel; import java.nio.channels.Selector; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; public class MyNioServer { private int BUFFERSIZE = 1024*10; private String CHARSET = "GBK"; private Selector sel; public MyNioServer(int port) throws IOException { ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.socket().bind( new InetSocketAddress(InetAddress.getLocalHost(), port)); sel = Selector.open(); ssc.register(sel, SelectionKey.OP_ACCEPT); } public void startup() { System.out.println("Server start..."); try { while (!Thread.interrupted()) { int keysCount = sel.select(); System.out.println("Catched " + keysCount + " SelectionKeys"); if (keysCount < 1) { continue; } Set<SelectionKey> set = sel.selectedKeys(); Iterator<SelectionKey> it = set.iterator(); while (it.hasNext()) { SelectionKey key = it.next(); if (key.isAcceptable()) { System.out.println("Key isAcceptable"); doAccept(key); } if (key.isValid() && key.isReadable()) { System.out.println("Key isReadable"); doRead(key); } if (key.isValid() && key.isWritable()) { System.out.println("Key isWritable"); doWrite(key); } } set.clear(); } System.err.println("Program is interrupted."); } catch (IOException e) { e.printStackTrace(); } System.out.println("Server stop..."); shutdown(); } public void shutdown(){ Set<SelectionKey> keys = sel.keys(); for(SelectionKey key:keys){ try { key.channel().close(); } catch (IOException e) { e.printStackTrace(); } } try { sel.close(); } catch (IOException e) { e.printStackTrace(); } } private void doAccept(SelectionKey key) { try { SocketChannel sc = ((ServerSocketChannel) key.channel()).accept(); sc.configureBlocking(false); SelectionKey newkey = sc.register(sel, SelectionKey.OP_READ); newkey.attach(new LinkedList<ByteBuffer>()); new Thread(new UserInteractive(newkey)).start(); } catch (IOException e) { e.printStackTrace(); System.err.println("Failed to accept new client."); } System.out.println("end doAccept"); } // TODO buffersize performance testing private void doRead(SelectionKey key) { try { SocketChannel sc = (SocketChannel) key.channel(); ByteBuffer bb = ByteBuffer.allocate(BUFFERSIZE); StringBuffer sb = new StringBuffer(); int count = 0; while ( (count = sc.read(bb)) > 0) { bb.flip(); sb.append(Charset.forName(CHARSET).decode(bb)); bb.flip(); } //if client disconnected, read return -1 if(count == -1){ System.out.println("client disconnected"); disconnect(key); } else { System.out.println("message received from client:" + sb.toString()); } } catch (IOException e) { disconnect(key); e.printStackTrace(); } System.out.println("end doRead"); } private void doWrite(SelectionKey key) { SocketChannel sc = (SocketChannel) key.channel(); LinkedList<ByteBuffer> outseq = (LinkedList<ByteBuffer>) key .attachment(); ByteBuffer bb = outseq.poll(); if(bb == null){ return; } try { while(bb.hasRemaining()){ sc.write(bb); } } catch (IOException e) { disconnect(key); e.printStackTrace(); } if (outseq.size() == 0) { System.out.println("after all buffers wrote, unregister OP_WRITE from interestOps"); key.interestOps(SelectionKey.OP_READ); } System.out.println("end doWrote"); } private void disconnect(SelectionKey key) { try { key.channel().close(); } catch (IOException e) { e.printStackTrace(); } } //TODO find out how to shutdown private class UserInteractive implements Runnable { SelectionKey key; public UserInteractive(SelectionKey key) { this.key = key; } public void run() { System.out.println("UserInteractive thread start..."); BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); while (true) { try { String inputLine = br.readLine(); ByteBuffer bb = ByteBuffer.allocate(BUFFERSIZE); bb = ByteBuffer.wrap(inputLine.getBytes()); ((LinkedList<ByteBuffer>) key.attachment()).offer(bb); System.out .println("after input, register OP_WRITE to interestOps and wakeup selector"); key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE); key.selector().wakeup(); } catch (IOException e) { e.printStackTrace(); } } } } /** * @param args */ public static void main(String[] args) { try { MyNioServer server = new MyNioServer(10001); server.startup(); } catch (Exception e) { e.printStackTrace(); System.err.println("Exception caught, program exiting…"); } } } |
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.nio.channels.SelectionKey; import java.text.MessageFormat; import java.util.LinkedList; import java.util.Set; import java.util.Iterator; public class MyNioClient { private int BUFFERSIZE = 1024*10; private String CHARSET = "GBK"; private Selector sel; public MyNioClient(int port) throws IOException { SocketChannel sc = SocketChannel.open(); sc.configureBlocking(false); // this operation need to be executed before socket.connnect, for OP_CONNECT event sc.connect(new InetSocketAddress(InetAddress.getLocalHost(), port)); sel = Selector.open(); sc.register(sel, SelectionKey.OP_CONNECT |SelectionKey.OP_READ); } public void startup() { System.out.println("Client start..."); try { while (!Thread.interrupted()) { int keysCount = sel.select(); System.out.println("Catched " + keysCount + " SelectionKeys"); if (keysCount < 1) { continue; } Set<SelectionKey> selectedKeys = sel.selectedKeys(); Iterator<SelectionKey> it = selectedKeys.iterator(); while (it.hasNext()) { SelectionKey key = it.next(); //printKeyInfo(key); if (key.isConnectable()) { System.out.println("Key isConnectable"); doConnect(key); } else if (key.isValid() && key.isReadable()) { System.out.println("Key isReadable"); doRead(key); } else if (key.isValid() && key.isWritable()) { System.out.println("Key isWritable"); doWrite(key); } } selectedKeys.clear(); } System.err.println("Program is interrupted."); } catch (IOException e) { e.printStackTrace(); } System.out.println("Client stop..."); shutdown(); } public void shutdown(){ Set<SelectionKey> keys = sel.keys(); for(SelectionKey key:keys){ try { key.channel().close(); } catch (IOException e) { e.printStackTrace(); } } try { sel.close(); } catch (IOException e) { e.printStackTrace(); } } private void printKeyInfo(SelectionKey key) { String keyStr = MessageFormat .format( "IntOps:{0},ReadyOps:{1},isVal:{2},isAcc:{3},isCnn:{4},isRead:{5},isWrite:{6}", key.interestOps(), key.readyOps(), key.isValid(), key .isAcceptable(), key.isConnectable(), key .isReadable(), key.isWritable()); System.out.println(keyStr); } private void doConnect(SelectionKey key) { try { boolean flag = ((SocketChannel) key.channel()).finishConnect(); } catch (IOException e) { e.printStackTrace(); System.exit(1); } System.out.println("unregister OP_CONNECT from interestOps"); key.interestOps(SelectionKey.OP_READ); key.attach(new LinkedList<ByteBuffer>()); new Thread(new UserInteractive(key)).start(); } private void doRead(SelectionKey key) { try { SocketChannel sc = (SocketChannel) key.channel(); ByteBuffer bb = ByteBuffer.allocate(BUFFERSIZE); StringBuffer sb = new StringBuffer(); while (sc.read(bb) > 0) { bb.flip(); sb.append(Charset.forName(CHARSET).decode(bb)); bb.flip(); } System.out.println("message received from server:" + sb.toString()); } catch (IOException e) { e.printStackTrace(); disconnect(key); System.exit(1); } System.out.println("now end readMessage"); } private void doWrite(SelectionKey key) { SocketChannel sc = (SocketChannel) key.channel(); LinkedList<ByteBuffer> outseq = (LinkedList<ByteBuffer>) key .attachment(); ByteBuffer bb = outseq.poll(); if(bb == null){ return; } try { while(bb.hasRemaining()){ sc.write(bb); } } catch (IOException e) { disconnect(key); e.printStackTrace(); } if (outseq.size() == 0) { System.out.println("after all buffers wrote, unregister OP_WRITE from interestOps"); key.interestOps(SelectionKey.OP_READ); } System.out.println("end doWrote"); } private void disconnect(SelectionKey key) { try { key.channel().close(); } catch (IOException e) { e.printStackTrace(); } } private class UserInteractive implements Runnable { SelectionKey key; public UserInteractive(SelectionKey key) { this.key = key; } public void run() { LinkedList<ByteBuffer> outseq = (LinkedList<ByteBuffer>) key .attachment(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { try { String inputLine = br.readLine(); if ("quit".equalsIgnoreCase(inputLine)) { key.channel().close(); System.exit(1); break; } ByteBuffer bb = ByteBuffer.allocate(BUFFERSIZE); bb = ByteBuffer.wrap(inputLine.getBytes()); outseq.offer(bb); System.out .println("after input, register OP_WRITE to interestOps and wakeup selector"); key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE); sel.wakeup(); } catch (IOException e) { e.printStackTrace(); } } } } /** * @param args */ public static void main(String[] args) { try { MyNioClient client = new MyNioClient(10001); client.startup(); } catch (Exception e) { e.printStackTrace(); System.err.println("Exception caught, program exiting..."); } } } |
涓銆?span style="font: 7pt 'Times New Roman'">
緗戠粶緗戠粶娓告垙錛岄鍏堥潰涓寸殑闂褰撶劧鏄浣曡繘琛岀綉緇滈氫俊銆傞鍏堣冭檻鐨勬槸HTTP鍗忚錛屽洜涓烘墍鏈夌殑J2ME鎵嬫満閮芥敮鎸佽繖涓紝鎴戜滑褰撶劧鎯沖敖鍙兘鐨勫吋瀹圭敤鎴楓傝屼笖HTTP鍗忚灝佽紼嬪害宸茬粡闈炲父楂樹簡錛屼笉鐢ㄥ幓鑰冭檻綰跨▼銆佸悓姝ャ佺姸鎬佺鐞嗐佽繛鎺ユ睜錛屼笉榪嘓TTP鍗忚鏈変袱涓笉鐖界殑鍦版柟錛?/span>
鈼?nbsp;鍗忚鏃犵姸鎬侊紝榪欎釜闂宸茬粡鍥版壈榪囧緢澶氫漢寰堝嬈′簡銆傛垜鏇捐冭檻榪囩殑瑙e喅鍔炴硶鏄敼閫燞TTP鍗忚錛屽湪鏁版嵁浼犺緭瀹屾垚涔嬪悗涓嶅叧闂璼ocket錛屼絾鏄繖鏍峰仛宸ヤ綔閲忛潪甯稿ぇ錛屽湪欏圭洰鍛ㄦ湡涓紝鍩烘湰涓婂氨鏄疢ission impossible錛屼笉浜堣冭檻銆傞偅涔堝鎴蜂篃灝卞彧鑳介氳繃杞鐨勬柟寮忓悜鏈嶅姟鍣ㄨ姹傛暟鎹?/span>
鈼?nbsp;緗戠粶嫻侀噺榪囧ぇ銆傚氨榪欎釜欏圭洰鏉ヨ錛岀綉緇滈棿浼犻掔殑鍙槸鎸囦護錛屼絾鏄瘡嬈′紶閫掗兘瑕佸姞涓婁竴鍫嗘鏃犵敤澶勭殑HTTP Head錛屽啀鍔犱笂瀹㈡埛绔渶瑕佸仛杞錛岃繖涓祦閲忓浜庢墜鏈烘潵璇寸畝鐩存亹鎬栵紝緇忕畝鍗曟祴璇曪紝鎸夌収0.03鍏?K鐨凣PRS緗戠粶璐圭敤璁$畻錛屼竴灞鐗屽眳鐒惰娑堣?鍏冨鐨勮垂鐢紙姣忕杞錛夛紝瀹炲湪涓嶅彲鎺ュ彈銆備篃璁告垜浠彲浠ラ噰鐢ㄦ祦閲忚垂鍖呮湀鐨勮祫璐規柟寮忥紝涓嶈繃榪欎釜璇濋涓庢妧鏈棤鍏熾?/span>
浠ヤ笂闂瀵艱嚧鎴戜滑閫夋嫨浜哠ocket錛岃繖鎰忓懗鐫鎴戜滑灝嗘病鏈変竴涓?a target="_blank">Web鐜錛屽緢澶氫笢瑗塊兘瑕侀潬鑷繁鍘誨疄鐜幫細綰跨▼綆$悊銆佸鎴風姸鎬佺洃鎺с佸璞℃睜銆佹帶鍒跺彴……….緗戠粶閮ㄥ垎鎵撶畻閲囩敤Java NIO銆傛瘡涓鎴風榪炴帴涔嬪悗錛屼細鏈変竴涓嫭绔嬬殑
浜屻?span style="font: 7pt 'Times New Roman'"> 閫氫俊鍗忚
榪欎釜欏圭洰騫舵病鏈夊鏉傜殑閫氫俊鎸囦護錛屽懡浠ゆ暟閲忓緢鏈夐檺錛屼絾鏄繕鏄湁涓叧閿棶棰橀渶瑕佸叧娉細嫻侀噺銆備負浜嗗敖閲忓噺灝忔祦閲忥紝鎴戜滑浣跨敤瀛楄妭浠f浛瀛楃涓叉潵淇濆瓨緋葷粺鎸囦護錛岃繖鏍峰彲浠ヤ嬌嫻侀噺鍑忓皯涓鍗婏紝姣斿浣跨敤涓涓瓧鑺傛潵淇濆瓨涓寮犳墤鍏嬬墝錛屽瓧鑺傞珮浣嶈〃紺鴻姳鑹詫紝瀛楄妭浣庝綅琛ㄧず鏁板瓧錛屽鏋?浠h〃榛戞錛岄偅涔堥粦妗冧笁灝卞簲璇ユ槸0x03錛岃繖涓渶瑕侀潬浣嶆搷浣滄潵瀹炵幇錛?/span>
int m=0;
int n=3;
byte card=(byte)(m)<<4)|((byte)n; //m宸︾Щ鍥涗綅錛岀劧鍚庝笌n宸︽垨鎿嶄綔
娓告垙涓渶瑕佷紶閫掔敤鎴風殑縐垎錛岃繖鏄竴涓ぇ鏁存暟錛屼嬌鐢ㄥ洓涓瓧鑺傛潵淇濆瓨姣旇緝淇濋櫓錛屽皢鏁存暟杞崲涓哄洓涓瓧鑺傜殑鎿嶄綔濡備笅錛?/span>
灝嗗洓涓瓧鑺傝漿鍥炴潵鐨勬搷浣滃涓嬶細
涓夈?span style="font: 7pt 'Times New Roman'"> 鏁版嵁搴?/a>榪炴帴姹?/span>
鐢變簬娌℃湁涓涓獁eb鐜錛屾墍浠ユ垜浠渶瑕佽嚜宸卞疄鐜頒竴涓暟鎹簱榪炴帴姹狅紝apache鏈変竴涓」鐩彨鍋歝ommons DBCP錛岃繖鏄竴涓熀浜巃pache鑷繁鐨勫璞℃睜錛坅pache commons pool錛夊疄鐜扮殑鏁版嵁搴撹繛鎺ユ睜錛屾垜浠彲浠ョ洿鎺ユ嬁鏉ヤ嬌鐢紝apache鐨勮蔣浠舵湭蹇呮槸鏈濂界殑錛屼絾鏄瀬澶у彲鑳芥瘮鎴戜滑鑷繁鍐欑殑瑕佸ソ銆侰ommons DBCP闇瑕佷笁涓?jar錛歝ommons-collections-3.1.jar銆乧ommons-dbcp-1.2.1.jar銆乧ommons-pool-1.2.jar榪欎笁涓枃浠墮兘鍙互鍦╝pache – Jakarta – commons欏圭洰涓?a target="_blank">涓嬭澆錛屽姞鍏ュ埌宸ョ▼涓嵆鍙傛瀯閫犱竴涓暟鎹簱榪炴帴姹犵殑浠g爜濡備笅錛?/span>
璇瘋嚜琛屽鐞嗘搷浣滀腑鐨勫悇縐嶅紓甯搞?/span>
鍥涖?span style="font: 7pt 'Times New Roman'"> 鎵戝厠鐗岀殑鐢熸垚
娓告垙涓渶瑕佷負鐢ㄦ埛鐢熸垚闅忔満鐨勬墤鍏嬬墝錛岄鍏堟垜浠渶瑕佸垵濮嬪寲涓鍓墝錛屾斁鍒頒竴涓狧ashmap涓紝姣忓紶鐗屼互涓涓瓧鑺傝〃紺猴紝楂樹負浠h〃鑺辮壊錛岀殑涓轟唬琛ㄦ暟瀛楋紝鐢熸垚鏁村壇鐗岋細
濡備綍闅忔満鍦板緱鍒板叾涓殑N寮犵墝鍛紵鎴戜滑鐨勫仛娉曟槸鐢熸垚涓涓?-55鐨勯殢鏈烘暟錛岀敤榪欎釜闅忔満鏁頒綔涓婚敭浠嶩ashmap涓幏寰楀璞★紝鍙栧緱涔嬪悗錛屾妸璇ュ璞′粠闃熷垪涓垹闄わ紝浠ュ厤閲嶅鍙栧緱銆傜敱浜巎ava涓殑闅忔満鏁版槸鏍規嵁鏃墮棿鐢熸垚鐨勶紝鎵浠ユ湁鍙兘瀵艱嚧鐢ㄦ埛寰楀埌鐨勭墝涓嶅鏁o紝姣忎釜鐢ㄦ埛閮芥懜鍒頒竴鏉¢緳宀備笉鏄瑧璇濓紵鎵浠ュ湪鐢熸垚闅忔満鏁扮殑鏃跺欐垜浠姞鍏ヤ簡涓涓ぇ绱犳暟鏉ヤ綔榪愮畻錛?/span>
long cardId=new Long((Math.round(Math.random() * 87) % 55)).intValue();閫氳繃淇敼榪欎釜澶х礌鏁幫紝鍙互鎺у埗鏌愪釜鐢ㄦ埛鐨勭墝姣旇緝濂姐?/span>
浜斻?span style="font: 7pt 'Times New Roman'"> 綰跨▼
瀹為檯涓婃湰緋葷粺騫舵病鏈夊鏉傜殑綰跨▼綆$悊錛屼絾鏄垜鎯蟲彁渚涗竴涓帶鍒跺彴璁╃鐞嗗憳鍙互綆$悊娓告垙涓葷嚎紼嬶紝鍙互璁╁畠鍋滄銆佷腑孌點佹仮澶嶃侀噸鍚姩錛屾湰鏉ョ殑璁捐鏄鐞嗗憳閫氳繃涓庣嚎紼婣鎵撲氦閬擄紝閫氳繃A鍘葷鐞嗕富綰跨▼B錛屼絾鏄啛鎮塲ava綰跨▼鐨勬湅鍙嬮兘鐭ラ亾錛岀嚎紼嬩簰鐩哥鐞嗗熀鏈笂灝辨槸涓嶅疄闄呯殑錛屼婦涓渶綆鍗曠殑渚嬪瓙錛孉濡備綍閿姣丅錛熶篃璁鎬綘浼氳璋冪敤B鐨刣estroy()鏂規硶灝卞ソ浜嗭紝緗戜笂寰堝璁茶Вjava綰跨▼鐨勮祫鏂欎篃紜疄鏄繖涔堣鐨勶紝浣嗘槸浠栦滑閮芥槸楝兼壇鐨勶紝鑷繁鍘葷湅鐪媕ava婧愪唬鐮佸惂錛孴hread.destroy()鏂規硶鐨勫疄闄呬唬鐮佸涓嬶細
public void destroy()
{
throw new NoSuchMethodError();
}
浜嬪疄鐪熺浉鏄紝Thread.destroy()鏂規硶鑷鑷崇粓灝辨病鏈夎瀹炵幇榪囥傛墍鏈夊啓鏂囩珷錛屾暀鍒漢鐢ㄨ繖涓柟娉曢攢姣佺嚎紼嬬殑浜猴紝閮藉幓鎾炲鍚э紝涓漢涓㈠ぇ浜嗐傛渶濂界殑鍔炴硶鏄疉璐熻矗鐢熸垚涓涓狟騫朵笖鍚姩瀹冿紝鐒跺悗B鑷繁綆$悊鐢熷瓨鍛ㄦ湡錛孉鍜孊閫氳繃浣跨敤鍙叡浜殑鏂規硶鏉ラ氫俊錛岃繖鏄痵un鎺ㄨ崘鐨勫仛娉曘?/span>
鍏?span style="font: 7pt 'Times New Roman'"> 寮傛娑堟伅
鐢ㄦ埛鐜╃墝鐨勮繃紼嬩腑錛屾湁寰堝涓滆タ闇瑕佽褰曚笅鏉ワ紝姣斿璁板綍鐢ㄦ埛鐨勭Н鍒嗐佺瓑綰у彉鍖栵紝璁板綍鐜╃墝鏃ュ織渚涙暟鎹粺璁$瓑錛屽綋鐢ㄦ埛鏁伴噺寰堝鐨勬椂鍊欙紝鍦ㄦ暟鎹簱涓褰曡繖浜涗俊鎭細寰堣楄垂璧勬簮錛岀敤鎴風帺浜嗕竴灞涔嬪悗浼氬彲鑳戒細絳夊緟寰堥暱鏃墮棿銆傝В鍐寵繖涓棶棰樼殑鏂規硶鏄埄鐢?a target="_blank">J2EE鐨勬秷鎭痓ean鏉ユ彁渚涘紓姝ラ氫俊鐨勬満鍒訛紝闇瑕佽褰曟暟鎹殑鏃跺欙紝緋葷粺浼氬皝瑁呬竴涓煎璞★紝鍙戦佺粰J2EE瀹瑰櫒錛岃繖涓搷浣滄槸寰堝揩鐨勶紝瀹屾垚涔嬪悗灝辮繑鍥烇紝鐢ㄦ埛鍙互緇х畫鎿嶄綔錛屼笉鐢ㄥ叧蹇冩秷鎭綍鏃惰澶勭悊銆侸2EE鐨勬秷鎭鏋跺叿澶囧涓嬬壒寰侊細
鈼囨秷鎭竴瀹氫細琚槄璇伙紝鑰屼笖鍙槄璇諱竴嬈°侸MS妗嗘灦鏈夎嚜宸辯殑綆楁硶錛屾妸娑堟伅緙撳啿鍒?a target="_blank">紜洏錛屽氨綆桱2EE鏈嶅姟鍣ㄦ鎺夛紝娑堟伅涔熶笉浼氫涪澶便?/span>
鈼囩郴緇熼噰鐢ㄧ偣瀵圭偣鐨凲ueue娑堟伅闃熷垪錛屽彲浠ヤ繚璇佸悓絳変紭鍏堢駭鐨勬秷鎭厛榪涘厛鍑恒?/span>
鍦↗boss 4.0涓紝閮ㄧ講娑堟伅Bean鍜孮ueue闃熷垪錛岄兘姣攚eblogic 8.1鏉ョ殑瀹規槗錛屽彧闇瑕佸湪jboss.XML涓0鏄庢秷鎭洰鐨勫湴錛屽鏋渏boss鍙戠幇璇ョ洰鐨勫湴涓嶅瓨鍦ㄧ殑璇濓紝浼氳嚜鍔ㄥ緩绔嬩竴涓紝瀹炲湪寰堢畝鍗曘傚叧浜庢秷鎭痓ean鐨勫紑鍙戜笌閮ㄧ講錛屾垜鏈変笓闂ㄧ殑鏂囩珷鎻忚堪銆?/span>
涓冦?span style="font: 7pt 'Times New Roman'"> 鍚姩涓庨鍑?/span>
涓轟簡璁╃郴緇熷叿澶囪浜烘弧鎰忕殑鎬ц兘錛屽簲璇ュ敖閲忓鐨勯噸鐢ㄥ璞★紝鍑忓皯鍒涘緩鏂板璞°傛瘮濡備笂闈㈡彁鍒扮殑娑堟伅鍙戦侊紝鎴戜滑鐨勬搷浣滄槸鎻愪緵涓涓潤鎬佺被錛屽湪緋葷粺鍚姩鐨勬椂鍊欏氨鍒濆鍖栵紝淇濇寔涓嶫MS鏈嶅姟鍣ㄧ殑榪炴帴錛岀郴緇熷彂閫佹秷鎭殑鏃跺欙紝涓嶇敤鍐嶅幓鏌ヨJNDI鍜岀敓鎴怮ueueConnectionFactory錛岃繖鏍峰彲浠ユ彁楂樼郴緇熷搷搴旈熷害銆?/span>
鍦ㄦ暟鎹簱榪炴帴姹犵殑闂涓婏紝鎴戜滑涔熼噰鐢ㄥ悓鏍風殑鎿嶄綔錛屽惎鍔ㄧ殑鏃跺欏垵濮嬪寲N涓繛鎺ャ備絾鏄鏋滃湪鍏抽棴榪涚▼鐨勬椂鍊欎笉鍋氫換浣曟搷浣滐紝浼氬鑷碕MS鎶涘嚭socket寮傚父錛岃櫧鐒舵病浠涔堝ぇ鐨勫獎鍝嶏紝浣嗘繪樉寰椾笉涓撲笟錛岃屼笖姹犱腑鐨勮繛鎺ヤ笉琚噴鏀劇殑璇濓紝涔熷彲鑳藉鑷撮棶棰樸傛渶濂借兘澶熻緋葷粺鍍廽boss絳夋帶鍒跺彴紼嬪簭涓鏍鳳紝ctrl+c涔嬪悗鑳藉鎵ц鎿嶄綔錛岄噴鏀捐祫婧愬啀閫鍑恒傛垜浠彲浠ラ氳繃緇欒繘紼?綰跨▼鍔犱笂涓涓狧ook鏉ュ疄鐜幫紝Windows紼嬪簭鍛樺簲璇ュ榪欎釜闈炲父鐔熸倝銆?/span>
Hook搴旇鏄竴涓嚎紼嬫柟娉曪紝濡備笅錛?/span>
public class Hook extends Thread
{
public void run()
{
//閲婃斁鏁版嵁搴撹繛鎺ワ紝閿姣佽繛鎺ユ睜
//鍏抽棴涓嶫MS鐨勮繛鎺?/span>
}
}
鍦ㄤ富綰跨▼涓姞鍏ワ細Runtime.getRuntime().addShutdownHook(new Hook()) ;閭d箞榪涚▼/綰跨▼浼氬湪閫鍑虹殑鏃跺欐墽琛孒ook鐨剅un鏂規硶錛屾竻鐞嗚祫婧愩?/span>