ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>精品一区二区三区久久久,国产精品三级,国产精品一二二区http://www.aygfsteel.com/jiangpingcmt1/zh-cnSun, 22 Jun 2025 15:48:41 GMTSun, 22 Jun 2025 15:48:41 GMT60sql执行™åºåºhttp://www.aygfsteel.com/jiangpingcmt1/archive/2012/08/10/385234.html火炎ç‚?/dc:creator>火炎ç‚?/author>Fri, 10 Aug 2012 07:58:00 GMThttp://www.aygfsteel.com/jiangpingcmt1/archive/2012/08/10/385234.htmlhttp://www.aygfsteel.com/jiangpingcmt1/comments/385234.htmlhttp://www.aygfsteel.com/jiangpingcmt1/archive/2012/08/10/385234.html#Feedback0http://www.aygfsteel.com/jiangpingcmt1/comments/commentRss/385234.htmlhttp://www.aygfsteel.com/jiangpingcmt1/services/trackbacks/385234.htmlSQL 不同于与其他¾~–程语言的最明显特征是处理代码的™åºåºã€‚在大数¾~–程语言中,代码按编码顺序被处理åQŒä½†æ˜¯åœ¨SQL语言中,½W¬ä¸€ä¸ªè¢«å¤„理的子句是FROM子句åQŒå°½½Ž¡SELECT语句½W¬ä¸€ä¸ªå‡ºçŽŽÍ¼Œä½†æ˜¯å‡ ä¹Žæ€ÀL˜¯æœ€åŽè¢«å¤„理ã€?

      每个步骤都会(x¨¬)产生一个虚拟表åQŒè¯¥è™šæ‹Ÿè¡¨è¢«ç”¨ä½œä¸‹ä¸€ä¸ªæ­¥éª¤çš„输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才ä¼?x¨¬)è¿”å?¾l™è°ƒç”¨è€…。如果没有在查询中指定某一子句åQŒå°†è·Œ™¿‡ç›¸åº”的步骤。下面是对应用于SQL server 2000å’ŒSQL Server 2005的各个逻辑步骤的简单描˜q°ã€?/p>

复制代码
(8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
(
1)FROM [left_table]
(
3)<join_type> JOIN <right_table>
(
2)ON <join_condition>
(
4)WHERE <where_condition>
(
5)GROUP BY <group_by_list>
(
6)WITH <CUBE | RollUP>
(
7)HAVING <having_condition>
(
10)ORDER BY <order_by_list>
复制代码

逻辑查询处理阶段½Ž€ä»?/strong>

  1. FROMåQ?/strong>对FROM子句中的前两个表执行½W›å¡ž®?d¨¡ng)积åQˆCartesian product)(交叉联接åQ‰ï¼Œç”Ÿæˆè™šæ‹Ÿè¡¨VT1
  2. ONåQ?/strong>对VT1应用ON½{›é€‰å™¨ã€‚只有那些ä‹É<join_condition>为真的行才被插入VT2ã€?/li>
  3. OUTER(JOIN)åQ?/strong>å¦?果指定了OUTER JOINåQˆç›¸å¯¹äºŽCROSS JOIN æˆ?INNER JOIN),保留表(preserved tableåQšå·¦å¤–部联接把左表标è®îCØ“(f¨´)保留表,叛_¤–部联接把双™¡¨æ ‡è®°ä¸ÞZ¿ç•™è¡¨åQŒå®Œå…¨å¤–部联接把两个表都标记ä¸ÞZ¿ç•™è¡¨åQ‰ä¸­æœªæ‰¾åˆ°åŒ¹é…çš„è¡Œå°†ä½œäØ“(f¨´)外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表åQŒåˆ™å¯¹ä¸Šä¸€ä¸ªè”接生成的¾l“果表和下一个表重复执行步骤1到步éª?åQŒç›´åˆ°å¤„ç†å®Œæ‰€æœ‰çš„è¡¨äØ“(f¨´)æ­¢ã€?/li>
  4. WHEREåQ?/strong>对VT3应用WHERE½{›é€‰å™¨ã€‚只有ä‹É<where_condition>为true的行才被插入VT4.
  5. GROUP BYåQ?/strong>按GROUP BY子句中的列列表对VT4中的行分¾l„,生成VT5.
  6. CUBE|ROLLUPåQ?/strong>把超¾l?Suppergroups)插入VT5,生成VT6.
  7. HAVINGåQ?/strong>对VT6应用HAVING½{›é€‰å™¨ã€‚只有ä‹É<having_condition>为true的组才会(x¨¬)被插入VT7.
  8. SELECTåQ?/strong>处理SELECT列表åQŒäñ”生VT8.
  9. DISTINCTåQ?/strong>ž®†é‡å¤çš„行从VT8中移除,产生VT9.
  10. ORDER BYåQ?/strong>ž®†VT9中的行按ORDER BY 子句中的列列表排序,生成游标åQˆVC10).
  11. TOPåQ?/strong>从VC10的开始处选择指定数量或比例的行,生成表VT11,òq¶è¿”回调用者ã€?

注:(x¨¬)步骤10åQŒæŒ‰ORDER BY子句中的列列表排序上步返回的行,˜q”回游标VC10.˜q™ä¸€æ­¥æ˜¯½W¬ä¸€æ­¥ä¹Ÿæ˜¯å”¯ä¸€ä¸€æ­¥å¯ä»¥ä‹É用SELECT列表中的列别名的步骤。这一步不同于其它步骤çš?是,它不˜q”回有效的表åQŒè€Œæ˜¯˜q”回一个游标。SQL是基于集合理论的。集合不ä¼?x¨¬)预先对它的行排序,它只是成员的逻辑集合åQŒæˆå‘˜çš„™åºåºæ— å…³ç´§è¦ã€‚对表进行排åº?的查询可以返回一个对象,包含按特定物理顺序组¾l‡çš„行。ANSI把这¿Uå¯¹è±¡ç§°ä¸ºæ¸¸æ ‡ã€‚理解这一步是正确理解SQL的基¼‹€ã€?/p>

因䨓(f¨´)˜q™ä¸€æ­¥ä¸˜q”回表(而是˜q”回游标åQ‰ï¼Œä½¿ç”¨äº†ORDER BY子句的查询不能用作表表达式。表表达式包括:(x¨¬)视图、内联表值函数、子查询、派生表和共用表辑ּã€‚它的结果必™å»è¿”回给期望得到物理记录的客æˆïL(f¨¥ng)«¯åº”用½E‹åºã€‚例如,下面的派生表查询无效åQŒåƈ产生一个错误:(x¨¬)

select * 
from(select orderid,customerid from orders order by orderid)
as d

下面的视图也ä¼?x¨¬)äñ”生错è?/p>

create view my_view
as
select
*
from orders
order by orderid

      在SQL中,表表辑ּä¸­ä¸å…è®¸ä½¿ç”¨å¸¦æœ‰ORDER BY子句的查询,而在T—SQL中却有一个例外(应用TOP选项åQ‰ã€?/p>

      所以要è®îC½åQŒä¸è¦äØ“(f¨´)表中的行假设ä»ÖM½•特定的顺序。换句话è¯ß_(d¨¢)¼Œé™¤éžä½ ç¡®å®šè¦æœ‰åºè¡Œï¼Œå¦åˆ™ä¸è¦æŒ‡å®šORDER BY 子句。排序是需要成本的åQŒSQL Server需要执行有序烦引扫描或使用排序˜qè¡Œ½W¦ã€?br />



]]>
CMPP2.0å¼€å?/title><link>http://www.aygfsteel.com/jiangpingcmt1/archive/2012/07/19/383460.html</link><dc:creator>火炎ç‚?/dc:creator><author>火炎ç‚?/author><pubDate>Wed, 18 Jul 2012 17:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/jiangpingcmt1/archive/2012/07/19/383460.html</guid><wfw:comment>http://www.aygfsteel.com/jiangpingcmt1/comments/383460.html</wfw:comment><comments>http://www.aygfsteel.com/jiangpingcmt1/archive/2012/07/19/383460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jiangpingcmt1/comments/commentRss/383460.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jiangpingcmt1/services/trackbacks/383460.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="cb_post_title_url" class="postTitle2" >CMPP2.0å¼€å?/a></h1> <div class="wmqeeuq" id="cnblogs_post_body"> <div>一、CMPP协议½Ž€ä»?/div> <div>中国¿UÕdŠ¨é€šä¿¡äº’è”¾|‘短信网å…ÏxŽ¥å£åè®?China Mobile Peer to Peer CMPP)åQŒæ˜¯ä¸­å›½¿UÕdŠ¨æ¢¦ç½‘å†…éƒ¨å„SMSå‚ä¸ŽèŠ‚ç‚¹ç›æ€º’交换SMS的官方协议。作为梦¾|‘的参与方,¿UÕdŠ¨æ¢¦ç½‘çš„å¢žå€¼æœåŠ¡å•†(Service Provider SP )要按照此协议规范实现SP的部分,才可以将自己的短信通过¿UÕdŠ¨çš„GSM¾|‘络的数据通道传输到最¾lˆæ‰‹æœºç”¨æˆ·ä¸Šã€?/div> <div>实际上,协议规范äº?个方面的内容åQ?/div> <div>。SP与移动的互联¾|‘短信网养I¼ˆInternet Short Message Gateway,ISMGåQ‰ä¹‹é—´çš„æŽ¥å£åè®®</div> <div>。ISMG之间的接口协议(譬如¿UÕdŠ¨å„çœã€å¸‚ä¹‹é—´çš„çŸ­ä¿¡æ¯äº¤æ¢é€šè¿‡ISMG之间˜q›è¡ŒåQ?/div> <div>。ISMG与汇接网å…?Gateway Name Server GNSåQŒç±»ä¼égº’联网上的DNS服务å™?之间的接口协议,譬如跨省之类的短信需要GNS的帮助指出当前ISMG该如何传递短信ã€?/div> <div>其中åQŒåŽäºŒæ–¹é¢å±žäºŽç§»åŠ¨çŸ­ä¿¡æ¯¾pȝ»Ÿå†…部实现åQŒå¯¹äºŽSP来讲大概可以“透明”来看待,只要实现了SP同ISMG的正¼‹®äº¤äº’,ž®±å¯ä»¥å®žçŽ°æŽ¥å…¥ç§»åŠ¨æ¢¦¾|‘短信系¾lŸã€‚我们关心的只是SP端的开发细节ã€?/div> <div></div> <div>二、CMPP交互模式</div> <div>从手机用戯‚§’度讲åQŒæŒ‰çŸ­ä¿¡çš„发èµ?接收路径来讲åQŒæœ‰ä¸¤ä¸ªå«æ³•åQ?/div> <div><strong>MT</strong>(Short Message Mobile Terminated, SMMT)åQŒçŸ­ä¿¡æŽ¥æ”Óž¼ŒçŸ­ä¿¡ä»ŽSP发送到手机用户ã€?/div> <div><strong>MO</strong> (Short Message Mobile OriginateåQŒSMMO)åQŒçŸ­ä¿¡å‘送,短信从手机用æˆïL(f¨¥ng)«¯å‘送到目标SPã€?/div> <div>˜q™ä¸¤¾cȝŸ­ä¿¡äº¤äº’,从SP端来看,都是属于Socket传输应用åQŒCMPP的协议是以TCP/IPåè®®ä½œäØ“(f¨´)底层承蝲协议的,属于TCP/IP协议栈之上的应用ã€?/div> <div>SP同ISMG的交互连接分<strong>长连æŽ?/strong>å’?strong>短连æŽ?/strong>ã€?/div> <div>所谓短˜qžæŽ¥åQŒå°±æ˜¯ä¸€‹Æ¡è¿žæŽ¥ï¼Œä¼ è¾“一个消息,然后½{‰å¾…回复后拆除连接,昄¡„¶åQŒæ•ˆçŽ‡å¾ˆä½Žï¼Œæ‰€ä»¥ï¼ŒåŸºæœ¬ä¸Šä¸è¢«è€ƒè™‘åQˆå®žé™…应用移动也不允许SPé‡‡ç”¨çŸ­è¿žæŽ¥ï¼Œåªæ˜¯ä¸æ˜Žç™½ç§»åŠ¨äØ“(f¨´)什么还要写入文档? ISMG间会(x¨¬)需要?åQ?/div> <div>所谓长˜qžæŽ¥åQŒå°±æ˜¯SP建立同ISMG˜qžæŽ¥åQŒç„¶åŽä¸æ–­å°†æ•°æ®åŒ…(一个个CMPP消息åQ‰å‘送到ISMGåQŒæ­¤å¤„发送不必等待某条消息的ISMG回应消息˜q”回åQŒå°±æŽ¥ç€å‘送下一个消息。同æ—Óž¼Œ½{‰å¾…ISMG˜q”回信息或者等待ISMG发送给SP的消息。发送同接收消息不是一定要同步的,实际采用异步åQˆåŒæ—¶ä¹Ÿæ—¶åŒå·¥ï¼‰æ¨¡å¼ã€‚从效率上,昄¡„¶åQŒå¿…™åÕd…¨åŒå·¥çš„异步模式才能够满èƒö实际应用需求ã€?/div> <div>如下图(摘自<a >CMPP2.0</a>官方文档åQ‰æ‰€½Cºï¼Œæ¼”示了长˜qžæŽ¥æ¨¡å¼æ•°æ®ä¼ è¾“˜q‡ç¨‹åQ?/div> <div> </div> <div> <img border="0" hspace="0" alt="" align="baseline" src="http://sg.kehui.net/articleimg/58809.jpg" /></div> <div> </div> <div> </div> <div> </div> <div> </div> <div> </div><br clear="all" /> <div>三、SP端开å?/div> <div>1.         消息分类</div> <div>首先åQŒå›¾ä¸­çš„CMPP消息有很多种åQŒSP同ISMG之间交流˜q™äº›æ¶ˆæ¯ã€‚大体上˜q™äº›æ¶ˆæ¯å‘出后,å¯ÒŽ(gu¨©)–¹å¾€å¾€éœ€è¦å›žå¤ä¸€ä¸ªåº”½{”(RESPåQ‰ç±»æ¶ˆæ¯ã€‚注意,˜q™äº›æ¶ˆæ¯å¤§å¤šå…ähœ‰æ–¹å‘性,也就是说只能够从一端到另一端,而不可反方向˜q›è¡ŒåQŒæœ‰äº›ï¼ˆž®‘æ•°åQ‰åˆ™å¯ä¸¤ç«¯éƒ½èƒ½å¤Ÿå‘出。以下信息主要来源于¿UÕdŠ¨çš„æ–‡æ¡£ï¼Œä½†é’ˆå¯¹å¤§å®¶æ˜“æ·äh·†æˆ–源文档解释不够详细做了明确和补充。具体见下表åQ?/div> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="191"> <div>       消息å?/div></td> <td valign="top" width="93"> <div>传递方å?/div></td> <td valign="top" width="228"> <div>解释说明</div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP­_CONNECT</div></td> <td valign="top" width="93"> <div>SP---àISMG</div></td> <td valign="top" width="228"> <div>CMPP_CONNECT操作的目的是SP向ISMGæ³¨å†Œä½œäØ“(f¨´)一个合法SPíw«ä†¾åQŒæ­¤æ¶ˆæ¯éœ€è¦å‘ISMG发出验证信息åQŒéªŒè¯æ–¹å¼é‡‡ç”¨md5加密密码方式åQŒè‹¥æ³¨å†ŒæˆåŠŸåŽå³å»ºç«‹äº†åº”ç”¨å±‚çš„è¿žæŽ?否则ISMGä¼?x¨¬)ç«‹åÏx–­å¼€Socket)åQŒæ­¤åŽSP可以通过此ISMG接收和发送短信ã€?/div> <div>ISMG以CMPP_CONNECT_RESP消息响应SP的请求。具体的½Ž—法实现参è€?a >CMPP2.0</a>文档和本文附件代码ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_CONNECT_RESP</div></td> <td valign="top" width="93"> <div>SPß---ISMG</div></td> <td valign="top" width="228"> <div>ISMG对CMPP_CONNECT消息的回复(无论是否验证成功åQ‰ï¼›å¦‚果未通过åQŒä¼š(x¨¬)在消息中包含参考信息,但ISMGä¼?x¨¬)ç«‹åÏx–­å¼€˜qžæŽ¥ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP­_ACTIVE_TEST</div></td> <td valign="top" width="93"> <div>SPßàISMG</div></td> <td valign="top" width="228"> <div>˜q™ä¸ªæ¶ˆæ¯é€šä¿¡åŒæ–¹éƒ½å¯ä»¥å‘出,目的是在没有其他消息发送时åQŒä¿æŒåŒæ–¹çš„通信链èµ\的连接,避免¾pȝ»Ÿè®¤äØ“(f¨´)通信通道已经关闭。每一个收到此消息的实体应当返回CMPP_ACTIVE_TEST_RESP消息åQŒä»¥“½CÆDŠ‚æ€?#8221;表示自己的还在通信åQŒç»´æŒæ•°æ®è¿žæŽ¥æœ‰æ•ˆæ€§ã€?/div> <div>不过åQŒæ®¾|‘友交流åQŒæœ‰äº›åŽ‚å®¶å®žçŽ°çš„ISMGåQŒä»…仅靠自己发出此消息等待SP回答CMPP_ACTIVE_TEST_RESP来确定数据链路的有效性,而忽略SPçš„CMPP_ACTIVE_TEST消息åQˆæœ‰äº›éœ¸é“吧åQŸï¼‰˜q™ä¸ªå€¼å¾—注意åQŒä¸è¦ä»…仅实现发送而不响应此消息,避免数据˜qžæŽ¥å¤±æ•ˆã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_ACTIVE_TEST_RESP</div></td> <td valign="top" width="93"> <div>SPßàISMG</div></td> <td valign="top" width="228"> <div>寚w€šä¿¡çš„另一端的CMPP_ACTIVE_TEST消息的回复。作用参考CMPP_ACTIVE_TEST的解释ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP­_SUBMIT</div></td> <td valign="top" width="93"> <div>SP---àISMG</div></td> <td valign="top" width="228"> <div>在正¼‹®å¾ç«‹äº†æ•°æ®˜qžæŽ¥åŽï¼ŒSP向ISMG发送一个SMS数据包。本消息需要仔¾l†ç ”½I¶ã€‚接收到此消息后åQŒISMG需要以CMPP_SUBMIT_RESPæ¶ˆæ¯ä½œäØ“(f¨´)回答。如果在一定时间时间内åQˆç§»åŠ¨ç»™å‡ºçš„å‚è€ƒå€?0¿U’)内未得到消息回应åQŒé‚£ä¹ˆSP需要重新发送此数据包,以确保消息得到投递。如果重发达åˆ?‹Æ¡åŽä»ç„¶å¾—不到回应,SP端应该考虑可能ISMG已经失效åQŒåº”当停止发送此短消息ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP­_SUBMIT_RESP</div></td> <td valign="top" width="93"> <div>SPß---ISMG</div></td> <td valign="top" width="228"> <div>该消息由ISMG发送给SPåQŒåŒæ—¶è¿”回一ä¸?#8220;收条”(源CMPP_SUBMIT消息的ISMG端的标示MSGID)¾l™SPåQŒè¡¨½C?#8220;我ISMG已经¼‹®è®¤æ”¶åˆ°ä½ è¿™æ¡æ¶ˆæ¯äº†”。收到此消息后,SP需要保留此“收条”åQŒå› ä¸ºåŽé¢ISMGä¼?x¨¬)最¾lˆæŠ¥å‘Šæœ¬æ¶ˆæ¯æ˜¯å¦æ­£ç¡®å‘送到用户手机。那个报告就是以此消息的“收条”ä½œäØ“(f¨´)¼‹®è®¤é‚£ä¸€æ¡æ¶ˆæ¯çš„ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_QUERY</div></td> <td valign="top" width="93"> <div>SP---àISMG</div></td> <td valign="top" width="228"> <div>˜q™ä¸ªæŸ¥è¯¢ä¸æ˜¯æŸ¥è¯¢å•条消息的,是查询SP发送给ISMG的短信的业务情况。可以查总计敎ͼŒ˜q˜å¯ä»¥åˆ†¾cÀLŸ¥è¯¢ã€‚(基本ž®±æ˜¯å‘è“v对移动sms业务数据库的查询¾lŸè®¡åQ?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_QUERY_RESP</div></td> <td valign="top" width="93"> <div>SPß---ISMG</div></td> <td valign="top" width="228"> <div>ISMGž®†æŸ¥è¯¢çš„æ•°æ®˜q”回¾l™SPã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_CANCEL</div></td> <td valign="top" width="93"> <div>SP---àISMG</div></td> <td valign="top" width="228"> <div>SP发è“v的取消某条消息的命ä×o(h¨´)消息åQŒå…¶ä¸­åŒ…含了之前已经发送给ISMG消息çš?#8220;收条”以便ISMG可以¼‹®å®šæ˜¯é‚£ä¸€æ¡æ¶ˆæ¯ã€‚如果消息已¾lå‘送给用户了,那么此消æ?命ä×o(h¨´)ä¼?x¨¬)无效,ISMG˜q”回å¤ÞpÓ|ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_CANCEL_RES</div></td> <td valign="top" width="93"> <div>SPß---ISMG</div></td> <td valign="top" width="228"> <div>ISMG˜q”回的对CMPP_CANCEL的回复,òq¶å‘ŠçŸ¥æ˜¯å¦åˆ é™¤æˆåŠŸã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_DELIVER</div></td> <td valign="top" width="93"> <div>SPß---ISMG</div></td> <td valign="top" width="228"> <div>当有MO或者状态报告时åQŒISMG发送此消息。注意,此消息的数据可以是用æˆäh‰‹æœºå‘送给SP的消息,也可是对于之前SP发送到ISMG的短信的最¾lˆçŠ¶æ€çš„å›žå¤åQŒæŠ¥å‘ŠçŸ­ä¿¡çš„æœ€¾lˆçŠ¶æ€ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_DELIVER_RESP</div></td> <td valign="top" width="93"> <div>SP---àISMG</div></td> <td valign="top" width="228"> <div>SP½CÆDŠ‚æ€§çš„å›žå¤å‘ŠçŸ¥æ”¶åˆ°CMPP_DELIVER消息。要指出SP报告的CMPP_DELIVER消息的MSGIDåQŒä»¥ä¾¿ISMG知道那一条消息SP已经¼‹®è®¤æ”¶åˆ°ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP_TERMINAT</div></td> <td valign="top" width="93"> <div>SPßàISMG</div></td> <td valign="top" width="228"> <div>SPå’ŒISMG都可以主动发消息¾l™å¯¹æ–¹ï¼Œè‡ªå·±˜q™ç«¯ç”׃ºŽæŸç§åŽŸå› éœ€è¦ç»ˆæ­¢å½“å‰çš„æ•°æ®˜qžæŽ¥ã€‚终止后åQŒè¦¾lè¿‡é‡æ–°ConnectionåQˆéªŒè¯ï¼‰ä¹‹åŽæ‰å¯ä»¥ï¼ˆ˜q›å…¥äº‹åŠ¡é˜¶æ®µåQ‰å‘送SMS数据消息ã€?/div></td></tr> <tr> <td valign="top" width="191"> <div>CMPP­_TERMINATE_RES</div></td> <td valign="top" width="93"> <div>SPßàISMG</div></td> <td valign="top" width="228"> <div>通知å¯ÒŽ(gu¨©)–¹åQŒæœ¬ç«¯å·²¾læœ€å¥½æ’¤é™¤è¿žæŽ¥çš„准备ã€?/div></td></tr></tbody></table> <div>                     </div> <div>2.         交互阶段</div> <div>整个CMPPåè®®äº¤äº’åˆ†äØ“(f¨´)<strong>验证</strong>ã€?strong>事务</strong>两个阶段。验证阶ŒDµï¼Œå‘送CMPP_CONNECTION消息˜q›è¡ŒéªŒè¯åQŒé€šè¿‡éªŒè¯åŽï¼ˆå¿…须要通过才)˜q›å…¥CMPP事务阶段åQŒå¯ä»¥å‘送短信数据了。上表中的CMPP_CONNECTION以下的消息都属于事务阶段的消息ã€?/div> <div> </div> <div>3.         消息数据¾l“æž„</div> <div>每一个消息包å?<strong>消息å¤?/strong> å’?<strong>消息ä½?/strong>两个部分åQŒå¤´å›ºå®šé•¿åº¦ä¸?2字节åQŒå…¶ä»–消息长度各异,但是同一¾cÕdž‹æ¶ˆæ¯çš„长度是固定的。所有消息的各个字段基本上仅æœ?¿Uç±»åž‹ï¼š(x¨¬)Unsigned Integer åQˆæ— ½W¦å·æ•´åž‹åQ? ã€IntegeråQˆæ•´åž‹ï¼‰ã€Octet StringåQˆå­—½W¦ä¸²åQ‰ï¼Œæ¯ç§¾cÕdž‹å…·ä½“长度不定åQŒç½‘¾lœå­—节顺序ã€?/div> <div>1ã€?nbsp; 消息å¤?3个Unsigned Integer字段¾l„成)åQ?/div> <div>4字节的Total_Length åQˆUnsigned IntegeråQ‰ï¼ŒåŒ…含了此消息的总计åQˆåŒ…括了头部分)长度ã€?/div> <div>4字节的Command_IdåQˆUnsigned IntegeråQ‰ï¼ŒæŒ‡æ˜Žäº†æ­¤æ¶ˆæ¯åˆ°åº•是什么消息,ž®±æ˜¯ä¸Šè¡¨ä¸­æ¶ˆæ¯çš„æžšä‹D倹{€‚应用程序根据此值确定本数据包到底是什么消息,从而可以按照确定的消息¾cÕdž‹åQŒè§£æžä½™ä¸‹çš„æ¶ˆæ¯ä½“ã€?/div> <div>4字节的Sequence_IdåQˆUnsigned IntegeråQ‰ï¼ŒæŒ‡æ˜Žäº†æ­¤æ•°æ®åŒ…在发送此消息端的唯一¾~–号。这个唯一¾~–号åQŒå®žé™…上可以看作‹¹æ°´æ“ä½œ¾~–号。因为分析到交互模式我们看到åQŒSP发送数据到ISMGåQŒä¸æ˜¯æ¯å‘送一个就停下来等待ISMG的回复,而是“一下子”发送多个数据包˜q‡åŽ»åQŒç„¶åŽç­‰å¾…ISMG的回应。然而,怎么知道回应的消息是到底对应之前发送过åŽÈš„消息中的那一条呢åQŸæœ¬å­—段ž®±æ˜¯è§£å†³æ­¤éš¾é¢˜ã€‚SP按照¾~–号发送消息过去,½{‰å¾…ISMG的回åº?#8212;一般情形下回应消息数据¾l“构都有表明本消息回应的是SP发出的哪一条消息,˜q™ä¸ªå¯¹åº”ž®±æ˜¯ä¾é Sequence_Id。它òq¶ä¸è¦æ±‚一定要严格唯一åQŒä½†æ˜¯åœ¨¾l™å®šçš„一ŒD‰|—¶é—´å†…åQŒå¿…™åÕd”¯ä¸€åQˆåŸºæœ¬ä¸Šåªè¦SP发送过åŽÈš„消息中没有重复就行了åQ‰ã€‚如果是需要SP回答的消息,SP也必™åÕd°†ISMG发送过来的消息的Sequence_Id填入相应字段åQŒè¡¨æ˜Žè¿™æ˜¯æŸä¸ªæ¶ˆæ¯çš„回应。SP端和ISMG端Sequence_ID都没有确定具体的½Ž—法。SP可以(但不推荐)采用数据库的唯一Idä½œäØ“(f¨´)此倹{€?/div> <div> </div> <div>2、消息体。消息体长度æ ÒŽ(gu¨©)®æ¶ˆæ¯ä¸åŒåQŒé•¿åº¦ä¸ä¸€ã€‚其他的参考移动的文档《中国移动通信互联¾|‘短信网å…ÏxŽ¥å£åè®?China Mobile Peer to Peer, CMPP)åQˆV2.0åQ‰ã€‹ï¼Œ˜q™é‡Œç€é‡è®²è®?个重要消息的消息体数据结构:(x¨¬)</div> <div>       CMPP­_SUBMIT的消息体åQ?/div> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="96"> <div>字段å?/div></td> <td valign="top" width="48"> <div>长度(byte)</div></td> <td valign="top" width="84"> <div>¾cÕdž‹</div></td> <td valign="top" width="264"> <div>描述</div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Id</div></td> <td valign="top" width="48"> <div>8</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>信息标识åQŒåº”该由SPä¾§ISMG本èín产生åQŒæœ¬å¤„å¡«½Iºï¼Œä¾›ISMG传输时ä‹É用。SP提交时候应当留½Iºã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Pk_total</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>相同Msg_Id的信息æ€ÀL¡æ•ŽÍ¼Œä»?开始。如果一条消息长度超多一条短信,可能需要分解成多条消息åQŒé‚£ä¹ˆå®žé™…上˜q™å¤šæ¡æ¶ˆæ¯å±žäºŽä¸€æ¡å®Œæ•´æ¶ˆæ¯ï¼Œæ‰€ä»¥å¯ä»¥æ ¹æ®æ­¤¾l™åˆ†è§£å¾—到的多条短信˜q›è¡Œ¾~–号åQŒé‚£ä¹ˆæ€»è®¡éœ€è¦ç¼–成多ž®‘条短信åQŒæ­¤å¤„就填写多少ã€?/div> <div> </div></td></tr> <tr> <td valign="top" width="96"> <div>Pk_number</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>相同Msg_Idçš„ä¿¡æ¯åºåøP¼Œä»?开始。编号决定消息的相对位置ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Registered_Delivery</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>是否要求˜q”回状态确认报告:(x¨¬)</div> <div>0åQšä¸éœ€è¦?/div> <div>1åQšéœ€è¦?/div> <div>2åQšäñ”生SMC话单åQˆè¯¥¾cÕdž‹çŸ­ä¿¡ä»…ä¾›¾|‘关计费使用åQŒä¸å‘送给目的¾lˆç«¯åQ‰ã€?/div> <div>一般情况下åQŒéƒ½éœ€è¦ç¡®è®¤æŠ¥å‘Šã€‚SMC话单也需要返回是否成功的报告。这条消息用于包月SMCæ—Óž¼Œå½“你发送消息给¿UÕdŠ¨çš„ISMGåQŒç§»åŠ¨çš„è®¡è´¹¾pȝ»Ÿä¼?x¨¬)一‹Æ¡æ€§æ‰£é™¤ç”¨æˆïL(f¨¥ng)š„信息费,但是此消息不ä¼?x¨¬)送到用户手机。但是注意,有的ISMG厂商(很可能是¿UÕdŠ¨è¦æ±‚)å®žçŽ°æ­¤æ¶ˆæ¯æ—¶å€™ï¼Œå¦‚æžœä½ åÆˆæ²¡æœ‰å‘é€ä“Q何此包月¾cÕdž‹çš„æ¶ˆæ¯ç»™ç”¨æˆ·æ‰‹æœºåQŒæ˜¯ä¸å‘生扣费行为的。移动会(x¨¬)è®¤äØ“(f¨´)˜q™æ˜¯å±žäºŽ˜qè§„çš?#8220;代收è´?#8221;è¡ŒäØ“(f¨´)åQŒä¼š(x¨¬)影响同移动的合作关系ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_level</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>信息¾U§åˆ«åQŒä¿¡æ¯çš„优先¾U§ã€‚不˜q‡å®žé™…当中,感觉ISMGç«¯åÆˆæ²¡æœ‰åŒºåˆ†ä¼˜å…ˆ¾U§ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Service_Id</div></td> <td valign="top" width="48"> <div>10</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>业务¾cÕdž‹åQŒæ˜¯æ•°å­—、字母和½W¦å·çš„组合。这个表½CÞZ¸šåŠ¡çš„å­—ç¬¦ä¸²å¯ä»¥ç»™å‘å‡ºçš„çŸ­ä¿¡åˆ†¾c…R€‚通过此字ŒDµå¤§¾U¦å¯ä»¥çŸ¥é“每个服务项目的业务量,有利于统计和计费以及(qi¨¢ng)¾l“ç®—ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Fee_UserType</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>计费用户¾cÕdž‹å­—段</div> <div>0åQšå¯¹ç›®çš„¾lˆç«¯MSISDN计费åQ?/div> <div>1åQšå¯¹æºç»ˆç«¯MSISDN计费åQ?/div> <div>2åQšå¯¹SP计费;</div> <div>3åQšè¡¨½Cºæœ¬å­—段无效åQŒå¯¹è°è®¡è´¹å‚见Fee_terminal_Id字段ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Fee_terminal_Id</div></td> <td valign="top" width="48"> <div>21</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>被计费用æˆïL(f¨¥ng)š„åïL(f¨¥ng) åQˆå¦‚本字节填½Iºï¼Œåˆ™è¡¨½Cºæœ¬å­—段无效åQŒå¯¹è°è®¡è´¹å‚见Fee_UserType字段åQŒæœ¬å­—段与Fee_UserType字段å?ã€?ã€?时互斥)</div></td></tr> <tr> <td valign="top" width="96"> <div>TP_pId</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div align="left">GSM协议¾cÕdž‹ã€‚详¾l†æ˜¯è§£é‡Šè¯·å‚考GSM03.40中的9.2.3.9</div></td></tr> <tr> <td valign="top" width="96"> <div>TP_udhi</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div align="left">GSM协议¾cÕdž‹ã€‚详¾l†æ˜¯è§£é‡Šè¯·å‚考GSM03.40中的9.2.3.23,ä»…ä‹Éç”?位,叛_¯¹é½?/div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Fmt</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>信息格式</div> <div>  0åQšASCIIä¸?/div> <div>  3åQšçŸ­ä¿¡å†™å¡æ“ä½?/div> <div>  4åQšäºŒ˜q›åˆ¶ä¿¡æ¯</div> <div>  8åQšUCS2¾~–码</div> <div>15åQšå«GB汉字  </div> <div>˜q™ä¸ªå†›_®šäº†Msg_Content字段的字节内容应该按照什么编码来解码/¾~–码ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_src</div></td> <td valign="top" width="48"> <div>6</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>信息内容来源(SP的企业代ç ?åQŒä¾‹å¦?19000ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>FeeType</div></td> <td valign="top" width="48"> <div>2</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>资费¾cÕdˆ«</div> <div>01åQšå¯¹“计费用户åïL(f¨¥ng) ”免费</div> <div>02åQšå¯¹“计费用户åïL(f¨¥ng) ”按条计信息费</div> <div>03åQšå¯¹“计费用户åïL(f¨¥ng) ”按包月收信息è´?/div> <div>04åQšå¯¹“计费用户åïL(f¨¥ng) ”的信息费ž®é¡¶</div> <div>05åQšå¯¹“计费用户åïL(f¨¥ng) ”的收è´ÒŽ(gu¨©)˜¯ç”±SP实现ã€?/div> <div>通常å€égØ“(f¨´)02åQŒæ³¨æ„è¿™æ˜¯ä¸€ä¸ªå­—½W¦ä¸²åQŒåƈ非整型ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>FeeCode</div></td> <td valign="top" width="48"> <div>6</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div align="left">资费代码åQˆä»¥åˆ†äØ“(f¨´)单位åQ‰ï¼Œå¦‚:(x¨¬)“0050”代表人民å¸?.50å…ƒã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>ValId_Time</div></td> <td valign="top" width="48"> <div>17</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>存活有效期,格式遵åó@SMPP3.3协议</div></td></tr> <tr> <td valign="top" width="96"> <div>At_Time</div></td> <td valign="top" width="48"> <div>17</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>定时发送时é—ß_(d¨¢)¼Œæ ¼å¼éµåó@SMPP3.3协议。这个字ŒDµå¯ä»¥è®©çŸ­ä¿¡åœ¨è§„定的旉™—´¾l™æ‰‹æœºç”¨æˆ—÷€‚一般情况下不填åQŒä¿ç•™äØ“(f¨´)½Iºå­—½W¦ä¸²ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Src_Id</div></td> <td valign="top" width="48"> <div>21</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>源号ç ?/div> <div>SP的服务代码或前缀为服务代码的长号ç ? ¾|‘å…³ž®†è¯¥åïL(f¨¥ng) å®Œæ•´çš„填到SMPP协议Submit_SM消息相应的source_addr字段åQŒè¯¥åïL(f¨¥ng) æœ€¾lˆåœ¨ç”¨æˆ·æ‰‹æœºä¸Šæ˜¾½CÞZØ“(f¨´)短消息的ä¸Õd«åïL(f¨¥ng) ã€‚实际上ž®±æ˜¯æœåŠ¡ä»£ç åQŒå¯ä»¥æ˜¯é•¿å·ç ?/div></td></tr> <tr> <td valign="top" width="96"> <div>DestUsr_tl</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>接收信息的用æˆäh•°é‡?ž®äºŽ100个用æˆ?åQŒé€šå¸¸æ˜?。移动是忌讳一条消息发¾l™å¤šä¸ªç”¨æˆïL(f¨¥ng)š„ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Dest_terminal_Id</div></td> <td valign="top" width="48"> <div>21*DestUsr_tl</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>接收短信的MSISDNåïL(f¨¥ng) åQŒä¸€ä¸ªç±»ä¼¼å­—½W¦ä¸²æ•°ç»„的结构。受DestUsr_tl的约束,军_®šäº†æœ¬å­—段的长度ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Length</div></td> <td valign="top" width="48"> <div>1</div></td> <td valign="top" width="84"> <div>Unsigned Integer</div></td> <td valign="top" width="264"> <div>信息长度(Msg_Fmtå€égØ“(f¨´)0æ—Óž¼š(x¨¬)<160个字节;其它<=140个字èŠ?。如果是ASCII码,可以辑ֈ°160ä¸ªè‹±æ–‡å­—æ¯ã€‚åŽŸå› æ˜¯å› äØ“(f¨´)英文字母仅占ç”?bitåQŒè€Œä¸­æ–‡ç­‰åŒå­—节代码需è¦?6ä½ï¼ŒåŒæ—¶æ¯ä¸€ä¸ªå­—èŠ‚æœ€é«˜äØ“(f¨´)都占用,所以最å¤?40个字节,也就æ˜?0个汉字ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Content</div></td> <td valign="top" width="48"> <div>Msg_length</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>信息内容</div></td></tr> <tr> <td valign="top" width="96"> <div>Reserve</div></td> <td valign="top" width="48"> <div>8</div></td> <td valign="top" width="84"> <div>Octet String</div></td> <td valign="top" width="264"> <div>保留</div></td></tr></tbody></table> <div>CMPP_SUBMIT消息长度是可变的åQŒå°†SP端的消息发送给ISMGåQŒISMGž®†è¿”回一个MSGID¾l™SP标示此消息,之后åQ?8ž®æ—¶ä»¥å†…åQŒä½†ä¸€èˆ¬æœ€å¤šå‡ åˆ†é’Ÿå†…就可)åQŒISMG˜q”回关于此消息的递送报告。递送报告同MO短消息是通过另外一个重要消息CMPP­_DELIVER来提交给SP的:(x¨¬)</div> <div>CMPP­_DELIVER的各个字ŒDµï¼š(x¨¬)</div> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="96"> <div align="center">字段å?strong></strong></div></td> <td valign="top" width="60"> <div align="center">字节æ•?strong></strong></div></td> <td valign="top" width="96"> <div align="center">属æ€?/div></td> <td valign="top" width="240"> <div align="center">描述<strong></strong></div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Id</div></td> <td valign="top" width="60"> <div>8</div></td> <td valign="top" width="96"> <div>Unsigned Integer</div></td> <td valign="top" width="240"> <div>信息标识</div> <div>生成½Ž—法如下åQ?/div> <div>采用64位(8字节åQ‰çš„æ•´æ•°åQ?/div> <div>åQ?åQ‰æ—¶é—ß_(d¨¢)¼ˆæ ¼å¼ä¸ºMMDDHHMMSSåQŒå³æœˆæ—¥æ—¶åˆ†¿U’)åQšbit64~bit39åQŒå…¶ä¸?/div> <div>bit64~bit61åQšæœˆä»½çš„äºŒè¿›åˆ¶è¡¨½Cºï¼›</div> <div>bit60~bit56åQšæ—¥çš„äºŒ˜q›åˆ¶è¡¨ç¤ºåQ?/div> <div>bit55~bit51åQšå°æ—¶çš„二进制表½Cºï¼›</div> <div>bit50~bit45åQšåˆ†çš„二˜q›åˆ¶è¡¨ç¤ºåQ?/div> <div>bit44~bit39åQšç§’的二˜q›åˆ¶è¡¨ç¤ºåQ?/div> <div>åQ?åQ‰çŸ­ä¿¡ç½‘关代码:(x¨¬)bit38~bit17åQŒæŠŠçŸ­ä¿¡¾|‘关的代码è{æ¢äØ“(f¨´)整数填写到该字段中ã€?/div> <div>åQ?åQ‰åºåˆ—号åQšbit16~bit1åQŒé¡ºåºå¢žåŠ ï¼Œæ­¥é•¿ä¸?åQŒåó@环ä‹É用ã€?/div> <div>各部分如不能填满åQŒå·¦è¡¥é›¶åQŒå³å¯šw½ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Dest_Id</div></td> <td valign="top" width="60"> <div>21</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>目的åïL(f¨¥ng)  </div> <div>SP的服务代码,一èˆ?--6位,或者是前缀为服务代码的长号码;该号码是手机用户短消息的被叫åïL(f¨¥ng) ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Service_Id</div></td> <td valign="top" width="60"> <div>10</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>业务¾cÕdž‹åQŒæ˜¯æ•°å­—、字母和½W¦å·çš„组合ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>TP_pid</div></td> <td valign="top" width="60"> <div>1</div></td> <td valign="top" width="96"> <div>Unsigned Integer</div></td> <td valign="top" width="240"> <div align="left">GSM协议¾cÕdž‹ã€‚详¾l†è§£é‡Šè¯·å‚考GSM03.40中的9.2.3.9</div></td></tr> <tr> <td valign="top" width="96"> <div>TP_udhi</div></td> <td valign="top" width="60"> <div>1</div></td> <td valign="top" width="96"> <div>Unsigned Integer</div></td> <td valign="top" width="240"> <div align="left">GSM协议¾cÕdž‹ã€‚详¾l†è§£é‡Šè¯·å‚考GSM03.40中的9.2.3.23åQŒä»…使用1位,叛_¯¹é½?/div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Fmt</div></td> <td valign="top" width="60"> <div>1</div></td> <td valign="top" width="96"> <div>Unsigned Integer</div></td> <td valign="top" width="240"> <div>信息格式</div> <div>  0åQšASCIIä¸?/div> <div>  3åQšçŸ­ä¿¡å†™å¡æ“ä½?/div> <div>  4åQšäºŒ˜q›åˆ¶ä¿¡æ¯</div> <div>  8åQšUCS2¾~–码</div> <div>15åQšå«GB汉字   </div></td></tr> <tr> <td valign="top" width="96"> <div>Src_terminal_Id</div></td> <td valign="top" width="60"> <div>21</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>源终端MSISDNåïL(f¨¥ng) åQˆçŠ¶æ€æŠ¥å‘Šæ—¶å¡«äØ“(f¨´)CMPP_SUBMIT消息的目的终端号码)</div></td></tr> <tr> <td valign="top" width="96"> <div>Registered_Delivery</div></td> <td valign="top" width="60"> <div>1</div></td> <td valign="top" width="96"> <div>Unsigned Integer</div></td> <td valign="top" width="240"> <div>是否为状态报å‘?/div> <div>0åQšéžçŠ¶æ€æŠ¥å‘Šï¼ˆMO SMSåQ?/div> <div>1åQšçŠ¶æ€æŠ¥å‘?/div> <div>此字ŒDµå†³å®šäº†CMPP­_DELIVER消息到底是手æœÞZ¸Šè¡Œä¸€æ¡æ¶ˆæ¯åˆ°SP˜q˜æ˜¯ISMG向SP报告之前发送的消息最¾lˆé€’送状态ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Length</div></td> <td valign="top" width="60"> <div>1</div></td> <td valign="top" width="96"> <div>Unsigned Integer</div></td> <td valign="top" width="240"> <div>消息长度。是指Msg_Content字段的长度ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Content</div></td> <td valign="top" width="60"> <div>Msg_length</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>消息内容。如果消息不是状态报告,那么按照Msg_Fmt指示解码为特定编码的字符串内宏V€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Reserved</div></td> <td valign="top" width="60"> <div>8</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>保留™å?/div></td></tr></tbody></table> <div>如果是报告,那么Msg_Contentž®†æŒ‰ç…§çŠ¶æ€æŠ¥å‘Šç»“æž„æ¥è§£é‡ŠåQ?/div> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="96"> <div align="center">字段å?strong></strong></div></td> <td valign="top" width="60"> <div align="center">字节æ•?strong></strong></div></td> <td valign="top" width="96"> <div align="center">属æ€?/div></td> <td valign="top" width="240"> <div align="center">描述<strong></strong></div></td></tr> <tr> <td valign="top" width="96"> <div>Msg_Id</div></td> <td valign="top" width="60"> <div>8</div></td> <td valign="top" width="96"> <div>Unsigned Integer</div></td> <td valign="top" width="240"> <div>信息标识</div> <div>SP提交短信åQˆCMPP_SUBMITåQ‰æ“ä½œæ—¶åQŒä¸ŽSP相连的ISMG产生的Msg_Idã€?/div> <div>˜q™ä¸ªMSGID实际上就是SP之前发送一个CMPP_SUBMIT消息之后的CMPP_SUBMIT_RESP消息中返回的关于CMPP_SUBMIT消息的ISMG¾~–号.åQŒæ ¹æ®æ­¤MSGID可以知道那条消息最¾lˆç¡®å®šçš„递送状态ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Stat</div></td> <td valign="top" width="60"> <div>7</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>发送短信的应答¾l“æžœåQŒå«ä¹‰ä¸ŽSMPP协议要求中stat字段定义相同åQŒè¯¦è§ä¸‹é¢ã€‚SPæ ÒŽ(gu¨©)®è¯¥å­—ŒD늡®å®šè¢«æŠ¥å‘Šçš„CMPP_SUBMIT消息的处理状态ã€?/div></td></tr> <tr> <td valign="top" width="96"> <div>Submit_time</div></td> <td valign="top" width="60"> <div>10</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>YYMMDDHHMMåQˆYY为年的后两位00-99åQŒMMåQ?1-12åQŒDDåQ?1-31åQŒHHåQ?0-23åQŒMMåQ?0-59åQ?/div></td></tr> <tr> <td valign="top" width="96"> <div>Done_time</div></td> <td valign="top" width="60"> <div>10</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>YYMMDDHHMM</div></td></tr> <tr> <td valign="top" width="96"> <div>Dest_terminal_Id</div></td> <td valign="top" width="60"> <div>21</div></td> <td valign="top" width="96"> <div>Octet String</div></td> <td valign="top" width="240"> <div>目的¾lˆç«¯MSISDNåïL(f¨¥ng) (SP发送CMPP_SUBMIT消息的目标终ç«?</div></td></tr> <tr> <td valign="top" width="96"> <div>SMSC_sequence</div></td> <td valign="top" width="60"> <div>4</div></td> <td valign="top" width="96"> <div>Unsigned Integer</div></td> <td valign="top" width="240"> <div>取自SMSC发送状态报告的消息体中的消息标识ã€?/div></td></tr></tbody></table> <div>关于State字段åQŒå¦‚下解释:(x¨¬)</div> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="107"> <div>消息状态名</div></td> <td valign="top" width="149"> <div>最¾lˆçжæ€?/div></td> <td valign="top" width="224"> <div>描述</div></td></tr> <tr> <td valign="top" width="107"> <div>DELIVERED</div></td> <td valign="top" width="149"> <div>DELIVRD</div></td> <td valign="top" width="224"> <div>消息到达目标</div></td></tr> <tr> <td valign="top" width="107"> <div>EXPIRED</div></td> <td valign="top" width="149"> <div>EXPIRED</div></td> <td valign="top" width="224"> <div>消息˜q‡æœŸ</div></td></tr> <tr> <td valign="top" width="107"> <div>DELETED</div></td> <td valign="top" width="149"> <div>DELETED</div></td> <td valign="top" width="224"> <div>消息被删é™?/div></td></tr> <tr> <td valign="top" width="107"> <div>UNDELIVERABLE</div></td> <td valign="top" width="149"> <div>UNDELIV</div></td> <td valign="top" width="224"> <div>消息未被送达</div></td></tr> <tr> <td valign="top" width="107"> <div>ACCEPTED</div></td> <td valign="top" width="149"> <div>ACCEPTD</div></td> <td valign="top" width="224"> <div>消息被认å?/div></td></tr> <tr> <td valign="top" width="107"> <div>UNKNOWN</div></td> <td valign="top" width="149"> <div>UNKNOWN</div></td> <td valign="top" width="224"> <div>未知状æ€?/div></td></tr> <tr> <td valign="top" width="107"> <div>REJECTED</div></td> <td valign="top" width="149"> <div>REJECTD</div></td> <td valign="top" width="224"> <div>消息被弹å›?/div></td></tr></tbody></table> <div>其他消息¾l“æž„åQŒå…·ä½“说明见中移动的CMPP协议ã€?/div> <div> </div> <div>4.         安全验证</div> <div>CMPP协议在CMPP_CONNECTä¸­ä¼ é€’éªŒè¯æ¶ˆæ¯ã€‚éªŒè¯æ¶ˆæ¯äØ“(f¨´)9字节çš?+¿UÕdЍ¾l™å‡ºçš„密ç ?当前旉™—´æˆ›_­—节数¾l„çš„MD5½Ž—法后的字节。时间戳ä¸?月日时分¿U’,10位。代码算法如下:(x¨¬)</div> <div>private byte[] getMd5Code()</div> <div>{</div> <div>       byte[] buf=new byte[6+9+_Password.Length+10] ;    </div> <div>       byte[] s_a=Encoding.ASCII.GetBytes(_SystemID); //ž®±æ˜¯ä¼ä¸šä»£ç </div> <div>       byte[] s_0={0,0,0,0,0,0,0,0,0};     //9字节çš?,此处当作双™¡¥0</div> <div>       byte[] s_p=Encoding.ASCII.GetBytes(_Password); //密码</div> <div>       this._timestamp =getTimestamp();    //取得认证码时赋值字½W¦ä¸²</div> <div>       byte[] s_t=Encoding.ASCII.GetBytes(_timestamp); //10位字½W¦ä¸²å­—节数组</div> <div>       s_a.CopyTo(buf,0);    </div> <div>       s_0.CopyTo(buf,6);   </div> <div>       s_p.CopyTo(buf,6+9);   </div> <div>       s_t.CopyTo(buf,6+9+_Password.Length); </div> <div>       MD5 md5= new MD5CryptoServiceProvider(); //创徏MD5¾cÕdˆ«</div> <div>       return(md5.ComputeHash(buf,0,buf.Length));</div> <div>}   </div> <div>其中getTimestampå‡½æ•°ä¸ø™¿”回例å¦?#8220;0710125959”åQ?æœ?0å?2ç‚?9åˆ?9¿U’)˜q™æ ·çš„å­—½W¦ä¸²åQŒè¯¦¾l†ä»£ç ç•¥˜q‡ï¼Œæœ‰å…´­‘£è¯·æŸ¥çœ‹æœ¬æ–‡çš„附件代码ã€?/div> <div> </div> <div>5.         厂商API问题</div> <div>½W”者公司所处广东,òq¿ä¸œ¿UÕdŠ¨æä¾›äº†åŽä¸ºçš„ä»¥C 形式的APIåQˆSMEIDLL.dllåQ‰ï¼Œæ¥å¸®åŠ©å¤§å®¶åˆæœŸç†Ÿæ‚(zh¨¨n)‰CMPP协议。但是,¾lè¿‡å¼€å‘æµ‹è¯•ï¼Œå‘çŽ°åŽäØ“(f¨´)çš„API臛_°‘存在几个问题åQ?/div> <div>1ã€?nbsp; ž®è£…成几个API函数åQŒä½†æ˜¯ç”±äºŽCMPP自èínçš„å¤æ‚æ€§ï¼Œå¯ÆD‡´˜q™äº›å‡½æ•°ä¸‘陋无比åQŒå‚数多åQŒè€Œä¸”难以明晰含义。华为的APIåQŒå†…部将CMPP的验证、事务阶ŒDµåˆ†æˆå‡ ä¸ªå‡½æ•°å®žçŽŽÍ¼Œå…¶ä¸­ž®†å‘送SMS到ISMG功能以函数提供,竟然出现SubmitAExExEx之类的函数说明ã€?/div> <div>2ã€?nbsp; CMPP的交互是异步的,需要多¾U¿ç¨‹å®žçŽ°ä¸€è¾¹å‘é€ï¼Œä¸€è¾ÒŽ(gu¨©)Ž¥æ”¶åé¦ˆä¿¡æ¯ã€‚æ­¤API应当是内部维护一个线½E‹è¿›è¡ŒCMPP_SUBMITæ¶ˆæ¯å‘é€ï¼Œä½†æ˜¯åŽäØ“(f¨´)API却通过½Iºåó@环之¾cÈš„æ“ä½œ½{‰å¾…ISMG˜q”回CMPP_SUBMIT_RESP得到相应的MSGID再返回(从而实现消息同步返回)。经˜q‡æµ‹è¯•,大约需è¦?00毫秒åQŒè¿™ä¸ªåœ¨å®žé™…SP的高性能需求场合根本无法满­‘³ç³»¾lŸè¦æ±‚ã€?/div> <div>3ã€?nbsp; 接收短信必须依靠½E‹åºä¸ÕdŠ¨å…ˆå‘å‡ºå‡½æ•°HasDeliverMessage调用 åQŒå¾—到有消息才可通过GetDeliverSMEx函数获取消息åQŒæ˜¾ç„Óž¼Œ˜q™ç§æ–¹å¼æ˜¯ä½Žæ•ˆçŽ‡çš„ï¼Œè€Œä¸”å®ÒŽ(gu¨©)˜“产生消息数据包丢失,表现为有些MO消息åQŒSP接收不到。而且åQŒä×o(h¨´)人疑惑的是,你还不能够新开一个线½E‹ä¸“é—¨æ¥åšåˆ¤æ–­åÆˆæŽ¥æ”¶MO的动作,实际开发中一旦采用线½E‹æ¥åšå°±å›žå‘生内存保护错误(大概属于同API自èín的线½E‹æœ‰å†²çªåQ‰ã€?/div> <div>4ã€?nbsp; ˜q”å›žé”™è¯¯ç ï¼Œå¾€å¾€åˆæ˜¯åŽäØ“(f¨´)自己定的一套错误码åQˆå¤§æ¦‚åŽä¸ø™®¾è®¡æ­¤APIä¸ÞZº†é€‚应SMGP CMPP½{‰å¤šä¸ªåè®®ï¼‰åQŒè€Œä¸”¾lå¸¸å˜åЍåQŒå¾ˆæ˜¯ä¼¤è„‘ç­‹ã€?/div> <div>åŸÞZºŽä»¥ä¸Šç†ç”±åQŒæˆ‘è®¤äØ“(f¨´)自己按照CMPP协议开发一个SP端程序,比较能够满èƒö一般SP的需求ã€?/div> <div> </div> <div>四、C#实现</div> <div>1、CMPP协议实现¾c»CMPPClient</div> <div>通过研究åQŒç¬”者用C#写了一¾l„类实现自己的CMPP SP端程序(CMPPClientåQ‰ã€‚䨓(f¨´)了实现相关类åQŒè¿˜éœ€è¦ç¼–写一些辅助类åQŒåƈ且首先要解决CMPP协议的数据结构同C#的数据之间的转换问题ã€?/div> <div>CMPPçš„Octet String 实际上相当于C#中的byte[]åQŒæ‰€æœ‰CMPP消息的Octet String字段å‡ÞZº†CMPP_SUBMITå’ŒCMPP_DELIVERçš„msg_contentå­—æ®µå¤–ï¼Œå…¶ä»–çš„éƒ½å¯ä»¥è®¤äØ“(f¨´)是ASCII¾~–码åQŒæ‰€ä»¥å…¨éƒ¨å¯ä»¥é‡‡ç”¨System.Text.Encoding.ASCII˜q›è¡Œ¾~–码和解码;对于Msg_Content字段åQŒç”±äºŽä¸€èˆ¬æƒ…况下存在汉字信息传输.åQŒæ‰€ä»¥é»˜è®¤çš„¾~?解码应该为Encoding.DefaultåQŒå®žé™…是什么编码还要考察MSG_Fmt字段指示正文到底是什么编码ã€?/div> <div>对于Unsigned Integer å’ŒInterger字段åQŒéœ€è¦æŒ‰ç…§ç½‘¾lœå­—节顺序和x86机器的字节编码顺序对照关¾p»è¿›è¡Œè{换,具体我设计了一个工å…ïL(f¨¥ng)±»æä¸€äº›è{换方法ä‹É用:(x¨¬)</div> <div>public class BIConvert  //字节 æ•´åÅž 转换¾c?¾|‘络格式转换为内存格å¼?/div> <div>       {</div> <div>              public static byte[] Int2Bytes(uint i)  //转换整åŞ数据的网¾lœæ¬¡åºå­—节数¾l?/div> <div>              {</div> <div>                     byte[] t=BitConverter.GetBytes(i) ;</div> <div>                     byte b=t[0];</div> <div>                     t[0]=t[3];</div> <div>                     t[3]=b;</div> <div>                     b=t[1];</div> <div>                     t[1]=t[2];</div> <div>                     t[2]=b;</div> <div>                     return(t);</div> <div>              }</div> <div> </div> <div>              public static uint Bytes2UInt(byte[] bs,int startIndex) //˜q”回字节数组代表的整数数字,4个字节长度的数组</div> <div>              {</div> <div>                     byte[] t=new byte[4];</div> <div>                     for(int i=0;i<4 && i< bs.Length-startIndex ;i++)</div> <div>                     {</div> <div>                            t[i]=bs[startIndex+i];</div> <div>                     }  </div> <div>                     byte b=t[0];</div> <div>                     t[0]=t[3];</div> <div>                     t[3]=b;</div> <div>                     b=t[1];</div> <div>                     t[1]=t[2];</div> <div>                     t[2]=b;</div> <div>                     return(BitConverter.ToUInt32(t,0)); </div> <div>              } </div> <div> </div> <div>              public static uint Bytes2UInt(byte[] bs)  //没有指定起始索引</div> <div>              {</div> <div>                     return( Bytes2UInt(bs,0));</div> <div>              }</div> <div>       }</div> <div> </div> <div>其次åQŒäØ“(f¨´)了实现收发数据的“全双å·?#8221;åQŒéœ€è¦è®¾è®¡è‡³ž®‘两个线½E‹å¤„理socket的读取和数据包写入。另外,ä¸ÞZº†è‡ªåŠ¨å®žçŽ°å¯ÒŽ(gu¨©)•°æ®é“¾è·¯çš„保持åQŒä»¥å?qi¨¢ng)自动实现数据包重发机å€û|¼Œæˆ‘还增加了一个值守¾U¿ç¨‹åQŒè‡ªåŠ¨å¤„ç†ä»¥ä¸Šé—®é¢˜ã€‚è¯¦¾l†è§åŽä»£ç ã€‚另外,消息中有很多同时间有关的字段åQŒä½†æ˜¯è¿™äº›æ—¶é—´ç›¸å…›_­—ŒDµåƈ非按照统一规格¾~–码的,˜q™ä¸ªéœ€è¦ä»”¾l†ç ”½I¶åè®®æˆ–者实çŽîC»£ç ã€?/div> <div>其三åQŒäØ“(f¨´)了解æž?¾~–码数据包方便,我将SP端涉å?qi¨¢ng)到的消息以¾cȝš„形式实现åQŒæ ¹æ®å…·ä½“的消息¾cÕdž‹åQŒå°†æ•°æ®åŒ…å­—èŠ‚è§£æžè¿˜åŽŸäØ“(f¨´)特定的消息;另一斚w¢åQŒå½“需要发送一些消息时åQŒå°†æ¶ˆæ¯çš„各个字ŒDµï¼Œæ ÒŽ(gu¨©)®¾cÕdž‹å’Œç¼–码类åž?#8220;¾l„装”成字节数¾l„,以便Socket能够发送出厅R€?/div> <div>å…¶å››åQŒäØ“(f¨´)了达到及(qi¨¢ng)时处理短消息的收发,我大量采用了C#事äšg触发来达到消息通知目的åQŒè€Œä¸”åQŒä¹Ÿè®¾è®¡ä¸€¾l„事件参敎ͼŒä¾›äº‹ä»¶çš„具体监听者可以掌握需要的信息ã€?/div> <div>其五åQŒéœ€è¦æ³¨æ„å¤š¾U¿ç¨‹é—´çš„同步问题ã€?/div> <div>å…¶å…­åQŒå¡«å†™C(j¨©)MPP_SUBMIT消息需要注意内容编码、计费字ŒD‰|­£¼‹®å¡«å†?/div> <div> </div> <div>2、事件模åž?/div> <div>大体上实çŽîCº†åå¤šä¸ªäº‹ä»Óž¼Œ˜q™äº›äº‹äšg具体为:(x¨¬)</div> <div>当CMPP_DELIVER消息送来的是短消息送达报告æ—Óž¼Œå‘生消息送达报告事äšgåQ?/div> <div>public delegate void <strong>ReportEventHandler</strong>(object sender, ReportEventArgs e);  <br />       当CMPP_DELIVER消息送来的是用户手机MO短消息时åQŒå‘生短信到达事ä»Óž¼Œå…¶ä»–½E‹åºå¯ä»¥åœ¨å¤„理此事äšg获得消息的正文、手机号码、SP服务åïL(f¨¥ng) ½{‰ä¿¡æ¯ï¼š(x¨¬)</div> <div>public delegate void <strong>SMSEventHandler</strong>(object sender, SMSEventArgs e);   <br />       当ISMG发出CMPP_TERMINATE消息æ—Óž¼Œå‘生åQŒå…·ä½“的回应åQŒæˆ‘在具体实çŽîC¸­å…ˆè‡ªåŠ¨è¿›è¡Œäº†å›žå¤åQŒäñ”生此事äšg仅仅向外部程序(此事件的截取者)表达收到此消息,需要进è¡?#8220;善后清场”操作åQ?/div> <div>       public delegate void <strong>TerminateEventHandler</strong>(object sender,TerminateEventArgs e);   <br />              当SPä¸ÕdЍ¾lˆæ­¢˜qžæŽ¥æ—Óž¼Œå‘出CMPP_TERMINATE消息åQŒISMGä¼?x¨¬)响应CMPP_TERMINATE_RESP消息åQŒæ­¤äº‹äšg表示收到此回åº?/div> <div>       public delegate void <strong>TerminateRespEventHandler</strong>(object sender,TerminateRespEventArgs e);  </div> <div>       以下两个事äšg针对链èµ\保持消息CMPP_ACTIVE_TESTå?qi¨¢ng)CMPP_ACTIVE_TEST_RESP发生åQ?/div> <div>       public delegate void <strong>TestEventHandler</strong>(object sender,TestEventArgs e);</div> <div>       public delegate void <strong>TestRespEventHandler</strong>(object sender,TestRespEventArgs e);<br />       SP发出CMPP_CONNECT消息后,ISMG验证åQŒç„¶åŽå‘出CMPP_CONNECT_RESP消息åQŒæ­¤æ—¶æ¿€‹zÀL­¤äº‹äšgåQ?/div> <div>       public delegate void <strong>ConnectRespEventHandler</strong>(object sender,ConnectRespEventArgs e);</div> <div>       SP取消某条端消息,发出CMPP_CANCEL后,ISMG响应此消息返回CMPP_CANCEL_RESP消息æ—Óž¼Œ‹È€‹zÖMº‹ä»Óž¼š(x¨¬)</div> <div>       public delegate void <strong>CancelRespEventHandler</strong>(object sender,CancelRespEventArgs e);<br />       SP提交短信后,ISMG˜q”回一个CMPP_SUBMIT_RESP 消息åQŒåŒ…å?#8220;收条”(MSG_ID)在内åQŒè§¦å‘此事äšgåQ?/div> <div>       public delegate void <strong>SubmitRespEventHandler</strong>(object sender,SubmitRespEventArgs e);</div> <div>       查询ISMG˜q”回消息后,发生åQ?/div> <div>       public delegate void <strong>QueryRespEventHandler</strong>(object sender,QueryRespEventArgs e);<br />       当SPéªŒè¯é€šè¿‡åŽï¼Œä½œäØ“(f¨´)应用逻辑需要得到通知åQŒæˆ‘ç‰ÒŽ(gu¨©)­¤åŠ äº†æ­¤äº‹ä»Óž¼š(x¨¬)</div> <div>       public delegate void <strong>LogonSuccEventHandler</strong>(object sender,EventArgs e); //当成功登录系¾l?/div> <div>       以下事äšgåQŒä¸æ˜¯åŸºäºŽCMPP消息åQŒè€Œæ˜¯æ ÒŽ(gu¨©)®SP同ISMG消息队列扫描后判断触发事ä»Óž¼š(x¨¬)</div> <div>       public delegate void <strong>SocketClosedEventHandler</strong>(object sender,EventArgs e); //当套接字被检‹¹‹åˆ°å…³é—­</div> <div>       public delegate void <strong>FailedItemDeletedEventHandler</strong>(object sender,WaitingQueueItemEventArgs e); //当一条存在于½{‰å¾…队列的消息超˜q?0¿U’没有回åº?/div> <div>以上˜q™äº›äº‹äšg¾~ºçœå®žçŽ°ä¿è¯äº†SP端CMPP客户对于ISMG的响应自动化åQŒæä¾›è§¦å‘事件保证调用此客户端类的系¾lŸå¯ä»¥é€šè¿‡äº‹äšg发生准确的控制SP端的内部状态,获取交互信息ã€?/div> <div>另一斚w¢åQŒç”±äºŽè¿™äº›å¤§å¤šæ•°äº‹äšg发生于数据包辑ֈ°åŽçš„处理åQŒå®žé™…上需要处理事件程序一定要“˜q…é€?#8221;解决åQŒæˆ–者干脆将消息转换为可以暂存的消息形式åQŒç”±å…¶ä»–½E‹åº˜q›ä¸€æ­¥å¤„理。CMPPçš„SP端要满èƒö大量短信息应用需求,ž®±å¿…™åÖM¸¥æ ¼æŽ§åˆ¶æ¶ˆæ¯äº¤äº’处理逻辑不要太复杂,特别不要设计大量I/O处理åQ›å¦‚果实在要处理åQŒæœ€å¥½é‡‡ç”¨å¼‚步线½E‹çš„æ–¹å¼æ¥å¤„理ã€?/div> <div> </div> <div>3ã€äØ“(f¨´)了提高效率,开äº?个线½E‹ï¼š(x¨¬)</div> <div>       RecvISMGMsgThread   用于处理接收ISMG发送过来的消息åQŒåƈæ ÒŽ(gu¨©)®æ¶ˆæ¯ã€æ¶ˆæ¯è§£æžåŽçš„å­—ŒDµå†…容触发相应的事äšgã€?/div> <div>       SendSPMsgThread        用于处理向ISMG发送数据包。注意,有些消息åQˆè­¬å¦‚CMPP_ACTIVE_TESTåQ‰æ˜¯¾pȝ»Ÿè‡ªå·±äº§ç”Ÿçš„。另外,有些消息是收到ISMG的消息后需要立卛_›žåº”ç»™ISMG的,那么˜q™äº›æ¶ˆæ¯åQŒå…¨éƒ¨è¿›å…¥å†…部维护的消息队列åQˆ_outSeqQueueåQ‰ã€‚该队列ä¼?x¨¬)自动排序消息,所有需要发送的消息åQŒè¿›å…¥æ­¤é˜Ÿåˆ—åQŒæœ¬¾U¿ç¨‹ä¸æ–­ä»Žé˜Ÿåˆ—取出需要发送的消息åQŒè{换成数据包,通过Socket发送到ISMG.</div> <div>       DeamonThread      用于监测数据˜qžæŽ¥socket是否可用åQŒæ˜¯å¦éœ€è¦å‘出维持数据连接的‹¹‹è¯•数据包;有些消息发送过åŽÖMº†åQŒè¿‡äº†åè®®è§„定的旉™—´ä»ç„¶æ²¡æœ‰æ”¶åˆ°RESP消息åQŒé‚£ä¹ˆéœ€è¦å°†æ¶ˆæ¯ä»Žå·²¾lå‘送的队列中提取,重新加入到发送队列中åQŒæŽ’队后½{‰å¾…送出ã€?/div> <div>       可以仔细分析提供的代码,研究其中的具体实现ã€?/div> <div> </div> <div>五、问题小¾l?/div> <div>æ ÒŽ(gu¨©)®è‡ªå·±çš„经验,觉得以下几点对于整个¾pȝ»Ÿå¼€å‘较为重要:(x¨¬)</div> <div>1、一定要正确理解协议ã€?/div> <div>很多¾|‘友交流时候,æ€ÀLŠ±æ€¨åè®®æ»¥åQŒæžä¸å®šåQŒå…¶å®žå¾ˆå¤šåŽŸå› å±žäºŽè‡ªå·±æ²¡æœ‰æ¸…æ¥šç†è§£åè®®ã€‚ä»Žæˆ‘çš„æŽ¥è§¦çš„ç§»åŠ¨ISMG来看åQŒåº”该说实现协议˜q˜æ˜¯å¾ˆä¸¥æ ¼éµå®ˆCMPP的描˜q°ã€‚倒是åQŒä¸€äº›ç½‘友自己开发的模拟器不是很规范åQˆä¸æ˜¯æ‰¹è¯„,郑重声明åQ‰ï¼Œéœ€è¦è‡ªå·±åœ¨å¼€å‘时候引èµäh³¨æ„ã€?/div> <div>2、多¾U¿ç¨‹äº’斥问题ã€?/div> <div>多个¾U¿ç¨‹ä¹‹é—´æ¶‰åŠ(qi¨¢ng)一些队列的操作åQŒéœ€è¦è¿›è¡ŒåŒæ­¥é”å®šï¼Œå¦åˆ™å®ÒŽ(gu¨©)˜“引è“vé—®é¢˜ã€‚å‡ºçŽ°å¼‚å¸æ€¹Ÿéœ€è¦åŠ(qi¨¢ng)æ—¶æ•èŽøP¼Œòq¶çºªå½•作为错误信息参考,便于排除bugã€?/div> <div>3、自己控制数据包‹¹å‘和处理时间ã€?/div> <div>ç”׃ºŽè®¾è®¡ç›®æ ‡æ˜¯é«˜æ€§èƒ½åQŒæ‰€ä»¥åœ¨å¤„理socket数据è¯Õd†™æ—¶å€™è¦æ³¨æ„å¯¹äºŽä¸€äº›äº‹ä»¶å¤„理不要过多消耗系¾lŸèµ„源,避免引è“v数据包来不及(qi¨¢ng)处理而导致数据丢失。特别在数据¾Jå¿™æ—¶åˆ»å¾€å¾€ä¼?x¨¬)ä‹ÉISMG的吞吐性能下降åQŒéœ€è¦è€ƒè™‘对这¿Uæƒ…况下的流量控制。有æ—Óž¼Œä½ ä¸èƒ½å¤ŸæŒ‡æœ›ISMG如你所愿及(qi¨¢ng)时回应你åQŒæ›´ä¸ºå¸¸è§çš„æ˜¯ISMGæ ÒŽ(gu¨©)œ¬ä¸è¿”回RESP¾cÕdž‹çš„æ•°æ®åŒ…。另外,本协议处理数据收发采用阻塞SocketåQŒæœ‰¾|‘å‹å»ø™®®æˆ‘采用异步非é˜Õd¡žSocketåQŒæˆ‘惛_¯èƒ½å¼‚步非é˜Õd¡žSocketä¼?x¨¬)更好ã€?/div> <div>4、服务监控问题ã€?/div> <div>ç”׃ºŽä¸€äº›æ„å¤–,往往ä¼?x¨¬)导致数据连接被中断åQŒè¿™æ˜¯ï¼Œéœ€è¦å¾ç«‹è¶…æ—‰™‡å»ø™¿žæŽ¥çš„æœºåˆ¶ã€‚我¾l™å‡ºçš„ä¾‹å­åÆˆæœªå¾ˆå¥½è§£å†»I¼Œå¸Œæœ›å…¶ä»–方家指正ã€?/div> <div>5、字节顺序问题ã€?/div> <div>˜q™ä¸ªé—®é¢˜åQŒå¯¹äºŽåˆæŽ¥è§¦socket¾~–程的äh士往往造成很大éºÈƒ¦ã€‚不˜q‡ï¼ŒCMPP协议设计的基本数据类型很½Ž€å•,仅需要按照本例子参考即可解冟ë€?/div> <div>6、具体协议应用问题ã€?/div> <div>本例仅仅是一个按照协议要求实现CMPP协议的类åQŒå®Œæ•´çš„SP端方案需要结合自己公司的实际要求åQŒæ”¹é€ æˆ–者重用本例。限于篇òq…,文中仅仅能够列出重点片断åQŒè¯¦¾l†ç»†èŠ‚æ¸…å‚è€ƒä¾›ä¸‹è²çš„ä»£ç ï¼ˆé™„æ³¨é‡Šï¼‰ã€‚æœ¬æ–‡ä»…ä»…æ˜¯é’ˆå¯¹<a >CMPP2.0</a>协议˜q›è¡Œè®¨è®ºå¼€å‘,协议的详情请从移动梦¾|?http://www.monternet.com/moneditor/cs/SP/cmcc/)下蝲。其他技术参考可以到如下处获取,也可察看¾|‘友的脓(chu¨¤ng)字获取进一步详¾l†è¯´æ˜Žï¼š(x¨¬)</div> <div>       天堂鸟交‹¹è®ºå›ï¼ˆ<a >http://www.spzone.net/bbs/index.asp</a>åQ?/div> <div>       CSDN½C‘ÖŒº ¿UÕdЍòq›_°<br />åQˆhttp://community.csdn.net/expert/forum.asp?url=/Expert/ForumsList.asp?roomid=63&typenum=1&whichpage=1åQ?/div> <div>       SP论坛åQˆhttp://www.spforum.net/jishu/Index.aspåQ?/div> <div>如果你发现本人的实例存在问题åQˆæˆ‘想那½Ž€ç›´æ˜¯ä¸€å®šçš„了)åQŒè¯·ä¸åèµæ•™myjobsdk@yahoo.com.cnã€?/div> <div> </div> <div> åŽè®°åQšçŽ°åœ¨CMPP3ã€?也就是移动的MISCòq›_°ç‰ˆæœ¬çš„需要订购关¾pȝ¡®å®šæ‰å¯ä»¥è®¡è´¹ã€‚不˜q‡ä¸æ˜¯æœ¬æ–‡è®¨è®ºçš„重点ã€?/div></div><img src ="http://www.aygfsteel.com/jiangpingcmt1/aggbug/383460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jiangpingcmt1/" target="_blank">火炎ç‚?/a> 2012-07-19 01:46 <a href="http://www.aygfsteel.com/jiangpingcmt1/archive/2012/07/19/383460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>匿名内部¾c»ï¼å›žè°ƒåQé—­åŒ?http://www.aygfsteel.com/jiangpingcmt1/archive/2011/11/24/364741.html火炎ç‚?/dc:creator>火炎ç‚?/author>Thu, 24 Nov 2011 08:44:00 GMThttp://www.aygfsteel.com/jiangpingcmt1/archive/2011/11/24/364741.htmlhttp://www.aygfsteel.com/jiangpingcmt1/comments/364741.htmlhttp://www.aygfsteel.com/jiangpingcmt1/archive/2011/11/24/364741.html#Feedback0http://www.aygfsteel.com/jiangpingcmt1/comments/commentRss/364741.htmlhttp://www.aygfsteel.com/jiangpingcmt1/services/trackbacks/364741.html首先明确闭包的概念:(x¨¬)一个代码段被用来做为方法的参数.
java中没有直接ä‹É用某个方法做为另一个方法的参数的,java使用匿名内部¾cÀL¥æ¨¡æ‹Ÿ˜q™ç§æƒ…况ã€?/p>

匿名内部¾cÕd¾€å¾€æ˜¯åšä¸ÞZ¸€ä¸ªå†…部类åQˆæŽ¥å£ï¼‰çš„具体实现。在一些åã^台类åQˆplatform classåQ‰ä¸­æœ‰ä¸€äº›æ¨¡æ¿æ–¹æ³•。模板方法的包含了固定流½E‹ã€‚其中某些步骤是调用了内部类åQˆæŽ¥å£ï¼‰ä¸­çš„æŸäº›æ–ÒŽ(gu¨©)³•。但是åã^台类ž®†è¿™äº›æ–¹æ³•的具体实现延迟åˆîCº†ä¸šåŠ¡¾cÖM¸­ã€‚业务类调用òq›_°¾cÈš„æ¨¡æ¿æ–ÒŽ(gu¨©)³•åQŒä½†æ˜¯ä¼ å…¥åŒ¿åå†…部类的实现做为模板方法的参数ã€?

½CÞZ¾‹åQ?/p>

 

package callback;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class AnonymousBusinessTemplateExample2 {

// 内部接口也是回调接口åQŒåªå®šä¹‰æŠ½è±¡æ–ÒŽ(gu¨©)³•ã€?/span>
private interface Callback {
Object doIt(Connection conn)
throws SQLException;
}

// 模板æ–ÒŽ(gu¨©)³•åQˆæŠ½è±¡ï¼‰
private Object execute(Callback callback) throws SQLException {
Connection conn
= openConnection();
try {
return callback.doIt(conn);
}
finally {
closeConnection(conn);
}
}

// 业务æ–ÒŽ(gu¨©)³•(具体)
public Object sqlQuery(final String sql) throws SQLException {
//匿名内部¾cÕdšä¸ºæ¨¡æ¿æ–¹æ³•的参数来模拟闭åŒ?/span>
return execute(new Callback() {
public Object doIt(Connection conn) throws SQLException {
return conn.createStatement().executeQuery(sql);
}
});
}

public Connection openConnection() throws SQLException {
return DriverManager.getConnection("", null);
}

public void closeConnection(Connection conn) throws SQLException {
if (conn != null && !conn.isClosed()) {
conn.close();
}
}
}

 

 

 

一般内部接口比内部¾cȝ”¨çš„æ›´å¤šã€‚内部类中的æ–ÒŽ(gu¨©)³•å¯ä»¥æœ‰é»˜è®¤çš„å®žçŽ°ã€‚åŒ¿åå†…éƒ¨ç±»åšäØ“(f¨´)业务æ–ÒŽ(gu¨©)³•的参æ•îC¼ å…¥æ—¶åQŒä¼š(x¨¬)override默认的方æ³?/span>。内部接口的话,没有默认的实现。完全将具体的实çŽîCº¤¾l™äº†åŒ¿åå†…部¾c…R€?/p>

匿名内部¾cÈš„æ€æƒ³æ˜¯å›žè°ƒï¼Œå›_¥½èŒ‰åžåŽŸåˆ™ã€?span style="color: #ff0000">回调的一个好处是decoupleã€?/span> 客户端只需要关心业务(比如匿名内部¾cȝš„具体实现åQ‰è€Œä¸ç”¨å†å…›_¿ƒä¸€äº›èµ„源的˜qžæŽ¥é‡Šæ”¾ä»€ä¹ˆçš„åQŒè¿™äº›äº¤¾l™åã^台类中的模板æ–ÒŽ(gu¨©)³•。ruby的闭包还支持å¯ÒŽ(gu¨©)•°¾l„中的每个元素,文äšg中的每行åQŒç»“果集中的每个记录的操作。而用java实现˜q™æ ·çš?span style="color: #ff0000">˜q­ä»£òq¶æ“ä½œå…¶ä¸­å…ƒç´?/span>非常éºÈƒ¦ã€‚感觉java中用的多的偏模板æ–ÒŽ(gu¨©)³•åQŒå³é€»è¾‘中固定一些流½E‹ï¼Œåˆå§‹åŒ–及(qi¨¢ng)释放某些资源ã€?/p>




动态回调函数、匿名内部类和spring中的excuteæ–ÒŽ(gu¨©)³•

    公司目前采用了spring框架来构建和½Ž¡ç†æ•´ä¸ªweb™å¹ç›®ã€‚对于持久层的处理,使用了由spring框架提供的对hibernate3çš„å°è£…ã€‚è¿™æ ·åšæ— éžæ˜¯äØ“(f¨´)了ä‹É用spring提供的对事务的统一½Ž¡ç†ã€‚当我们用到由spring所ž®è£…çš„hibernate的时候一定会(x¨¬)用到一个类åQšHibernateTemplate.˜q™æ˜¯ä¸€ä¸ªå¯¹æŒä¹…层处理封装的非常完整的类åQŒåŒ…括对session的管理(事实上session的获取于释放是一个ä×o(h¨´)人头疼的问题åQ‰ç­‰½{‰ï¼Œæˆ‘们通常ä¼?x¨¬)ä‹É用HibernateTemplateçš„excuteæ–ÒŽ(gu¨©)³•来进行数据库操作åQˆå³ä½¿æˆ‘们调用的也许是别的类ä¼égºŽfind、get之类的方法,但是实质上最¾lˆè¿˜æ˜¯è{å˜äØ“(f¨´)了调用excuteæ–ÒŽ(gu¨©)³•åQ‰ã€‚对于第一‹Æ¡ä‹É用这个方法一定会(x¨¬)存在困扰。因为excuteæ–ÒŽ(gu¨©)³•所需要的参数一个HibernateCallback¾cÕdž‹çš„参数。而在excuteæ–ÒŽ(gu¨©)³•体内部回调了HibernateCallback¾cÕdž‹çš„doInHibernateæ–ÒŽ(gu¨©)³•ã€‚è¿™æ˜¯ä¸€ä¸ªå…¸åž‹çš„å¯¹è±¡å›žè°ƒã€‚å°±åˆ°ç›®å‰äØ“(f¨´)æ­¢ä¹Ÿè®æ€¸€åˆ‡éƒ½å¾ˆæ¸…晰。但是实际上如果阅读了HibernateTemplate的内部代码就ä¼?x¨¬)发玎ͼŒå¯¹äºŽåƒget、find˜q™æ ·çš„æ–¹æ³•最¾lˆéƒ½å›žè°ƒç”¨excute来完成数据库操作但是调用形式看è“v来却很奇怪:(x¨¬)

public Object get(final Class entityClass, final Serializable id, final LockMode lockMode)

        throws DataAccessException

    {

        return execute(new HibernateCallback() {

            public Object doInHibernate(Session session)

                throws HibernateException

            {

                if(lockMode != null)

                    return session.get(entityClass, id, lockMode);

                else

                    return session.get(entityClass, id);

            }

        }, true);

    }

    Excuteæ–ÒŽ(gu¨©)³•的参数是一¿UåŒ¿åç±»çš„æ–¹å¼ã€‚䨓(f¨´)什么要采用匿名¾cÕd‘¢åQˆä¸½Ž¡æ€Žä¹ˆè¯´åŒ¿åç±»çœ‹è“v来æ€ÀL˜¯è®©äh觉得不舒服)åQŸè¿™ä¸ªåœ°æ–ÒŽ(gu¨©)˜¯å¦å¿…™å»é‡‡ç”¨åŒ¿åç±»å‘¢ï¼Ÿ

    首先我们来想一惌™¿™ŒDµä»£ç æ¶‰å?qi¨¢ng)到几个关键点ï¼?x¨¬)1、回调:(x¨¬)excuteæ–ÒŽ(gu¨©)³•ä¼?x¨¬)回调HibernateCallback¾cÕdž‹çš„doInHibernateæ–ÒŽ(gu¨©)³•åQ?、匿名类参数åQšæˆ‘ä»¬äØ“(f¨´)excuteæ–ÒŽ(gu¨©)³•æä¾›çš„å‚æ•°åÆˆä¸æ˜¯ä¸€ä¸ªçœŸæ­£ç”Ÿå‘½å‡ºæ¥çš„HibernateCallback实例ã€?、动态创建回调方法:(x¨¬)如果我们打开HibernateCallback¾cÕd°±ä¼?x¨¬)发玎ͼŒå…¶å®ž˜q™æ˜¯ä¸€ä¸ªabstract¾cÕdž‹çš„ç±»åQŒè€Œä»–声明了唯一的一个ie抽象æ–ÒŽ(gu¨©)³•ž®±æ˜¯doInHibernate。问题似乎已¾læ˜Žæœ—了åQŒå¦‚果不采用匿名¾c»ï¼Œæˆ‘们需要做的是为HibernateCallback创徏一个实现类åQŒåƈ且实现doInHibernateæ–ÒŽ(gu¨©)³•。但是最要命的问题是doInHibernateæ–ÒŽ(gu¨©)³•的实现对于我们的实际需求来说每一‹Æ¡è°ƒç”¨å¯èƒ½éƒ½æ˜¯ä¸ä¸€æ ïL(f¨¥ng)š„åQˆåœ¨doInHibernateæ–ÒŽ(gu¨©)³•中我们ä‹É用session˜q›è¡Œæ•°æ®åº“操作,对于不同的业务逻辑åQŒæ–¹æ³•实现必定是不一æ ïL(f¨¥ng)š„åQ‰ï¼Œé‡‡ç”¨äº†åŒ¿åç±»æˆ‘们不用在代码重创徏新的¾cÕdž‹åQŒè€Œä¸”可以动态的创徏我们所需要的回调函数ã€?/p>

    æ€È»“一下,我们上面所讲的òq‰™žæ˜¯å¦‚何ä‹É用HibernateTemplate˜q™ä¸ª¾c…R€‚我们得到的¾l“论是:(x¨¬)当我们需要动态的创徏回调函数的时候,匿名内部¾cÀL˜¯ä¸€ä¸ªå¥½çš„æ–¹å¼ã€‚注åQšè¿™¿Uéœ€è¦åŠ¨æ€åˆ›å»ºçš„å›žè°ƒæ–ÒŽ(gu¨©)³•通常是一个interface中的接口或者abstract class中的抽象æ–ÒŽ(gu¨©)³•ã€?/p>




]]>
mina¾_˜åŒ…、多包和ž®‘包的解å†Ïx–¹æ³?http://www.aygfsteel.com/jiangpingcmt1/archive/2011/09/14/358594.html火炎ç‚?/dc:creator>火炎ç‚?/author>Wed, 14 Sep 2011 04:38:00 GMThttp://www.aygfsteel.com/jiangpingcmt1/archive/2011/09/14/358594.htmlhttp://www.aygfsteel.com/jiangpingcmt1/comments/358594.htmlhttp://www.aygfsteel.com/jiangpingcmt1/archive/2011/09/14/358594.html#Feedback0http://www.aygfsteel.com/jiangpingcmt1/comments/commentRss/358594.htmlhttp://www.aygfsteel.com/jiangpingcmt1/services/trackbacks/358594.html
不懈努力åQŒç»ˆäºŽè§£å†³äº†ã€‚原来解å†Ïx–¹æ³•是那样的简单。废话少è¯ß_(d¨¢)¼Œè¯ïL(f¨¥ng)œ‹åˆ—子ã€?
  
   另外å»ÞZº†ä¸€ä¸ªäº¤‹¹ç¾¤åQ?9702042åQŒå¤§å®¶å¯ä»¥åœ¨¾U¿äº¤‹¹?

   问题åQšæˆ‘å‘é€çš„æ˜¯xml字符串数据,在发送数据后åQŒæŽ¥æ”¶æ–¹åœ¨è§£ç çš„æ—¶å€™å¯èƒ½æŽ¥åˆ?条,也可能是多条åQŒè¿˜

可能是半条或一条半åQŒè§£å†Ïx–¹æ³•就是ä‹É用CumulativeProtocolDecoder

   首先åQŒåœ¨¾~–码的时候要把前4位设成标志位åQŒæ ‡å¿—消息内容的长度。里面的重点是doDecode的返回å€û|¼Œä¸€

定要¾l§æ‰¿CumulativeProtocolDecoder 哦ã€?

   清看decode的写法:(x¨¬)
Java代码 复制代码 æ”¶è—ä»£ç 
  1. public class AsResponseDecoder extends CumulativeProtocolDecoder {   
  2.     private static Logger LOG = LoggerFactory.getLogger(AsResponseDecoder.class);   
  3.     private final Charset charset;   
  4.        
  5.     public AsResponseDecoder(Charset charset){   
  6.         this.charset = charset;   
  7.     }   
  8.        
  9.   
  10.     /**  
  11.      * ˜q™ä¸ªæ–ÒŽ(gu¨©)³•的返回值是重点åQ? 
  12.      * 1、当内容刚好æ—Óž¼Œ˜q”回falseåQŒå‘ŠçŸ¥çˆ¶¾cÀLŽ¥æ”¶ä¸‹ä¸€æ‰¹å†…å®? 
  13.      * 2、内容不够时需要下一批发˜q‡æ¥çš„内容,此时˜q”回falseåQŒè¿™æ ïL(f¨¥ng)ˆ¶¾c? 
  14.  
  15. CumulativeProtocolDecoder  
  16.      *    ä¼?x¨¬)将内容放进IoSession中,½{‰ä¸‹‹Æ¡æ¥æ•°æ®åŽå°±è‡ªåŠ¨æ‹ÆD£…再交¾l™æœ¬¾cȝš„doDecode  
  17.      * 3、当内容多时åQŒè¿”回trueåQŒå› ä¸ºéœ€è¦å†ž®†æœ¬æ‰ÒŽ(gu¨©)•°æ®è¿›è¡Œè¯»å–,父类ä¼?x¨¬)将剩余的数据再‹Æ¡æŽ¨é€æœ¬  
  18.  
  19. ¾cȝš„doDecode  
  20.      */  
  21.     public boolean doDecode(IoSession session, IoBuffer in,   
  22.             ProtocolDecoderOutput out) throws Exception {   
  23.            
  24.         CharsetDecoder cd = charset.newDecoder();   
  25.         if(in.remaining() > 0){//有数据时åQŒè¯»å?字节判断消息长度   
  26.             byte [] sizeBytes = new byte[4];   
  27.             in.mark();//标记当前位置åQŒä»¥ä¾¿reset   
  28.             in.get(sizeBytes);//è¯Õd–å‰?字节   
  29.                         //NumberUtil是自己写的一个int转byte[]的一个工å…ïL(f¨¥ng)±»   
  30.             int size = NumberUtil.byteArrayToInt(sizeBytes);   
  31.             //如果消息内容的长度不够则直接˜q”回true   
  32.             if(size > in.remaining()){//如果消息内容不够åQŒåˆ™é‡ç½®åQŒç›¸å½“于不读取size   
  33.                 in.reset();   
  34.                 return false;//接收新数据,以拼凑成完整数据   
  35.             } else{   
  36.                 byte[] bytes = new byte[size];    
  37.                 in.get(bytes, 0, size);   
  38.                 String xmlStr = new String(bytes,"UTF-8");   
  39.                 System.out.println("------------"+xmlStr);   
  40.                 if(null != xmlStr && xmlStr.length() > 0){   
  41.                     AsResponse resCmd = new AsResponse();   
  42.                     AsXmlPacker.parse(resCmd, xmlStr);   
  43.                     if(resCmd != null){   
  44.                         out.write(resCmd);   
  45.                     }   
  46.                 }   
  47.                 if(in.remaining() > 0){//如果è¯Õd–内容后还¾_˜äº†åŒ…,ž®Þp®©çˆ¶ç±»å†ç»™ä¿?  
  48.   
  49. 一‹Æ¡ï¼Œ˜q›è¡Œä¸‹ä¸€‹Æ¡è§£æž?  
  50.                     return true;   
  51.                 }   
  52.             }   
  53.         }   
  54.         return false;//处理成功åQŒè®©çˆ¶ç±»˜q›è¡ŒæŽ¥æ”¶ä¸‹ä¸ªåŒ?  
  55.     }   
  56.   
  57.   
  58. }  

下面附上Encode¾c?
Java代码 复制代码 æ”¶è—ä»£ç 
  1. public class AsResponseEncoder extends ProtocolEncoderAdapter {   
  2.     private final Charset charset;   
  3.        
  4.     public AsResponseEncoder(Charset charset){   
  5.         this.charset = charset;   
  6.     }   
  7.        
  8.     public void encode(IoSession session, Object message,   
  9.         ProtocolEncoderOutput out) throws Exception {   
  10.         CharsetEncoder ce = charset.newEncoder();   
  11.         IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true);   
  12.            
  13.         AsResponse respCmd = (AsResponse) message;   
  14.            
  15.         String xml = AsXmlPacker.pack(respCmd);//ž®†å¯¹è±¡è{成xml   
  16.         byte[] bytes = xml.getBytes();   
  17.         byte[] sizeBytes = NumberUtil.intToByteArray(bytes.length);   
  18.            
  19.         buffer.put(sizeBytes);//ž®†å‰4位设¾|®æˆæ•°æ®ä½“的字节长度   
  20.         buffer.put(bytes);//消息内容   
  21.         buffer.flip();   
  22.         out.write(buffer);   
  23.     }   
  24.   
  25.   
  26. }  

    JDK   ByteBuffer

     

    属性:(x¨¬)

    Mark

    上次position的快�/span>

    Position

    当前è¯Õd†™ç´¢å¼•未知

    Limit

    ¾~“冲区限åˆ?/p>

    Capacity

    ¾~“å†²åŒø™ƒ½åŠ?/p>

    Offset

    偏移�/p>

     

    说明åQ?/p>

    • Position(Mark)<=limit<=capacity
    • å½?/span>position==limit时就没有字节可读写了
    • 每次getæˆ?/span>put都将增加position
    • 重置markž®±æ˜¯è®„¡½®mark=-1

     

     

    æ–ÒŽ(gu¨©)³•åQ?/p>

    Limit(int)

    如果position>limit, position = limit,如果mark>limit, 重置mark

    Mark()

    取当前的position的快�/span>标记mark

    Reset()

    恢复position到先前标记的mark

    Clear()

    limit=capacity , position=0,重置mark,但是不清½Iºæ•°æ®ï¼Œä¸ÞZº†ä»Žå¤´å¼€å§?/span>put做准备,其实ž®±æ˜¯æ¸…空数据åQŒå› ä¸ÞZ½ putž®Þp¦†ç›–了原来的数æ?/span>

    Rewind()

    position=0,重置mark,一¾pÕdˆ—写操作后åQŒäØ“(f¨´)了从头开å§?/span>get做准备,å’?/span>clear()有用途上的区别,他大部分是用来从头开始读取,è€?/span>clear是大部分用来重头开始填充,ž®±æ˜¯æ¸…理的意æ€?/span>

    Flip()

    limit=position , position=0,重置maskåQŒäØ“(f¨´)了将buf写出做好准备åQŒä¸€èˆ¬æ˜¯¾l“束buf操作åQŒå°†buf写入输出‹¹æ—¶è°ƒç”¨åQŒè¿™ä¸ªå¿…™å»è¦è°ƒç”¨åQŒå¦åˆ™æžæœ‰å¯èƒ?/span>position!=limitåQŒå¯¼è‡?/span>position后面没有数据åQŒæ¯‹Æ¡å†™å…¥æ•°æ®åˆ°è¾“出‹¹æ—¶åQŒå¿…™åȝ¡®ä¿?/span>position=limitã€?/span>

    Remaining()

    ˜q”回limit-position,˜q”回¾~“冲器中的剩余字èŠ?/span>

    Wrap(byte[])

    ¾l„装到新çš?/span>bufferåQ?/span>capacity=limit=byte[].lengthåQ?/span>position=0 é‡ç½®mark

    Slice()

    分割¾~“冲器,ž®?/span>remaining的空间åŞ成一个新çš?/span>bufferåQŒæ–°çš?/span>position=0åQ?/span>limit=capacity=remainingåQŒé‡¾|?/span>markåQŒå’Œä¸È¼“冲区内容å…׃ínåQŒå…¶å®ƒéƒ½ç‹¬ç«‹

    Duplicate()

    复制¾~“冲区,内容å…׃ínåQŒå…¶å®ƒéƒ½ç‹¬ç«‹

    asReadOnlyBuffer()

    å’Œduplicateä¸€æ øP¼Œåªæ˜¯ä¸å¯å†?/p>

    Compact()

    ž®?/span>positionå’?/span>limit之间的字节移到最前面åQ?/span>position=limit-positionåQŒè¿™ž®±æ˜¯˜q™é‡Œçš„压¾~©çš„æ„æ€ï¼Œä¸€èˆ¬æ˜¯¾l“束buf操作åQŒå°†buf写入输出‹¹æ—¶è°ƒç”¨

    Position(int)

    position=newPosition,如果position<mark,重置mark

    Remaining()

    ˜q”回positionå’?/span>limit之间的字节数

 

 

JDK ByteBuffer

Mina IoBuffer

动态扩�/span>capacity

�/p>

�/p>

支持Stringè¯Õd†™

�/p>

�/p>

¾U¿ç¨‹å®‰å…¨

�/p>

�/p>

可主动释攄¡¼“冲区占用内存

�/p>

�/p>



]]>
oracle sql 4åˆ?/title><link>http://www.aygfsteel.com/jiangpingcmt1/archive/2011/06/27/353044.html</link><dc:creator>火炎ç‚?/dc:creator><author>火炎ç‚?/author><pubDate>Sun, 26 Jun 2011 16:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/jiangpingcmt1/archive/2011/06/27/353044.html</guid><wfw:comment>http://www.aygfsteel.com/jiangpingcmt1/comments/353044.html</wfw:comment><comments>http://www.aygfsteel.com/jiangpingcmt1/archive/2011/06/27/353044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jiangpingcmt1/comments/commentRss/353044.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jiangpingcmt1/services/trackbacks/353044.html</trackback:ping><description><![CDATA[<ul><li><font size="2" face="Arial">如果存在ž®±æ›´æ–ŽÍ¼Œä¸å­˜åœ¨å°±æ’入用一个语句实çŽ?/font> </li></ul> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font face="Arial"><font size="2"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> <span style="color: #000000">MERGE </span> <span style="color: #0000ff">INTO</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> t_mg a<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" />USING (</span> <span style="color: #0000ff">SELECT</span> <span style="color: #000000"> </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">the code</span> <span style="color: #ff0000">'</span> <span style="color: #000000"> code, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">the name</span> <span style="color: #ff0000">'</span> <span style="color: #000000"> NAME </span> <span style="color: #0000ff">FROM</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> dual) b<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">ON</span> <span style="color: #000000"> (a.code </span> <span style="color: #808080">=</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> b.code)<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">WHEN</span> <span style="color: #000000"> MATCHED </span> <span style="color: #0000ff">THEN</span> </font></font><span style="color: #000000"><br /><font size="2" face="Arial"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> </font></span><font face="Arial"><font size="2"><span style="color: #0000ff">UPDATE</span> <span style="color: #000000"> </span> <span style="color: #0000ff">SET</span> <span style="color: #000000"> a.NAME </span> <span style="color: #808080">=</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> b.NAME<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">WHEN</span> <span style="color: #000000"> </span> <span style="color: #808080">NOT</span> <span style="color: #000000"> MATCHED </span> <span style="color: #0000ff">THEN</span> </font></font><span style="color: #000000"><br /><font size="2" face="Arial"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> </font></span><font face="Arial"><font size="2"><span style="color: #0000ff">INSERT</span> <span style="color: #000000"> (code, NAME) </span> <span style="color: #0000ff">VALUES</span> <span style="color: #000000"> (b.code, b.NAME);</span> </font></font></div> <ul><li><font size="2" face="Arial">分页½Ž—法 </font></li></ul> <p><font size="2" face="Arial"></font></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font face="Arial"><font size="2"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> <span style="color: #0000ff">SELECT</span> <span style="color: #000000"> </span> <span style="color: #808080">*</span> </font></font><span style="color: #000000"><br /><font size="2" face="Arial"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> </font></span><font face="Arial"><font size="2"><span style="color: #0000ff">FROM</span> <span style="color: #000000"> (</span> <span style="color: #0000ff">SELECT</span> <span style="color: #000000"> a.</span> <span style="color: #808080">*</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000">, ROWNUM rn<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">FROM</span> <span style="color: #000000"> (</span> <span style="color: #0000ff">SELECT</span> <span style="color: #000000"> </span> <span style="color: #808080">*</span> <span style="color: #000000"> </span> <span style="color: #0000ff">FROM</span> <span style="color: #000000"> t_employees </span> <span style="color: #0000ff">ORDER</span> <span style="color: #000000"> </span> <span style="color: #0000ff">BY</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> first_name) a<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">WHERE</span> <span style="color: #000000"> ROWNUM </span> <span style="color: #808080"><=</span> <span style="color: #000000"> </span> <span style="color: #800000; font-weight: bold">500</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000">)<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">WHERE</span> <span style="color: #000000"> rn </span> <span style="color: #808080">></span> <span style="color: #000000"> </span> <span style="color: #800000; font-weight: bold">480</span> <span style="color: #000000"> ;</span> </font></font></div> <p><font size="2" face="Arial"></font></p> <ul><li><font size="2" face="Arial">抽取/删除重复记录</font> </li></ul> <p><strong><font size="2" face="Arial">1) 部分字段重复数据的删é™?/font> </strong></p> <p><font size="2" face="Arial"></font></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font face="Arial"><font size="2"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> <span style="color: #0000ff">delete</span> <span style="color: #000000"> </span> <span style="color: #0000ff">from</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> è¡¨å a <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">where</span> <span style="color: #000000"> a.rowid </span> <span style="color: #808080">!=</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" />(<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">select</span> <span style="color: #000000"> </span> <span style="color: #ff00ff">max</span> <span style="color: #000000">(b.rowid) </span> <span style="color: #0000ff">from</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> è¡¨å b <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">where</span> <span style="color: #000000"> a.字段1 </span> <span style="color: #808080">=</span> <span style="color: #000000"> b.字段1 </span> <span style="color: #808080">and</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" />a.字段2 </span> <span style="color: #808080">=</span> </font></font><span style="color: #000000"><font size="2" face="Arial"> b.字段2 <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" />)</font> </span></div> <p><font size="2" face="Arial">上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中åQŒç„¶åŽåˆ é™¤çš„æ—¶å€™åœ¨˜q›è¡Œæ¯”较ã€?br /></font></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font face="Arial"><font size="2"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> <span style="color: #0000ff">create</span> <span style="color: #000000"> </span> <span style="color: #0000ff">table</span> <span style="color: #000000"> ä¸´æ—¶è¡?nbsp;</span> <span style="color: #0000ff">as</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">select</span> <span style="color: #000000"> a.字段1,a.字段2,</span> <span style="color: #ff00ff">MAX</span> <span style="color: #000000">(a.ROWID) dataid </span> <span style="color: #0000ff">from</span> <span style="color: #000000"> æ­£å¼è¡?nbsp;a </span> <span style="color: #0000ff">GROUP</span> <span style="color: #000000"> </span> <span style="color: #0000ff">BY</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> a.字段1,a.字段2;<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">delete</span> <span style="color: #000000"> </span> <span style="color: #0000ff">from</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> è¡¨å a <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">where</span> <span style="color: #000000"> a.rowid </span> <span style="color: #808080">!=</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" />(<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">select</span> <span style="color: #000000"> b.dataid </span> <span style="color: #0000ff">from</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> ä¸´æ—¶è¡?nbsp;b <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">where</span> <span style="color: #000000"> a.字段1 </span> <span style="color: #808080">=</span> <span style="color: #000000"> b.字段1 </span> <span style="color: #808080">and</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" />a.字段2 </span> <span style="color: #808080">=</span> </font></font><span style="color: #000000"><font size="2" face="Arial"> b.字段2 <br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" />)</font> </span></div> <p><strong><font size="2" face="Arial">2) 完全重复记录的删é™?/font> </strong></p> <p><font size="2" face="Arial">用下面语句获取到åŽÀLŽ‰é‡å¤æ•°æ®åŽçš„è®°å½•åQ?/font> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font face="Arial"><font size="2"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> <span style="color: #0000ff">select</span> <span style="color: #000000"> </span> <span style="color: #0000ff">distinct</span> <span style="color: #000000"> </span> <span style="color: #808080">*</span> <span style="color: #000000"> </span> <span style="color: #0000ff">from</span> <span style="color: #000000"> è¡¨å</span> </font></font></div> <p><font size="2" face="Arial">可以ž®†æŸ¥è¯¢çš„记录攑ֈ°ä¸´æ—¶è¡¨ä¸­åQŒç„¶åŽå†ž®†åŽŸæ¥çš„è¡¨è®°å½•åˆ é™¤ï¼Œæœ€åŽå°†ä¸´æ—¶è¡¨çš„æ•°æ®å¯¼å›žåŽŸæ¥çš„è¡¨ä¸­ã€‚å¦‚ä¸‹ï¼š(x¨¬)</font> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font face="Arial"><font size="2"><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /> <span style="color: #0000ff">CREATE</span> <span style="color: #000000"> </span> <span style="color: #0000ff">TABLE</span> <span style="color: #000000"> ä¸´æ—¶è¡?nbsp;</span> <span style="color: #0000ff">AS</span> <span style="color: #000000"> (</span> <span style="color: #0000ff">select</span> <span style="color: #000000"> </span> <span style="color: #0000ff">distinct</span> <span style="color: #000000"> </span> <span style="color: #808080">*</span> <span style="color: #000000"> </span> <span style="color: #0000ff">from</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> è¡¨å);<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">drop</span> <span style="color: #000000"> </span> <span style="color: #0000ff">table</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> æ­£å¼è¡?<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">insert</span> <span style="color: #000000"> </span> <span style="color: #0000ff">into</span> <span style="color: #000000"> æ­£å¼è¡?nbsp;(</span> <span style="color: #0000ff">select</span> <span style="color: #000000"> </span> <span style="color: #808080">*</span> <span style="color: #000000"> </span> <span style="color: #0000ff">from</span> </font></font><font face="Arial"><font size="2"><span style="color: #000000"> ä¸´æ—¶è¡?;<br /><img alt="" align="top" src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" /></span> <span style="color: #0000ff">drop</span> <span style="color: #000000"> </span> <span style="color: #0000ff">table</span> <span style="color: #000000"> ä¸´æ—¶è¡?</span> </font></font></div><font size="2"><br />执行上记SQL语句,可以查寻到数据库中的锁的情报.</font><br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><font size="2"><span style="color: #0000ff">SELECT</span> <span style="color: #000000">  S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, </span> <span style="color: #800000; font-weight: bold">0</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">None</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">1</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Null</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">2</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Row-S (SS)</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">3</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Row-X (SX)</span> <span style="color: #ff0000">'</span> <span style="color: #000000">,  </span> <span style="color: #800000; font-weight: bold">4</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Share</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">5</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">S/Row-X (SSX)</span> <span style="color: #ff0000">'</span> <span style="color: #000000">,  </span> <span style="color: #800000; font-weight: bold">6</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Exclusive</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, </span> <span style="color: #800000; font-weight: bold">0</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">None</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">1</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Null</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">2</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Row-S (SS)</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">3</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Row-X (SX)</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">4</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Share</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">5</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">S/Row-X (SSX)</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, </span> <span style="color: #800000; font-weight: bold">6</span> <span style="color: #000000">, </span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">Exclusive</span> <span style="color: #ff0000">'</span> <span style="color: #000000">, TO_CHAR(REQUEST)) MODE_REQUESTED, O.OWNER</span> <span style="color: #808080">||</span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">.</span> <span style="color: #ff0000">'</span> <span style="color: #808080">||</span> <span style="color: #000000">O.</span> <span style="color: #ff00ff">OBJECT_NAME</span> <span style="color: #808080">||</span> <span style="color: #ff0000">'</span> <span style="color: #ff0000"> (</span> <span style="color: #ff0000">'</span> <span style="color: #808080">||</span> <span style="color: #000000">O.OBJECT_TYPE</span> <span style="color: #808080">||</span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">)</span> <span style="color: #ff0000">'</span> </font><font size="2"><span style="color: #000000">, S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2 <br /></span><span style="color: #0000ff">FROM</span> </font><font size="2"><span style="color: #000000"> V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S <br /></span><span style="color: #0000ff">WHERE</span> <span style="color: #000000"> L.SID </span> <span style="color: #808080">=</span> <span style="color: #000000"> S.SID </span> <span style="color: #808080">AND</span> <span style="color: #000000">  L.ID1 </span> <span style="color: #808080">=</span> <span style="color: #000000"> O.</span> <span style="color: #ff00ff">OBJECT_ID</span> </font></div><font size="2">SESSION_ID, USERNAME,  MODE_HELD,  MODE_REQUESTED, OBJECT_NAME, LOCK_TYPE, LOCK_ID<br />分别æ˜?拥有锁的SESSION_ID,拥有锁的USERNAME,锁的执行模式MODE_HELD,锁的è¯äh±‚MODE_REQUESTED,锁所在的数据库对象名<br />,锁的¾cÕdž‹,锁的ID<br /></font> <img src ="http://www.aygfsteel.com/jiangpingcmt1/aggbug/353044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jiangpingcmt1/" target="_blank">火炎ç‚?/a> 2011-06-27 00:31 <a href="http://www.aygfsteel.com/jiangpingcmt1/archive/2011/06/27/353044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">ÓñÌïÏØ</a>| <a href="http://" target="_blank">ÕòÔ¶ÏØ</a>| <a href="http://" target="_blank">¸»Æ½ÏØ</a>| <a href="http://" target="_blank">æÄÔ´ÏØ</a>| <a href="http://" target="_blank">ѰÎÚÏØ</a>| <a href="http://" target="_blank">ÐìÖÝÊÐ</a>| <a href="http://" target="_blank">ÀúÊ·</a>| <a href="http://" target="_blank">µËÖÝÊÐ</a>| <a href="http://" target="_blank">¸£º£ÏØ</a>| <a href="http://" target="_blank">½úÖÐÊÐ</a>| <a href="http://" target="_blank">¶¨Ô¶ÏØ</a>| <a href="http://" target="_blank">½¨ê±ÊÐ</a>| <a href="http://" target="_blank">°åÇÅÊÐ</a>| <a href="http://" target="_blank">Ñô´ºÊÐ</a>| <a href="http://" target="_blank">ÇåÐìÏØ</a>| <a href="http://" target="_blank">·ïÑôÏØ</a>| <a href="http://" target="_blank">ÎåºÓÏØ</a>| <a href="http://" target="_blank">Ë«ÁÉÊÐ</a>| <a href="http://" target="_blank">ÓÀ¿µÊÐ</a>| <a href="http://" target="_blank">Ë®³ÇÏØ</a>| <a href="http://" target="_blank">¹ã×ÚÏØ</a>| <a href="http://" target="_blank">À¼Î÷ÏØ</a>| <a href="http://" target="_blank">ÄÏ»ãÇø</a>| <a href="http://" target="_blank">ÏÌ·áÏØ</a>| <a href="http://" target="_blank">ºù«µºÊÐ</a>| <a href="http://" target="_blank">À¼ÏªÊÐ</a>| <a href="http://" target="_blank">×ÊÑôÊÐ</a>| <a href="http://" target="_blank">ĪÁ¦</a>| <a href="http://" target="_blank">À¥É½ÊÐ</a>| <a href="http://" target="_blank">¸ö¾ÉÊÐ</a>| <a href="http://" target="_blank">ÂÛ̳</a>| <a href="http://" target="_blank">ÎߺþÏØ</a>| <a href="http://" target="_blank">¶õÖÝÊÐ</a>| <a href="http://" target="_blank">ÎͰ²ÏØ</a>| <a href="http://" target="_blank">ξÀçÏØ</a>| <a href="http://" target="_blank">ͳ·¬ÊÐ</a>| <a href="http://" target="_blank">³±°²ÏØ</a>| <a href="http://" target="_blank">ÓÀÈÊÏØ</a>| <a href="http://" target="_blank">ÂÀÁºÊÐ</a>| <a href="http://" target="_blank">ÆÕÍÓÇø</a>| <a href="http://" target="_blank">ÇåÁ÷ÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>