﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-自然-文章分类-java glossary</title><link>http://www.blogjava.net/masen/category/21361.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 10 Jun 2010 20:10:32 GMT</lastBuildDate><pubDate>Thu, 10 Jun 2010 20:10:32 GMT</pubDate><ttl>60</ttl><item><title>PHPRPC</title><link>http://www.blogjava.net/masen/articles/323232.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Thu, 10 Jun 2010 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/323232.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/323232.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/323232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/323232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/323232.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed; width: 730px; font-family: Arial; font-size: 12px; line-height: 18px; ">
    <tbody>
        <tr>
            <td style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 18px; ">
            <div id="blog_text" class="cnt" style="font-family: Arial; word-wrap: break-word; word-break: normal; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 14px; line-height: 20px; color: #000000; overflow-x: hidden; overflow-y: hidden; position: static; "><span class="hilite2" style="line-height: normal; ">PHPRPC:</span>&nbsp;是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误 处理的、支持会话的、面向服务的高性能远程过程调用协议。</div>
            <div id="blog_text" class="cnt" style="word-wrap: break-word; word-break: normal; visibility: visible !important; zoom: 1 !important; filter: none; overflow-x: hidden; overflow-y: hidden; position: static; "><font  size="4"><span  style="font-size: 14px; line-height: 20px;">官方网站 ： http://www.phprpc.org/zh_CN/</span></font></div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/masen/aggbug/323232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2010-06-10 14:49 <a href="http://www.blogjava.net/masen/articles/323232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WBS</title><link>http://www.blogjava.net/masen/articles/287533.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Mon, 20 Jul 2009 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/287533.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/287533.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/287533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/287533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/287533.html</trackback:ping><description><![CDATA[<div>　　既然没有WBS，就没有项目管理，如何制定正确的WBS就成为项目经理管理项目的核心了。每个项目管理比较成熟的公司，针对不同类型的项目都有一定的WBS的模版，供项目经理参考。对于复杂的大项目，IBM公司建议的WBS制作流程如下：</div>
<div>　　1、制定工作产品清单(PL)。工作产品(Working Product)是项目需要产出的工作结果，可以是项目最终交付成果的组成部分，也可以是项目中间过程的产出结果。以软件开发为例，软件中的用户管理模块是最中软件产品的一部分，软件的需求分析文档是软床过程中的文件，都是软件开发这个项目的工作产品。工作产品有大有小，有的相互关联，有隶属的关系。列出工作产品清单的过程，可以是头脑风暴的方法，项目组共同完成。</div>
<div>　　2、制定工作产品分解结构(PBS)。工作产品大大小小列出了很多，大型项目有几百项，几千项。工作这些工作产品的属性和关系，用结构化的方法组织这些工作产品，形成一个自顶向下的逐级细分的工作产品分解结构(PBS：Product Breakdown Structure)。这就是制造业内的产品物料表(BOM)，说明一个产品有多少个零件组成。</div>
<div>　　3、制定工作任务分解结构(WBS)。有了PBS，只要把获得工作产品的任务明确，就可用根据PBS的结构，得到WBS了。注意同样的PBS，可用有不同的WBS，因为获得同样工作产品的任务可以是不同的。例如软件开发中的用户管理模块，是PBS中的工作产品，对于到WBS中，可以是不同的任务，一种是采购一个用户管理模块，另一种可以是项目小组开发一个用户管理模块。</div>
<div>　　4、制定组织分解结构(OBS)。WBS中的任务确定了，完成任务的责任人也就可以明确了。因此由WBS则可以形成整个项目的组织分解结构，由那些人来完成项目的任务，得到工作产品，并完成项目。</div>
<div>　　其中的关键是分解的结构，PBS、WBS和OBS是同一个结构，只是从不同的角度来阐述这个结构。关于这个结构的分解方法，常用的有组件分解方法和过程分解方法。典型的组件方法就是制造业中把一个完整的产品，逐级分解到零件。典型的过程分解方法可以是软件开发从需求到设计、编码、测试的一个过程。项目分解中，这两种方法往往交替使用，其最终是把项目分解到一个个具体和细小的工作任务。</div>
<div>　　结构化，是WBS的另一特点，是为了对任务进行管理。&nbsp;</div>
<img src ="http://www.blogjava.net/masen/aggbug/287533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2009-07-20 21:57 <a href="http://www.blogjava.net/masen/articles/287533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGI</title><link>http://www.blogjava.net/masen/articles/172132.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Wed, 02 Jan 2008 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/172132.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/172132.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/172132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/172132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/172132.html</trackback:ping><description><![CDATA[OSGi规范介绍 <br />
<br />
第一章 引言 <br />
OSGi（Open Service Gateway Initiative）最初的目的就是为各种嵌入式设备提供通用的软件运行平台，即可以屏蔽设备操作系统与硬件区别的中间件平台。PC基本上被 Wintel架构垄断，运行在PC上的应用程序完全可以在另一台PC上运行；但对于其他设备来说就不同，它们的硬件平台可能完全不同，其操作系统也是来自不同厂商，所以任何设备上的应用程序都需要定制，于是就产生了对中间件平台的需求。 <br />
OSGi并不是专为家庭网络而制定的，除了住宅网关，像车载电脑等其他移动嵌入式设备也都可以通过OSGi接入Internet，获取不同的应用服务。它为服务供应商、软件供应商、网关开发人员以及设备供应商提供了一个开放、通用的架构，使它们能互动地开发、部署和管理服务。其软件环境基于Sun的 JAVA虚拟机，并不涉及具体的连接协议。对于任何新设备，它都能够灵活地将其纳入现有网络。可以使用OSGi的对象包括各种数字和模拟的机顶盒、服务网关、有线电视电缆调制解调器、消费类电子产品、PC、工业计算机、汽车等。 <br />
因为OSGi基于JAVA技术，而JAVA最大的好处就是平台无关性。在不同类型的住宅网关设备上都可以实现OSGi软件。而且OSGi规范可以与各种设备访问标准桥接（如图1所示），比如遵循OSGi的系统可以很好地部署和管理Jini服务，它可以提供Jini设备与服务提供商之间的交互。对于像 HAVi、UPnP等基于非JAVA技术的标准和规范，OSGi也可以提供与它们沟通的桥梁。 <br />
<br />
第二章 OSGi规范介绍 <br />
2.1 OSGi规范的体系结构 <br />
在OSGi规范中提供了一个参考的体系架构[1]，也基本上体现了OSGi的设计初衷。 <br />
OSGi的体系架构是基于这样一个模型的：经营者管理着一个潜在的巨大的服务网络平台。OSGi规范假设这个服务平台是完全被这个经营者控制，并且经营者使用该服务平台去运行来自不同服务提供者提供的服务。然而这只是一个场景，还有其他模型，例如PC机的部署，工业应用（如，移动电话基站是一个管理中心完全控制着各个方面），中间件模型等。OSGi最广泛的应用是在网络化的服务。除了参考模型之外，规范之中还提到了其他的一些模型。请参考OSGi 3.0规范[1]。 <br />
2.1.1 OSGi参考体系架构的特点 <br />
1． 商业驱动：经营者的观点驱动OSGi的体系架构。 <br />
2． 完美：体系架构必须是足够完善和详细的，以致允许开发商生产出健壮的产品。 <br />
3． 不受限的：由于经营者所操作的服务平台在性能和网络环境的变化是非常大的。 <br />
4． 开放：标准不是为一个具体的系统而设计的，OSGi参考体系架构必须考虑和支持许多不同的场景。 <br />
2.1.2 OSGi参考体系架构所涉及到实体 <br />
1. 服务平台：一个JAVA虚拟机的实例，一个OSGi框架结构，和运行着的服务包的集合。 <br />
2. 服务平台服务器(SPS)：驻留一个或多个服务平台的硬件。 <br />
3. 运营商：掌控许多服务平台的组织。 <br />
4. 服务应用：一套软件包，文档和支撑软件所组合起来的应用，这些应用向终端用户提供服务。 <br />
5. 服务用户：获取服务应用服务的用户。 <br />
6. 服务提供者：开发服务应用并且通过服务部署管理器部署到服务平台上。 <br />
7. 服务部署管理器：部署和部分管理一个或多个服务提供者提供的服务应用。 <br />
8. 服务运行支持：支撑软件和硬件，它们并不驻留在服务平台服务器上，但是在运行服务应用时需要它们。 <br />
9. 服务集成者：负责确保来自不同服务提供者的服务应用的集成。 <br />
10. 服务开发者：开发服务应用。 <br />
11. 制造商：制造服务平台服务器 <br />
12. 拥有者：服务平台服务器拥有者。 <br />
13. 收费提供者：接受帐户信息，并且提供统一的帐单给服务消费者。 <br />
14. 网络提供者：提供服务平台的网络链接。 <br />
15. 证书授权：管理证书的组织，这些证书被用来鉴别系统，个人和组织。 <br />
首先是制造商制造服务平台服务器，拥有者从制造商处购买服务平台服务器，网络提供商提供服务平台服务器和互联网的接入。服务平台的运营商使用网路提供者的接入基础件接入服务平台服务器，同时服务平台经营者控制着一个或多个运行在服务平台服务器的服务平台。另一方面，服务平台经营者许可服务部署管理器去部署服务应用到服务平台上。 <br />
其次服务开发者开发服务应用，一个服务应用可能包含多个服务包而这些服务包是真正运行在服务平台上的。服务提供者从服务开发者处得到服务应用并且可能会委托服务运行支撑系统去支撑该服务应用在服务平台上的运行。服务集成者将服务提供者获取的服务应用和支持系统集成起来由服务部署管理器部署到服务平台上。 <br />
最后服务消费者订阅服务提供者提供的服务。 <br />
更有意思的是这里还有一个服务用户实体，从图中可以看出服务消费者可以包含多个服务用户，服务用户是真正接受服务的实体。也就是说服务消费者是一个虚的实体，多个服务用户可以消费同一个服务消费者订阅的服务。这好比不同的人可以通过同一个电话打电话一样。这无疑提高了OSGi规范灵活性。
<img src ="http://www.blogjava.net/masen/aggbug/172132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2008-01-02 11:59 <a href="http://www.blogjava.net/masen/articles/172132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LBS</title><link>http://www.blogjava.net/masen/articles/130912.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Tue, 17 Jul 2007 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/130912.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/130912.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/130912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/130912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/130912.html</trackback:ping><description><![CDATA[据统计，人们的日常生活中有80%的信息与位置相关，位置信息也因此成为人们最渴求的信息之 一。究竟什么是LBS？实现LBS应用需要哪些关键技术的支持？ <br>位置信息通常可以归纳为两大类：移动位置信息，主要指车辆和人的实时位置，通常以平面坐标方式给出，或者指出附近最具代表性的地物、单位名称;固定位置信息，也称为地图类信息，指重要或明显地物、建筑、机构的详细属性（方位、距离、到达路线等）。 <br>调查发现，用户对移动位置信息的需求远远超过了对固定位置信息的需求，甚至在寻求固定位置服务时也需要借助移动位置信息完成，这也就决定了LBS技术的主要发展方向。 <br>在无线世界里，&#8220;Who，What，When and Where&#8221;四要素中，历来最具挑战性的就是确定移动目标的位置信息。如果可以在移动通信的系统服务中加入位置信息服务功能，对普通移动用户来说将是极具吸引力的，无论这种功能是基于SMS还是WAP或是其他技术，甚至是基于移动多媒体画图板都可以。 <br>什么是LBS系统？ <br>一个完整的LBS系统有四个部分组成：定位系统、移动服务中心、通信网络以及移动智能终端，如图1所示。 <br><a href="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t2.jpg" target=_blank><img alt=http://www2.ccw.com.cn/04/0429/b/pic/b58_2t2.jpg src="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t2.jpg"></a><br>其中，定位系统包括全球卫星定位系统和基站定位系统两个部分。空间定位技术是整个LBS系统得以实现的核心技术，这一部分正在不断完善当中，移动运营商可以选用某种定位技术或者组合定位技术，来获得适当的定位精度。 <br>移动服务中心负责与移动智能终端的信息交互和各个分中心（定位服务器、内容提供商等）的网络互连，完成各种信息的分类、记录和转发以及分中心之间业务信息的流动，并对整个网络进行监控。 <br>通信网络是连接用户和服务中心的，要求实时准确地传送用户请求及服务中心的应答。通常可选用GSM、CDMA、GPRS（General Packet Radio Service）、CDPD（Cellular Digital Packet Data）等无线通信手段，在此基础上依托LBS体系发展无线增值服务。另外，国内已建成的众多无线通信专用网，甚至有线电话、寻呼网和卫星通信、无线局域网、蓝牙技术等都可以成为LBS的通信链路，在条件允许或必须时可接入Internet网络，传输更大容量的数据或下载地图数据。 <br>移动智能终端是用户惟一接触的部分，手机、PDA均有可能成为LBS的用户终端。但是在信息化的现代社会，出于更完善的考虑，它要求有完善的图形显示能力，良好的通信端口，友好的用户界面，完善的输入方式（键盘控制输入、手写板输入、语音控制输入等），因此PDA以及某些型号的手机成为个人LBS终端的首选。 <br>LBS系统工作的主要流程如下：用户通过移动终端发出位置服务申请，申请经过各种通信网关以后，为移动定位服务中心所接受，经过审核认证后，服务中心调用定位系统获得用户的位置信息（另一种情况是，用户配有GPS等主动定位设备，这时可以通过无线网络主动将位置参数发送给服务中心），服务中心根据用户的位置，对服务内容进行响应，如发送路线图等，具体的服务内容由内容提供商提供。图2就是该过程的主要信息流程。基于位置服务的种类可大致分为4种，如图3所示。 <br><a href="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t3.jpg" target=_blank><img alt=http://www2.ccw.com.cn/04/0429/b/pic/b58_2t3.jpg src="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t3.jpg"></a><br>图2<br><a href="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t4.jpg" target=_blank><img alt=http://www2.ccw.com.cn/04/0429/b/pic/b58_2t4.jpg src="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t4.jpg"></a><br>图3<br>不同的基于位置的应用所需要的精度水平也不同。例如，对于航船来说，它们到海岸的距离以及海水的深度等数据都要求一定精度，而人群的定位精度能够达到100米就可以接受了。表1列举了一些基于位置的应用，并提供了这些应用所需的下限精度和能被市场所接受的精度数据。 <br><a href="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t1.jpg" target=_blank><img alt=http://www2.ccw.com.cn/04/0429/b/pic/b58_2t1.jpg src="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t1.jpg"></a><br>移动通信用户群和互联网用户群是当今发展最为迅速的信息产业领域中的两大支柱用户群。各类信息技术之间的不断融合和相互渗透，也逐渐导致这两大用户群体不断统一合并。在这种趋势下，移动通信与互联网技术逐渐统一到一种技术平台下，即许多专家学者和技术厂家所倡导的移动互联网概念，而移动互联网的形成主要是依赖于移动数据通信技术的发展。 <br>随着移动通信系统技术的发展和移动数据传输技术的不断提高，移动数据业务也必将由简单的短消息方式向综合信息服务的方向发展。能够向移动用户提供高速率的多媒体综合信息服务将最终成为各移动运营商的主要业务方向。从图4可以看到通过调查总结出的用户青睐的移动数据业务的比例划分。 <br><a href="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t5.jpg" target=_blank><img alt=http://www2.ccw.com.cn/04/0429/b/pic/b58_2t5.jpg src="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t5.jpg"></a><br>LBS应用的软环境 <br>前面我们看到了一个LBS系统的外在硬件框架，而要开展LBS的应用服务，则必须具有完整的LBS应用架构，主要包括定位技术、定位网关、中间件和定位应用，可以说它们是LBS系统实现的软环境。 <br>定位技术是指如何获取用户的位置，基本可以分为基于网络的、基于终端的和混合型三类。采用不同的定位技术，需要电信运营商增加的投入是不一样的，如果采用基于MAP-ATI的Cell-ID定位技术，运营商只需要保证网络支持MAP PhaseⅡ+就可以了，而采用AGPS技术，则需要移动终端和网络设备的双重支持。 <br>定位网关是LBS业务在运营商网络中需要配置的核心设备。由于LBS是一类较为特殊的电信增值服务，不仅需要把电信网络作为一种通信和信息传输的手段，还需要利用电信网络的资源对用户进行定位。因此相应的电信网络结构也会有所变化。其中GMLC（网关移动定位中心）既是核心的网络设备，也是对外开展LBS业务的接口，它主要具备以下几项功能：定位应用接入控制功能（LACF），外部应用需要通过它和GMLC接口，才能完成鉴权、服务、计费等功能；定位应用的授权功能（LAAF），主要完成网络和具体用户对某个LBS应用的授权；用户坐标的转换功能（LCTF）；定位应用计费（LCBF）；定位的操作和维护（LOMF）。 <br>中间件其实是运营商专门为ISP设计的LBS统一接入平台。 <br>由于GMLC的具体规范并不统一，各大厂商的接口设计均有不同，而且对于不同的通信网络，如GSM和CDMA，接口规范差别也很大。运营商为了方便ISP的接入和应用开发商的LBS业务设计，将各种GMLC的接入规范进行统一。这样ISP接入时只需要遵循一个标准，中间件将会自动完成到不同GMLC的协议转换。中国移动和中国联通都制定了相应的LBS中间件规范。 <br>LBS应用的最后一个基本元素就是定位应用，下面将详细介绍LBS应用服务中心的结构和功能，以便ISP和应用提供商对开展和设计LBS业务有一个基本认识。 <br>LBS运营中心如何搭建？ <br>一个完整的LBS增值服务运营中心的基本结构如图 5所示。 <br>该结构以LBS应用为核心，配备了相应的接口和服务数据支持。接口主要包括三类：和定位中间件的接口、用户访问和管理接口以及服务数据接口。服务数据主要包括含有空间信息的GIS数据和普通数据。 <br>和定位中间件的接口 <br>对运营商中间件的接口是LBS应用特有的接口，主要用于完成以下几项功能： <br>定位的请求与授权 由于用户的位置涉及到用户的隐私，一个接入的定位应用需要经过双重检测，首先确定它是否是一个合法的定位应用，如果不合法，GMLC将不会对定位请求进行响应，因此ISP在接入时必须得到相应的服务代码和密码，以保持LBS服务的合法性。一般来说，只要ISP和GMLC的连接不中断，这样授权过程只需在初始连接时做一次即可。授权的另一层含义是指该应用是否具有访问某个特定用户位置信息的许可，这种授权可以防止一个ISP随意了解非注册用户的位置信息，这类授权过程将伴随每个定位请求。 <br>定位的请求与响应 这是ISP获得用户位置信息最为直接的方法，ISP不仅将获得用户的位置信息，还将获得其QoS数据，如位置的精度、时间上的有效性等。ISP将以此数据作为LBS服务以及相应收费的基础。 <br>如前文所述，ISP的LBS应用和GMLC并不直接接口，而是经过由电信运营商标准化后的中间件。一个可以借鉴的接口规范是LIF-MLP（Location Interoperability Forum-Mobile Location Protocol），它采用安全方式的HTTP传输协议，并用XML语言描述接口字段和功能，因此ISP接入时也会被分配相应的HTTP端口。 <br>用户接口 <br>LBS业务中的用户接口包括两类，一类是用户的访问接口，另一类是用户隐私管理接口，参见图 5。用户访问接口是指用户的不同使用方式。对ISP而言，不管用户采用什么样的使用方式，ISP接受用户请求的物理接口基本上都是通过HTTP协议传输的，但其承载的高层协议却各不相同，参见图6。 <br><a href="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t6.jpg" target=_blank><img alt=http://www2.ccw.com.cn/04/0429/b/pic/b58_2t6.jpg src="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t6.jpg"></a><br><a href="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t7.jpg" target=_blank><img alt=http://www2.ccw.com.cn/04/0429/b/pic/b58_2t7.jpg src="http://www2.ccw.com.cn/04/0429/b/pic/b58_2t7.jpg"></a><br>呼叫中心和普通上网方式的HTTP接口应该是一致的，因为在进行位置查询时呼叫中心的接听人员和自己上网的用户所进行的操作基本上一致。而HTTP承载的高层协议则完全由LBS本身的应用逻辑决定。 <br>采用手机短信进行LBS业务请求时，ISP需要和短信中心有直接或间接的接口，以便接收用户的短信查询并反馈结果短信。一般而言需要在HTTP的基础上加载用于短信传输的SMPP（Short Message Peer to Peer）协议。 <br>用户通过WAP产生的请求一般是标准网络访问的简化版本，对应产生的结果也会相应简单，以便在手机终端上显示结果。 <br>至于用户隐私管理接口，用户可通过它对LBS业务进行授权，ISP一般不可能干预这一接口。这类似于网上支付业务，账单是在ISP的网站上生成的，而支付则是在银行的网站上完成的。LBS用户通过ISP的应用服务器得到服务，但授权却是直接在电信网络中完成。有时LBS的授权逻辑和应用逻辑高度相关，因此ISP在申请开展某种LBS业务时，需要了解运营商为用户提供的隐私管理逻辑是否支持自己的LBS业务。 <br>LBS应用服务 <br>应用服务是ISP运营的有特色的LBS服务，和大多数其他服务相同，该服务大多是多线程的并发服务，程序一般采用Java语言编写，运行在EJB和Web服务器上，如JBoss、Tomcat等。ISP运营规模的不同和LBS应用服务的复杂度不同决定了服务器的处理能力要求也会有很大的不同，一般ISP在选择LBS应用时，应充分考虑其部署的可扩展性，以便日后用户数量增加时，可以快速升级和扩容。 <br>GIS数据库和其他ICP接口 <br>单纯的位置信息，如经纬度等，对用户来说缺乏直观的意义，因此要使位置信息真正产生价值，LBS应用服务中一般都需要配合使用GIS系统，例如返回用户附近的标志性建筑，为用户提供周边信息甚至导航信息等。 <br>GIS系统是一个庞大和复杂的系统，它包括了软件和数据两部分。常用的GIS软件有MapInfo、ArcInfo等，它们通常具有丰富的API资源和工具包。不过GIS数据的有效性却是LBS的一个应用瓶颈，因为GIS数据是否完整、真实和实时将直接影响到用户对LBS业务的感受，所以选择合适的GIS数据源是ISP开展LBS业务时必须慎重对待的。 <br>由于GIS数据量非常庞大，而且在不断变化中，绝大部分ISP不具备自我完善和快速更新GIS数据的能力，因此需要向专业的GIS数据生产单位进行购买或租用。如果采用购买方式，GIS数据源在本地，ISP就需要有一个专业的服务器运行整个GIS系统（包括软件和数据）。这样的好处是LBS业务的系统响应速度快，但ISP的运营成本则会相应提高。另一种方式是ISP向GIS数据提供商申请远程数据访问，并根据访问情况，支付数据使用费。这样可以达到资源最为有效的共享，同时也能降低ISP的运营和维护成本，但问题是LBS业务响应速度会因为数据的远程访问而降低，降低的程度取决于ISP向GIS数据提供商租借的带宽和GIS数据提供商本身的服务器处理能力。ISP可以根据不同的需要，选择合适的方式开展LBS业务。 <br>其他ICP接口的目的也是为了补充ISP本身数据不足而设计的，这样结合用户的位置信息就可以派生出更多有用的其他服务信息，从而突出LBS以人为本的服务特点。 <br>关于建立LBS服务的几点建议 <br>从以上LBS应用服务中心的架构可以看到，真正的LBS应用逻辑设计在LBS业务设计中只占较小的比例，而大量的工作集中在数据获取和接口设计上。接口设计特别是中间件的接口设计本质上对所有的LBS业务都是一样的，因此最好的方法就是根据运营商提供的中间件接口规范设计一个统一的接口工具包供所有的应用设计商共享，这样就可以在很大程度上避免应用设计的重复，也可以帮助设计商更快地开发产品。工具包的设计采用Java语言最为合适，因为它的平台移植性最好，也才能被真正地共享。 <br>基础数据共享、强调特色数据、特色服务也是ISP发展LBS的重要方向。大量的ISP不可能自行采集、制作和维护复杂的基础GIS数据，只有通过有偿共享的方法，才能使ISP把精力真正地集中在LBS服务上，也才能真正地发挥自己的特点和专长去吸引更多的用户使用。 <br>和WAP应用更紧密的结合是LBS业务的另一个重要发展方向。和短信相比，WAP是一种更为高速和廉价的传输手段，高速无线数据传输也是移动通信不可逆转的发展方向。当传输手段逐步完善时，LBS业务的优势就能更好地体现出来，如更友好的用户界面、更大的反馈信息量等。 <br>&#183;小资料&#183; <br>移动通信系统设备商的LBS解决方案 <br>由于存在巨大的市场潜力，全球各大主要移动设备制造商都在开展与LBS服务相关的研发和市场开拓工作。为运营商提供一套实用的移动位置定位服务平台设备，已成为移动通信设备制造商保持和扩大其市场份额的一种战略手段。 <br>摩托罗拉的MALS系统 <br>Motorola MALS提供的是基于STK Cell ID方式的端到端位置服务解决方案，支持GSM和CDMA网络以及利用基站和卫星的混合定位解决方案，系统由三部分组成：含STK卡的普通手机、短信中心和定位服务器。其中定位服务器包括服务应用平台（中间件）、定位服务引擎及地图/应用服务提供商。 <br>该系统的实施不涉及任何网络单元的硬件和软件升级，可以支持不同设备提供商的网络，可实现漫游。其业务实施无需对HLR（Home Location Register）进行任何查询，不影响现网业务。 <br>诺基亚的mPosition移动业务系统 <br>mPositiont也是完全的端到端移动位置服务解决方案。它将用户的位置信息、依赖于位置信息的应用程序、中间件以及服务结合在一起，为最终用户提供了新的应用空间。 <br>它支持现有网络向GPRS、3G和IPRN的平滑过渡，并支持多种不同的定位方法，经过升级它还能满足更高的系统精度要求。通过开放接口，运营商能够将mPosition与现有服务平台集成使用。将来，mPosition定位系统还将提供支持传统电话的mPosition方案、支持E-OTD的mPosition、支持AGPS的mPosition、支持WCDMA的RAN1版mPosition、支持WCDMA的RAN2版mPosition以及支持IPRN的mPosition。 <br>基于SMS方法的LBS系统 <br>短信服务是当前最为成功，应用最广泛的无线通信业务之一，它提供手机用户之间文本信息的交流方式。利用SMS作为通信链路来开展LBS服务，可以充分利用现存的GSM骨干网络，投资小、回报快，因此成为当前开展LBS服务的主流方案。中国移动新近推出的动感地带业务，附加了一系列的增值服务。如确定某个手机号码的位置、查找最近的饭店等，是此种方法的简单实例。 <br>用短信方式实现的LBS系统由SMS中心、移动服务中心（由SME仿真器和应用服务器组成）、定位系统和内容提供商四个部件组成。其中，SMS中心负责在SME和手机基站之间传送和存储短消息；移动服务中心在逻辑上可以分成SME仿真器和应用服务器，SMS中心把信息传送给SME仿真器，而SME仿真器通过Socket与SMS中心进行通信，对端口进行监听；SMPP协议是一个公开的工业标准，定义了外部实体如因特网应用和移动网络SMS中心之间的接口。 <br>用户以短信的方式发送位置服务请求，SMS中心把信息发给移动服务中心，SME仿真器则从短信中提取移动用户的标识信息和特定的应用信息，然后把这些信息转发给应用服务器，应用服务器再利用这些信息向位置提供商发出定位请求。之后内容提供商对请求进行处理，并将处理结果返回给应用服务器。最后，SME对结果进行处理，转换成短信的格式返回给移动设备。如果消息的长度超过设备的设定值，消息会被自动拆分成多条来发送。移动服务中心则会追踪/监察事务的整个流程。（文/李冬航） <br>（计算机世界报 第29期 B5、B6、B7） 
<img src ="http://www.blogjava.net/masen/aggbug/130912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-07-17 19:15 <a href="http://www.blogjava.net/masen/articles/130912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Data Mining</title><link>http://www.blogjava.net/masen/articles/126240.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Mon, 25 Jun 2007 17:32:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/126240.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/126240.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/126240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/126240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/126240.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt" align=justify>数据挖掘是从大量的数据中抽取出潜在的、不为人知的有用信息、模式和趋势。</p>
<p style="FONT-SIZE: 12pt" align=justify>数据挖掘的目的：提高市场决策能力；检测异常模式；在过去的经验基础上预言未来趋势等。</p>
<p style="FONT-SIZE: 12pt" align=justify>数据挖掘不同的术语和定义：<font face="宋体, MS Song" size=3>data mining, knowledge discovery, pattern discovery, data dredging, knowledge, data archeology.</font></p>
<img src ="http://www.blogjava.net/masen/aggbug/126240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-06-26 01:32 <a href="http://www.blogjava.net/masen/articles/126240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ETL</title><link>http://www.blogjava.net/masen/articles/126239.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Mon, 25 Jun 2007 17:15:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/126239.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/126239.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/126239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/126239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/126239.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ETL即数据抽取（Extract）、转换（Transform）、装载（Load）的过程。它是构建数据仓库的重要环节。数据仓库是面向主题的、集成的、稳定的且随时间不断变化的数据集合，用以支持经营管理中的决策制定过程。数据仓库系统中有可能存在着大量的噪声数据,引起的主要原因有：滥用缩写词、惯用语、数据输入错误、重复记录、丢失值、拼写变化等。即便是一个设计和规划良好的数据库系统，如果其中存在着大量的噪声数据，那么这个系统也是没有任何意义的，因为&#8220;垃圾进，垃圾出&#8221;（garbage in, garbage out），系统根本就不可能为决策分析系统提供任何支持。为了清除噪声数据，必须在数据库系统中进行数据清洗。目前有不少数据清洗研究和ETL研究，但是如何在ETL过程中进行有效的数据清洗并使这个过程可视化，此方面研究不多。本文主要从两个方面阐述ETL和数据清洗的实现过程：ETL的处理方式[19]和数据清洗的实现方法。<br>（1）ETL的处理方式<br>本文所采用的ETL方法是数据库段区域中的ETL处理方式，它不使用外部引擎而是使用数据库作为唯一的控制点。由于源系统SQLserver2000是关系数据库，它的段表也是典型的关系型表。成功地将外部未修改数据载入数据库后，再在数据库内部进行转换。数据库段区域中的ETL处理方式执行的步骤是提取、装载、转换，即通常所说的ELT。[21]这种方式的优点是为抽取出的数据首先提供一个缓冲以便于进行复杂的转换，减轻了ETL进程的复杂度。<br>（2）ETL过程中实现数据清洗的实现方法<br>首先，在理解源数据的基础上实现数据表属性一致化。为解决源数据的同义异名和同名异义的问题，可通过元数据管理子系统，在理解源数据的同时，对不同表的属性名根据其含义重新定义其在数据挖掘库中的名字，并以转换规则的形式存放在元数据库中，在数据集成的时候，系统自动根据这些转换规则将源数据中的字段名转换成新定义的字段名，从而实现数据挖掘库中的同名同义。<br>其次，通过数据缩减，大幅度缩小数据量。由于源数据量很大，处理起来非常耗时，所以可以优先进行数据缩减，以提高后续数据处理分析效率。<br>最后，通过预先设定数据处理的可视化功能节点，达到可视化的进行数据清洗和数据转换的目的。针对缩减并集成后的数据，通过组合预处理子系统提供各种数据处理功能节点，能够以可视化的方式快速有效完成数据清洗和数据转换过程。<br>ETL即数据抽取（Extract）、转换（Transform）、装载（Load）的过程。它是构建数据仓库的重要环节。数据仓库是面向主题的、集成的、稳定的且随时间不断变化的数据集合，用以支持经营管理中的决策制定过程。数据仓库系统中有可能存在着大量的噪声数据,引起的主要原因有：滥用缩写词、惯用语、数据输入错误、重复记录、丢失值、拼写变化等。即便是一个设计和规划良好的数据库系统，如果其中存在着大量的噪声数据，那么这个系统也是没有任何意义的，因为&#8220;垃圾进，垃圾出&#8221;（garbage in, garbage out），系统根本就不可能为决策分析系统提供任何支持。为了清除噪声数据，必须在数据库系统中进行数据清洗。目前有不少数据清洗研究和ETL研究，但是如何在ETL过程中进行有效的数据清洗并使这个过程可视化，此方面研究不多。本文主要从两个方面阐述ETL和数据清洗的实现过程：ETL的处理方式[19]和数据清洗的实现方法。<br>（1）ETL的处理方式<br>本文所采用的ETL方法是数据库段区域中的ETL处理方式，它不使用外部引擎而是使用数据库作为唯一的控制点。由于源系统SQLserver2000是关系数据库，它的段表也是典型的关系型表。成功地将外部未修改数据载入数据库后，再在数据库内部进行转换。数据库段区域中的ETL处理方式执行的步骤是提取、装载、转换，即通常所说的ELT。[21]这种方式的优点是为抽取出的数据首先提供一个缓冲以便于进行复杂的转换，减轻了ETL进程的复杂度。<br>（2）ETL过程中实现数据清洗的实现方法<br>首先，在理解源数据的基础上实现数据表属性一致化。为解决源数据的同义异名和同名异义的问题，可通过元数据管理子系统，在理解源数据的同时，对不同表的属性名根据其含义重新定义其在数据挖掘库中的名字，并以转换规则的形式存放在元数据库中，在数据集成的时候，系统自动根据这些转换规则将源数据中的字段名转换成新定义的字段名，从而实现数据挖掘库中的同名同义。<br>其次，通过数据缩减，大幅度缩小数据量。由于源数据量很大，处理起来非常耗时，所以可以优先进行数据缩减，以提高后续数据处理分析效率。<br>最后，通过预先设定数据处理的可视化功能节点，达到可视化的进行数据清洗和数据转换的目的。针对缩减并集成后的数据，通过组合预处理子系统提供各种数据处理功能节点，能够以可视化的方式快速有效完成数据清洗和数据转换过程。 </span>
<img src ="http://www.blogjava.net/masen/aggbug/126239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-06-26 01:15 <a href="http://www.blogjava.net/masen/articles/126239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据仓库</title><link>http://www.blogjava.net/masen/articles/126238.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Mon, 25 Jun 2007 17:09:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/126238.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/126238.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/126238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/126238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/126238.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;目前，数据仓库一词尚没有一个统一的定义，著名的数据仓库专家W.H.Inmon在其著作《Building the Data Warehouse》一书中给予如下描述：数据仓库（Data Warehouse）是一个面向主题的（Subject Oriented）、集成的（Integrate）、相对稳定的（Non-Volatile）、反映历史变化（Time Variant）的数据集合，用于支持管理决策。对于数据仓库的概念我们可以从两个层次予以理解，首先，数据仓库用于支持决策，面向分析型数据处理，它不同于企业现有的操作型数据库；其次，数据仓库是对多个异构的数据源有效集成，集成后按照主题进行了重组，并包含历史数据，而且存放在数据仓库中的数据一般不再修改。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;根据数据仓库概念的含义，数据仓库拥有以下四个特点：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、面向主题。操作型数据库的数据组织面向事务处理任务，各个业务系统之间各自分离，而数据仓库中的数据是按照一定的主题域进行组织。主题是一个抽象的概念，是指用户使用数据仓库进行决策时所关心的重点方面，一个主题通常与多个操作型信息系统相关。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、集成的。面向事务处理的操作型数据库通常与某些特定的应用相关，数据库之间相互独立，并且往往是异构的。而数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整理得到的，必须消除源数据中的不一致性，以保证数据仓库内的信息是关于整个企业的一致的全局信息。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、相对稳定的。操作型数据库中的数据通常实时更新，数据根据需要及时发生变化。数据仓库的数据主要供企业决策分析之用，所涉及的数据操作主要是数据查询，一旦某个数据进入数据仓库以后，一般情况下将被长期保留，也就是数据仓库中一般有大量的查询操作，但修改和删除操作很少，通常只需要定期的加载、刷新。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、反映历史变化。操作型数据库主要关心当前某一个时间段内的数据，而数据仓库中的数据通常包含历史信息，系统记录了企业从过去某一时点(如开始应用数据仓库的时点)到目前的各个阶段的信息，通过这些信息，可以对企业的发展历程和未来趋势做出定量分析和预测。<br>企业数据仓库的建设，是以现有企业业务系统和大量业务数据的积累为基础。数据仓库不是静态的概念，只有把信息及时交给需要这些信息的使用者，供他们做出改善其业务经营的决策，信息才能发挥作用，信息才有意义。而把信息加以整理归纳和重组，并及时提供给相应的管理决策人员，是数据仓库的根本任务。因此，从产业界的角度看，数据仓库建设是一个工程，是一个过程。<br>整个数据仓库系统是一个包含四个层次的体系结构，具体由下图表示。 <br><img src="http://docs.huihoo.com/database/i/a1.jpg"><br>
<p style="FONT-SIZE: 12pt">&nbsp;</p>
</td>
<td style="FONT-SIZE: 12pt"></td>
</tr>
<tr>
    <td style="FONT-SIZE: 12pt" height="91"></td>
    <td style="FONT-SIZE: 12pt" colspan="3" valign="top"></td>
    <td style="FONT-SIZE: 12pt"></td>
</tr>
<tr>
    <table style="WIDTH: 998px; HEIGHT: 355px" cellSpacing=0 cellPadding=0 width=998 align=left border=0>
        <tbody>
            <tr>
                <td class=b1 style="FONT-SIZE: 12pt" width="100%" height=134><br>&#183;数据源：是数据仓库系统的基础，是整个系统的数据源泉。通常包括企业内部信息和外部信息。内部信息包括存放于RDBMS中的各种业务处理数据和各类文档数据。外部信息包括各类法律法规、市场信息和竞争对手的信息等等；<br><br>&#183;数据的存储与管理：是整个数据仓库系统的核心。数据仓库的真正关键是数据的存储和管理。数据仓库的组织管理方式决定了它有别于传统数据库，同时也决定了其对外部数据的表现形式。要决定采用什么产品和技术来建立数据仓库的核心，则需要从数据仓库的技术特点着手分析。针对现有各业务系统的数据，进行抽取、清理，并有效集成，按照主题进行组织。数据仓库按照数据的覆盖范围可以分为企业级数据仓库和部门级数据仓库（通常称为数据集市）。 <br><br>&#183;OLAP服务器：对分析需要的数据进行有效集成，按多维模型予以组织，以便进行多角度、多层次的分析，并发现趋势。其具体实现可以分为：ROLAP、MOLAP和HOLAP。ROLAP基本数据和聚合数据均存放在RDBMS之中；MOLAP基本数据和聚合数据均存放于多维数据库中；HOLAP基本数据存放于RDBMS之中，聚合数据存放于多维数据库中。<br><br>&#183;前端工具：主要包括各种报表工具、查询工具、数据分析工具、数据挖掘工具以及各种基于数据仓库或数据集市的应用开发工具。其中数据分析工具主要针对OLAP服务器，报表工具、数据挖掘工具主要针对数据仓库。</td>
            </tr>
        </tbody>
    </table>
<img src ="http://www.blogjava.net/masen/aggbug/126238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-06-26 01:09 <a href="http://www.blogjava.net/masen/articles/126238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOA</title><link>http://www.blogjava.net/masen/articles/125900.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Fri, 22 Jun 2007 11:25:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/125900.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/125900.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/125900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/125900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/125900.html</trackback:ping><description><![CDATA[Service-Oriented Architecture，面向服务架构，SOA是一种 架构模型，它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础，可以直接被应用调用，从而有效控制系统中与软件代理交互的人为依赖性。SOA的几个关键特性：一种粗粒度、松耦合服务架构，服务之间通过简单、精确定义接口进行通讯，不涉及底层编程接口和通讯 模型。 <br>
<img src ="http://www.blogjava.net/masen/aggbug/125900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-06-22 19:25 <a href="http://www.blogjava.net/masen/articles/125900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JCA</title><link>http://www.blogjava.net/masen/articles/117284.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Mon, 14 May 2007 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/117284.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/117284.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/117284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/117284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/117284.html</trackback:ping><description><![CDATA[<div class=postTitle><a class=postTitle2 id=viewpost1_TitleUrl href="http://www.cnblogs.com/rookieport/archive/2006/10/30/544374.html"><u><font color=#800080>JCA适配器技术综述</font></u></a> </div>
　　什么是JCA？它最吸引人的特点是什么？它有什么不足之处？有哪些厂商支持JCA？是否还存在替代JCA的产品，以便选购时货比三家？本文将帮助你解答所有这些问题。 <br>　　JCA及其特点<br>　　JCA即Java Connector Architecture，或Java连接器体系，它完善了用J2EE构造企业应用的技术体系。在JCA出现之前，基于J2EE应用服务器的开发体系为企业应用各个部分提供了相应的开发工具，但是，与传统系统连接的部分仍未得到很好的解决。为了与这些EIS系统集成，各个公司为每一种系统提供了定制的开发工具。有了JCA，应用服务器厂商就能够为Java平台组件与后端系统的连接提供一层抽象。应该说，JCA完全符合J2EE应用服务器市场的自然发展历程。 <br>　　在JCA出现之前，人们在连接EIS时面临着一系列类似的问题。 <br>　　首先，每一个EIS应用有自己的编程接口，与一个异种的EIS应用交互意味着要针对一组特定的API编程。因此，人们需要一组公共的客户端接口，以便简化客户端编程。 <br>　　其次，与后端EIS系统的交互通常总是很繁忙。为了降低连接开销、提高性能，人们需要连接池。 <br>　　第三，与EIS应用的连接往往是面向事务的。为了保证数据完整性，人们需要内建的事务支持，以便把编程工作量降低到最少限度。 <br>　　最后一点（但并非最不重要的一点）是人们迫切需要提高EIS应用和EIS客户程序集成的安全性。 <br>　　<br>　　仔细分析上述问题，可以发现，它们与人们以前连接数据库时面临的问题相似。对于数据库连接，由于JDBC API之类的技术被广泛采用，问题已经得到解决：作为一个程序员，你现在再也不必直接与数据库交互，而是可以通过JDBC与数据库交互，JDBC接口对于所有流行的数据库系统来说都是一样的；你可以方便地使用数据库连接池，却不必自己动手实现它；你可以方便地使用事务支持和安全集成能力，因为这些功能都是内建的。要是对于EIS应用也有类似JDBC的技术，它一定能够为你带来不少方便吧？如果你的回答是肯定的，答案就是JCA。 <br>　　<br>　　为了解决连接EIS时面临的各种问题，JCA提供以下功能： <br>　　<br>　　▲　连接缓冲池：EIS连接通常属于昂贵的资源，创建EIS连接需要大量的时间开销。连接池使得应用服务器能够创建和共享EIS应用的连接，使得应用能够更高效地使用昂贵的连接资源。 <br>　　▲　事务管理：事务管理能力使得EIS应用能够获取应用服务器提供的事务环境的支持，使得服务器能够把EIS系统的事务作为一个单元管理。 <br>　　▲　安全：安全接口的实现允许应用服务器在不影响EIS特有安全机制的情况下，对整体安全性进行有效的管理。验证、授权和安全关联都属于该接口包含的范围，它们都属于为JCA适配器和J2EE应用服务器内建的服务。 <br>　　▲　公共的客户端接口：JCA还定义了用户级的编程接口，称为公共客户端接口（CCI，Common Client Interface）。这个接口集在JCA 1.0中是可选的，允许EIS客户程序的开发者按照一种标准的方式，连接目标EIS系统，或与目标EIS交互（执行命令并获取结果）。 <br>　　应用服务器的JCA支持<br>　　对JCA的支持来自两个方面：支持JCA的应用服务器，支持JCA的EIS应用适配器。JCA 1.0是J2EE 1.3规范的一部分，遵从J2EE 1.3规范的应用服务器必须提供合适的环境支持必要的JCA功能，包括缓冲池、事务和集成的安全机制。表一列出了常见的应用服务器以及它们的JCA支持情况。 <br>　　表一：JCA支持现状<br>　　　<img src="http://java.chinaitlab.com/imgfiles/2002.10.2.11.9.15.1.jpg"> <br>　　BEA的WebLogic Server是最早支持JCA的应用服务器之一。从2001年开始，WebLogic 6.0就内建了对JCA Beta的支持，当时的JCA 1.0规范正处于最终草案状态。经过一年的发展之后，多次获奖的WebLogic Server已经是支持JCA的最佳应用服务器之一。IBM的WebSphere应用服务器是另一个广受欢迎并获奖的J2EE应用服务器，2001年中期左右，它开始支持JCA。JBoss也是值得特别指出的应用服务器，如果预算比较紧张，你就应该注意一下这个应用服务器。JBoss也支持JCA，而且它具有无可比拟的价格优势--它是免费的！ <br>　　适配器厂商和产品<br>　　连接后端EIS应用时要用到JCA适配器。目前已经有许多集成商开发了JCA适配器，如表二所示。 <br>　　表二：JCA厂商与适配器 <br>　　<img src="http://java.chinaitlab.com/imgfiles/2002.10.2.11.9.20.2.jpg"> <br>　　从表二可以看出，有许多厂商为同样的EIS应用提供了JCA适配器。然而，即使对于同一个EIS应用，来自不同厂商的JCA适配器可能支持不同的功能集。这是由于两个因素造成的。首先，一些规范，例如JCA 1.0中的CCI，是可选的；是否在当前发行版中包含某个功能，完全由适配器厂商决定。其次，一些重要的EIS集成功能并未包含在当前的JCA规范中；为了增强适配器，适配器厂商可能决定增加一些额外的功能。这些在规范中没有定义的功能将在稍后详细讨论。 <br>　　<br>　　由于这些在JCA规范中没有定义的功能可能是很重要的，许多厂商在这个问题上采取了更实在的策略，走到了规范之前；即使面临着非标准化的风险，为了提供额外的功能，它们也会为适配器加上一些辅助特性。 <br>　　<br>　　Insevo为许多EIS应用提供了JCA适配器，包括SAP、PeopleSoft、Edwards和Siebal。这些适配器除了支持JCA定义的CCI之外，还支持一种基于XML的接口。它们既支持客户程序和EIS应用之间的同步通信，也支持异步通信。另外，它们还支持双向通信，而不是JCA定义的单向通信。这些额外的功能使得Insevo的适配器不仅适用于应用集成，而且适用于过程集成（Process Integration）；另外，这些附加的功能已经被作为JCA 2.0规范的一部分考虑。因此，从某种意义上来说，Insevo的适配器是一个超前JCA规范的版本。尽管额外增加的功能不遵从当前的JCA规范，但如果你确实需要它们，还有比这更好的事情吗？ <br>　　<br>　　Resource Adapters的RAi连接器是另一组采取此种策略的JCA适配器，也包含了一些预期将在JCA 2.0规范中定义的功能。RAi支持输入（Inbound）连接和输出（Outbound）连接，支持同步和异步通信模式。RAi连接器除了支持CCI之外，还支持一组基于XML的API和XML元数据，并提供了日志和监视工具，为实际工作带来了巨大的方便。 <br>　　<br>　　除此之外，Attunity和Insevo还提供了许多数据源适配器和传统适配器，这些适配器往往只需单向的同步通信。一些数据源和传统适配器不支持事务之类的JCA功能，因此，它们并不提供对JCA的完整支持。 <br>　　<br>　　<br>　　与其他类型的适配器比较<br>　　<br>　　<br>　　除了JCA适配器，还有其他一些根据不同需求而开发的适配器类型，其中之一是Web服务适配器，它是一种重要的新适配器类型，正在迅速地获得人们的认可。另外，在JCA出现之前就有许多非标准的适配器被开发出来，因此这些适配器拥有更长的发展和成熟时间。 <br>　　<br>　　Web服务适配器 <br>　　<br>　　当前，企业应用的平台有各种各样的类型，当然有一部分是以Java为基础的。在开发各类系统的过程中，企业投入了大量的资源，当然不肯轻言放弃。问题在于，如何才能在不增加额外投资的情况下，让这些异种的系统能够协作运行？两种流行的技术使这一切成为可能：第一是HTTP，第二是XML。这两者是每一种平台上都使用的技术，非常适合于异种平台的集成。Web服务规范就建立在这两种简单但关键的技术的基础上。尽管详细讨论Web服务已经超出了本文的范围，但从下面的简要说明可以看出Web服务的主要特点： <br>　　<br>　　▲　XML接口：Web服务以XML为基础，它利用Web服务描述语言（WSDL）描述终端服务者的服务形式。 <br>　　<br>　　▲　HTTP/HTTPS协议：Web服务事实上的通信协议。 <br>　　<br>　　▲　SOAP：基于WSDL的Web服务和HTTP/HTTPS通信协议之间的绑定协议。 <br>　　<br>　　Web服务仍未提供任何QoS机制，因此是一种异步协议。对于异种系统的宽松结合来说，它是一种很合适的协议。 <br>　　<br>　　Web服务和JCA提供的功能互相完善了对方。如果这两种技术最终把它们的特点合并了起来，我们不应该感到奇怪。实际上，一些厂商已经向这个方向发展。例如，Attunity和Sirvisetti等厂商已经在它们的JCA适配器中提供了对Web服务的支持。 <br>　　非标准化的适配器 <br>　　<br>　　在JCA出现之前，一些中立的厂商，例如webMethods和TIBCO等，推出集成适配器已有数年。这些适配器一般具有非标准化的API，有时它们不能从集成软件包分开。尽管如此，这些适配器已经经过多年实践的检验，比JCA适配器涵盖范围更广泛的EIS。特别地，webMethods Enterprise Adapter和B2B适配器拥有迄今为止最广泛的覆盖面。webMethods拥有的适配器多达60个以上，这些适配器还不支持JCA，但webMthods正在快速地向支持JCA的方向发展。 <br>　　<br>　　<br>　　JCA的优点和不足<br>　　<br>　　<br>　　JCA的优点很明显。它为EIS厂商提供了一种按照开放的产业标准定义EIS接口的途径。通过使用公共的可调用接口以及继承JCA提供的QoS机制，程序员能够在不牺牲性能和系统完整性的前提下，简化EIS的集成工作。 <br>　　<br>　　JCA的局限不是显而易见，但不容忽视。和所有其他新技术一样，JCA第一个版本的不成熟性往往成为最令人担心的问题。另外，JCA适配器应该是可在应用服务器之间移植的；然而，就目前的情况来看，对于你正在使用的应用服务器来说这一判断未必正确，因为适配器对某种应用服务器的支持情况由适配器厂商根据个案进行测试和发布。此外，JCA还有其他一些已知的局限，其中有些局限有望在JCA标准的下一个版本中得到解决，其中包括： <br>　　<br>　　▲　异步消息传输：调用EIS应用时，JCA 1.0采取同步消息传输方式；它不能处理来自EIS应用的异步消息或向EIS应用传递异步消息。如果要异步传递消息，就要在使用JCA时结合JMS（Java Message Service）或其他队列服务，或者选择使用JCA适配器中内建的非标准化异步消息支持。 <br>　　<br>　　▲　长时间运行的事务：这是一种运行时间可能达到数天甚至 
<img src ="http://www.blogjava.net/masen/aggbug/117284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-05-14 11:26 <a href="http://www.blogjava.net/masen/articles/117284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMX</title><link>http://www.blogjava.net/masen/articles/109157.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 14:18:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109157.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109157.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109157.html</trackback:ping><description><![CDATA[<p>JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务，实际上，用户可以在任何Java应用程序中使用这些代理和服务实现管理。 </p>
<p>JMX的前身是<a class=editpage title="Create 'JMAPI'" href="http://wiki.matrix.org.cn/Edit.jsp?page=JMAPI"><font color=#800080><u>JMAPI</u></font></a>。 </p>
<p>JMX致力于解决分布式系统管理的问题，因此，能够适合于各种不同的环境是非常重要的。为了能够利用功能强大的Java计算环境解决这一的问题，Sun公司扩充了<a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=Java"><u><font color=#0000ff>Java</font></u></a>基础类库，开发了专用的管理类库。 </p>
<p>JMX是一种应用编程接口，可扩充对象和方法的集合体，可以用于跨越一系列不同的异构操作系统平台、系统体系结构和网络传输协议，灵活的开发无缝集成的系统、网络和服务管理应用它提供了用户界面指导、Java类和开发集成系统、网络及网络管理应用的规范。 </p>
<p>管理对象是JMX应用程序的核心。JMX结构包括：支持Java的Web浏览器用户接口，管理运行模块ARM(Admin Runtime Module)和应用。这三个部件之间通过<a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=RMI"><u><font color=#0000ff>RMI</font></u></a>（Remote Method Invocation）进行通信。这里需要说明的是，RMI是使得一个Java虚拟机（JVM）上运行的程序可以调用远程服务器上另一个<a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=JVM"><u><font color=#0000ff>JVM</font></u></a>总的对象。 </p>
<p>用户接口用来发布管理操作，这些操作可以间接的通过浏览器或通过单独的应用程序来激发。管理运行模块用来给应用提供实例化的管理对象。它包括<a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=Agent"><u><font color=#0000ff>Agent</font></u></a>对象接口，通知接口和被管数据接口。应用指的是那些被管设备单元。 </p>
<p>JMX是一个完整的网络管理应用程序开发环境，它同时提供了：厂商需要收集的完整的特性清单，可生成资源清单表格，图形化的用户接口；访问<a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=SNMP"><u><font color=#0000ff>SNMP</font></u></a>的网络API；主机间远程过程调用；数据库访问方法。 </p>
<p>JMX这一轻型的管理基础结构，价值在于对被管理资源的服务实现了抽象，提供了低层的基本类集合，开发人员在保证大多数的公共管理类的完整性和一致性的前提下，进行扩展以满足特定网络管理应用的需要。 </p>
<p>JMX注重于构造管理工具的软件框架，并尽量采用已成熟的技术。 </p>
<p>JMX体系被分成三个层次 </p>
<ul>
    <li>表现层
    <li>代理层
    <li>分布式服务层 </li>
</ul>
<h2>表现层 </h2>
<p>表现层定义的是JMX可管理资源所在的层。 </p>
<p>这些已管理的资源可以编写或封装为<a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=MBean"><u><font color=#0000ff>MBean</font></u></a>。 </p>
<p>MBean分为四种类型： 标准、动态、开放、模型 </p>
<h2>代理层 </h2>
<p>定义的是MBean向应用程序施加管理的层。包括MBean服务器和代理服务的定义。还至少包括一个协议适配器或连接器。 </p>
<p>代理的组成： 。一个MBean服务器 。要管理的MBean 。作为MBean实现的代理服务 。至少一个协议适配器 </p>
<h3>MBean </h3>
<p>在JMX中，最小的可管理单元是MBean。 </p>
<p>MBean不是一个真正的接口和类，而是必须准循的设计模式以确保资源是一个兼容的MBean。 </p>
<p>MBean的激活方法: </p>
<p>invoke()方法是管理应用程序用于激活MBean的方法的手段。 invoke()方法有三个参数，分别是方法的名称、表示属性的对象数组和描述方法签名的一个字符串数组。它与使用<a class=editpage title="Create 'JavaReflection'" href="http://wiki.matrix.org.cn/Edit.jsp?page=JavaReflection"><u><font color=#0000ff>Java Reflection</font></u></a> Api 激活方法的方式类似。 </p>
<p>Notification(通知)模型： </p>
<p>MBean的通知模型类似与Java事件的监听器模型。 MBean或管理应用程序可以作为MBean事件的监听器注册。 通知支持由两个基本的概念组成，即广播器和监听器。 </p>
<h3>MBean服务器 </h3>
<p>MBean服务器用于注册可管理的MBean。 </p>
<p>所有对MBean的请求或查询都是通过MBean服务器实施的。 </p>
<h3>代理服务 </h3>
<p>代理服务是一些特殊的函数，代理把这些服务提供给MBean，这些代理服务独立于任何MBean。 </p>
<p>一个代理可以提供四种主要的服务： </p>
<ul>
    <li>动态装载：允许代理通过下载这个Bean的类动态实例化MBean，这与装载applet的方式类似。 </li>
</ul>
JMX使用m-let这个标记指定期望动态装载的MBean的位置。
<ul>
    <li>监控：允许代理通知有关的监听器监控一个MBean的属性值的变化 </li>
</ul>
JMX允许使用三种基本类型的监控程序 (1)CounterMonitor：该程序可以观察类型方面的变化，比如Byte类似或Integer类型 (2)GaugeMonitor：该程序可以观察类型方面的变化，比如Byte类似或Integer类型，还可以在到达上下阀值时进行报告。 (3)StringMonitor：该程序可以观察java.lang.String类型的变化。
<ul>
    <li>计时器：允许预设的时间间隔发送通知，可以作为一个调度程序
    <li>关系：允许创建和维护MBean之间的关系 </li>
</ul>
<h2>分布式服务层 </h2>
<p>包含协议适配器和连接器两种类型的组件，通过它们连接到外部的应用，如<a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=RMI"><u><font color=#0000ff>RMI</font></u></a>管理应用、基于浏览器的管理控制等 </p>
<h2>协议适配器和连接器 </h2>
<p>协议适配器是代理与管理客户通信的手段，每个通信的协议都可能不同。 </p>
<p>它们都是管理客户与MBean交互的方式。 </p>
<h2>JMX的好处 </h2>
<ul>
    <li>可减少对JAVA应用实施管理的投资
    <li>提供了一个可伸缩的管理框架
    <li>集成现有的管理方案：如：WBEM，SNMP，TMN
    <li>使用现有的标准JAVA技术
    <li>能使用未来的一些管理概念：如Jini连接技术、通用即插即用、服务定位协议(Service Location Protocol)
    <li>只定义了一些可以访问的接口 </li>
</ul>
<p>本介绍摘录自<a class=external href="http://www.huihoo.org/"><u><font color=#0000ff>Huihoo</font></u></a><u><font color=#0000ff><img class=outlink src="http://wiki.matrix.org.cn/images/out.png"></font></u></p>
<h2>参见</h2>
<ul>
    <li><a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=JMX%E7%9B%B8%E5%85%B3"><u><font color=#0000ff>JMX相关框架</font></u></a>
    <li><a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=MC4J"><u><font color=#0000ff>MC4J</font></u></a>
    <li><a class=editpage title="Create 'XMOJO'" href="http://wiki.matrix.org.cn/Edit.jsp?page=XMOJO"><u><font color=#0000ff>XMOJO</font></u></a>
    <li><a class=editpage title="Create 'MX4J'" href="http://wiki.matrix.org.cn/Edit.jsp?page=MX4J"><u><font color=#0000ff>MX4J</font></u></a>
    <li><a class=editpage title="Create 'JFoxMX'" href="http://wiki.matrix.org.cn/Edit.jsp?page=JFoxMX"><u><font color=#0000ff>JFoxMX</font></u></a>
    <li><a class=editpage title="Create 'JMX4Ant'" href="http://wiki.matrix.org.cn/Edit.jsp?page=JMX4Ant"><u><font color=#0000ff>JMX4Ant</font></u></a>
    <li><a class=editpage title="Create 'Panoptes'" href="http://wiki.matrix.org.cn/Edit.jsp?page=Panoptes"><u><font color=#0000ff>Panoptes</font></u></a>
    <li><a class=editpage title="Create 'EJToolsJMXBrowser'" href="http://wiki.matrix.org.cn/Edit.jsp?page=EJToolsJMXBrowser"><u><font color=#0000ff>EJTools JMX Browser</font></u></a>
    <li><a class=wikipage href="http://wiki.matrix.org.cn/Wiki.jsp?page=JManage"><u><font color=#0000ff>jManage</font></u></a></li>
</ul>
<img src ="http://www.blogjava.net/masen/aggbug/109157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 22:18 <a href="http://www.blogjava.net/masen/articles/109157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Burlap</title><link>http://www.blogjava.net/masen/articles/109155.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109155.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109155.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109155.html</trackback:ping><description><![CDATA[是Hessian的基于XML实现<br>Burlaphttp://www.caucho.com/resin-3.0/protocols/burlap.xtp协议，感觉确实比Xmlrpc来的简洁
<img src ="http://www.blogjava.net/masen/aggbug/109155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 22:09 <a href="http://www.blogjava.net/masen/articles/109155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hessian</title><link>http://www.blogjava.net/masen/articles/109140.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 12:10:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109140.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109140.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109140.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">相比WebService，Hessian更简单、快捷。采用的是二进制RPC协议，因为采用的是二进制协议，所以它很适合于发送二进制数据。下面演示一个简单的Hessian示例程序。</p>
<p style="FONT-SIZE: 10pt"><a tels="_Toc137531456"></a>14.5.1.1 Hessian的下载和安装</p>
<p style="FONT-SIZE: 10pt">Hessian的下载和安装请按如下步骤进行：</p>
<p style="FONT-SIZE: 10pt">（1）登陆http://www.caucho.com/hessian/下载Hessian的Java二进制包，笔者成书之时，Hessian的最新版本是Hessian 3.0.13。下载hessian-3.0.13.jar文件。</p>
<p style="FONT-SIZE: 10pt">（2）将该文件复制到名为hessian的Web应用下，所有的jar文件都应该放在WEB-INF/lib下，该文件也不例外。</p>
<p style="FONT-SIZE: 10pt">（3）为了编译Hessian客户端程序，建议将hessian-3.0.13.jar添加到环境变量里。</p>
<p style="FONT-SIZE: 10pt"><a tels="_Toc137531457"></a>14.5.1.2 Hessian服务器端</p>
<p style="FONT-SIZE: 10pt">推荐采用面向接口编程，因此，Hessian服务建议通过接口暴露。服务接口如下：</p>
<p style="FONT-SIZE: 10pt">//服务接口</p>
<p style="FONT-SIZE: 10pt">public interface Hello</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //方法声明</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; public String hello(String name); </p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">接口的实现类如下：</p>
<p style="FONT-SIZE: 10pt">//服务实现类，实现Hello接口</p>
<p style="FONT-SIZE: 10pt">public class HelloImpl implements Hello</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; public String hello(String name)</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return "hello " + name + "欢迎学习Hessian"; </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">这个接口和实现类简单得难以置信。它们没有任何特别之处，这正是Hessian的魅力，代码污染降低到最小。当然，只是示例程序，所以服务也相当简单。Hessian要求远程服务通过Servlet暴露出来，必须在web.xml文件中配置该Servlet。web.xml的详细配置如下：</p>
<p style="FONT-SIZE: 10pt">&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;!--&nbsp; Web配置文件的文件头，包含dtd等信息--&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;!DOCTYPE web-app</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p style="FONT-SIZE: 10pt">"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;!--&nbsp; Web配置文件的根元素--&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;web-app&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;servlet&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; 配置Servlet名，后面根据该名完成远程服务映射--&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;hessianService&lt;/servlet-name&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; Hessian远程服务需要HessianServlet暴露Hehes--&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.caucho.hessian.server.HessianServlet&lt;/servlet-class&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; 随应用启动而启动&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; 使用init-param配置服务的实现类--&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;service-class&lt;/param-name&gt; </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;lee.HelloImpl&lt;/param-value&gt; </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;/servlet&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;!--&nbsp; 映射Servlet的url，该Servlet的url就是Hessian服务名--&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;hessianService&lt;/servlet-name&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; 远程服务名为hessianService--&gt;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/hessianService&lt;/url-pattern&gt; </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;/web-app&gt;</p>
<p style="FONT-SIZE: 10pt">将刚才的接口和实现放Web应用的WEB-INF/class路径下，编译它们。然后将此web.xml文件放在WEB-INF下，启动Web服务器。笔者使用的Web服务器是Tomcat5.0.28，Tomcat的端口是8888。则远程服务的url为：http://localhost:8888/hessian/hessianService。</p>
<p style="FONT-SIZE: 10pt"><a tels="_Toc137531458"></a>14.5.1.3 Hessian客户机端</p>
<p style="FONT-SIZE: 10pt">Hessian的服务可以用HessianProxyFactory工具类调用，还可以在小型智能设备上调用。HessianProxyFactory的create方法，用于获取Hessian服务的远程引用。Hessian的客户端如下：</p>
<p style="FONT-SIZE: 10pt">public class HessianClient </p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; public static void main(String []args) throws Exception</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Hessian服务的url</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; String url = "http://localhost:8888/hessian/hessianService";</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建HessianProxyFactory实例</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; HessianProxyFactory factory = new HessianProxyFactory();</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得Hessian服务的远程引用</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Hello d = (Hello) factory.create(Hello.class, url);</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用远程服务。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; System.out.println("下面调用Hessian服务: " + d.hello("yeeku"));</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">客户端仅仅需要Hello接口，而无须真实的实现类。如果使用小型智能设备作为客户端的运行环境，客户端代码片段如下：</p>
<p style="FONT-SIZE: 10pt">//创建Hessian输入流，用于输入请求</p>
<p style="FONT-SIZE: 10pt">MicroHessianInput in = new MicroHessianInput();</p>
<p style="FONT-SIZE: 10pt">//Hessian服务的url</p>
<p style="FONT-SIZE: 10pt">String url = "http://localhost:8888/hessian/hessianService";</p>
<p style="FONT-SIZE: 10pt">//创建HttpSConnection实例</p>
<p style="FONT-SIZE: 10pt">HttpConnection c = (HttpConnection) Connector.open(url);</p>
<p style="FONT-SIZE: 10pt">//设置参数提交方式</p>
<p style="FONT-SIZE: 10pt">c.setRequestMethod(HttpConnection.POST);</p>
<p style="FONT-SIZE: 10pt">//打开输出流，准备调用服务器方法</p>
<p style="FONT-SIZE: 10pt">OutputStream os = c.openOutputStream();</p>
<p style="FONT-SIZE: 10pt">//以输出流创建MicroHessianOutput对象，该对象用于调用hessian的方法</p>
<p style="FONT-SIZE: 10pt">MicroHessianOutput out = new MicroHessianOutput(os);</p>
<p style="FONT-SIZE: 10pt">//调用远程方法:hello是方法名,yeeku是参数</p>
<p style="FONT-SIZE: 10pt">out.call("hello", &#8220;yeeku&#8221;);</p>
<p style="FONT-SIZE: 10pt">os.flush();</p>
<p style="FONT-SIZE: 10pt">//打开输入流，准备接收返回值</p>
<p style="FONT-SIZE: 10pt">is = c.openInputStream();</p>
<p style="FONT-SIZE: 10pt">以输入流为参数，创建MicroHessianInput对象</p>
<p style="FONT-SIZE: 10pt">MicroHessianInput in = new MicroHessianInput(is);</p>
<p style="FONT-SIZE: 10pt">获得返回值</p>
<p style="FONT-SIZE: 10pt">Object value = in.readReply(&#8220;yeeku&#8221;);</p>
<!-- page -->
<img src ="http://www.blogjava.net/masen/aggbug/109140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 20:10 <a href="http://www.blogjava.net/masen/articles/109140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDO</title><link>http://www.blogjava.net/masen/articles/109134.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109134.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109134.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109134.html</trackback:ping><description><![CDATA[原文：<a href="http://www.libelis.com/inner-index.jsp?next=jdo.html" target=_blank><u><font color=#800080>http://www.libelis.com/inner-index.jsp?next=jdo.html</font></u></a><br><br>JDO是Java对象持久化的新的规范。JDO经SunJava Community Process认定。<br>
<h3>一、历史</h3>
JDO是对象持久化工作的综合成果，试图提供一个对象持久化的完全版本。JDO同时继承于ODMG（对象数据管理小组，标准化对象数据库的一个独立委员会）和对象关系映射工具提供商。<br>JSR #000012 approved in July 1999<br>1999-8组建的专家小组：包括Sun、Apple、BEA、IBM、Oracle、SAP、WebGain等<br>2000-5 完成公开评论草案<br>2000-6 在JavaOne上引入<br>2001-3 最终草案0.93<br>2001-5 最终草案0.96公布<br>2001-6 在JavaOne上启动<br>2001-11 最终草案0.98<br><br>
<h3>二、目标</h3>
定义对象级的持久化。<br>
<ul>
    <li>完全支持对象模型，包括引用、集合、接口、继承<br>
    <li>完全透明持久化：这使得业务对象完全独立于任何数据库技术，这使用了一个字节码增强机制（a byte-code enhancement mechanism）。<br>
    <li>缩短开发周期（不再需要映射）<br>
    <li>在开发小组中清晰地划分业务人员和数据库人员。<br>
    <li>通用持久性<br> JDBC限于RDBMS，JDO潜在地可以处理任何类型的数据源，包括RDBMS，ODBMS，TP监控处理，ASCII无格式文件，xml文件，properties文件，大机上的Cobol数据库，等<br> JDO是面向大型信息系统的一个完全的解决方案，在这样的系统中，信息存储于多种异质数据源<br>
    <li>涵盖J2EE、J2SE、J2ME的广泛实现<br>
    <li>强壮的事务模型<br>
    <li>同时支持C/S和多层体系结构</li>
</ul>
<br><br>
<h3>三、体系</h3>
<h5>JDO 包</h5>
PersistentCapable：拥有持久实例的类必须实现这个接口。管理对象生命周期。<br>PersistenceManager ：代表了到数据源的连接。一个应用可以打开一个或多个PersistenceManagers。<br>PersistenceManagerFactory：允许从数据源中得到一个PersistenceManager的实例，这个工厂也可以作为一个连接池。 <br>Transaction：允许界定事务 <br>Query ：允许明确地声明性地使用JDO查询语言从数据源中获取数据。NB：也可以通过引用之间的基本的定位，隐含地、透明地从数据源中获取对象。 <br>InstanceCallback：在数据库操作中（比如before/after read, before/after write，等），定义一些钩子，以做特殊处理（像暂时属性的初始化）。<br>JDOException：JDO操作中抛出的例外。<br><br>JDO也定义了帮助类，对象标识（由应用或数据源管理）<br>JDO实现可以支持或不支持兼容的PersistenceManager（当PersistenceManager是兼容的时，你可以得到存储于不同数据库的对象引用）。<br>NB：在JDO的第一个发布版本中，并没有严格地定义锁和锁策略。<br><br>
<h5>JDO对象模型</h5>
<ul>
    <li>JDO对象模型基本上是Java的对象模型，包括所有的基本类型，引用，集合和事件接口。<br>
    <li>除了系统定义类（system-defined classes），支持所有的字段类型（包括简单型、可变和不变的对象类型〔immutable and mutable object types〕、用户定义类、数组、集合、接口）。<br>
    <li>支持所有的成员变量修饰符（private, public, protected, static, transient, abstract, final, synchronized, volatile）<br>
    <li>除了对象状态依赖于不可访问的或远程对象，即继承于java.net.SocketImpl、本地方法等，所有的用户定义类都可以是PersistentCapable。</li>
</ul>
<br><br>
<h5>JDO对象生命周期</h5>
为了能够在数据源中访问、存储对象，应用必须首先得到一个或几个数据源的连接。一个JDO PersistenceManager对象就代表了这样一个连接。它可以通过PersistenceManagerFactory类得到。持久化对象必须是实现了PersistentCapable接口的类的实例。这样的类可能同时拥有持久化的或临时的（transient）实例。<br><br>为了使一个实例持久化，编程者必须调用PersistentManager的makePersistent方法。通知JDO对象为持久化或临时的很重要，即使它们可以从JDO的行为中得到它是临时的，比如事务管理和对象标识。对象标识可以由应用管理，或者由数据源代理（这大多是在使用ODBMS实例时，因为概念ObjectID本身就是ODMG模型的一部分）。<br><br>JDO支持一种持久化模型，这这种模型中持久性自动传播到引用的对象。这种机制经常称为&#8220;延伸持久（persistence by reachability）&#8221;或者&#8220;传递持久（transitive persistence）&#8221;。这意味着一旦一个已经持久化的对象引用了一个临时对象，这个临时对象自动变成持久化的。对于JDBC编程者，这个模型可能很奇怪，但是他们会发现这是大多数情况下编程者希望从持久化框架中得到的支持。<br><br>例子：
<pre>pmf = (PersistenceManagerFactory) (Class.forName(<font color=#000099>"com.libelis.lido.PersistenceManagerFactory"</font>).newInstance()); <br>pmf.setConnectionDriverName(<font color=#000099>"versant"</font>); <br>pmf.setConnectionURL(dbName); <br>pm = pmf.getPersistenceManager(); <br>tx = pm.currentTransaction(); <br>tx.begin(); <br>Provider aProvider = <strong>new</strong> Provider(<font color=#000099>"LIBeLIS"</font>); <br>pm.makerPersistent(aProvider); <font color=#006600><em>// aProvider now persists </font></em><br>Address anAddress = <strong>new</strong> Address(<font color=#000099>"25 rue Paul Barruel"</font>, <font color=#000099>"France"</font>, <font color=#000099>"Paris"</font>); <br>aProvider.address = anAddress ; <font color=#006600><em>// anAddress now persists </font></em><br>tx.commit(); <br>pm.close(); <br></pre>
<br>对象或者通过明确的JDO查询结果从内存中得到，或者通过标准的Java对象之间的导航（navigation）得到。<br><br>最后这个机制很强大，你可以把持久对象想像为在JVM堆中的一个特殊的部分，我们称之为&#8220;客户端缓存（client cache）&#8221;。每次当你企图从一个对象导航到另一个时，如果这个对象尚不在内存中，JDO会自动从数据源中获取，并把它放在缓存中。<br><br>例子<br>假设aProvider对象已经装载到内存，但是它的Address对象还没有。当你写下如下代码时：
<pre>System.out.println(aProvider.address.city);<br></pre>
<br>Address对象会自动装载。缓存管理自动链接到事务边界（transaction boundaries），这意味着缓存将在事务结束是刷新，所有的实体都标示为无效的。下次对象访问它们的状态时，自动地、透明地从数据源中再次装载。<br><br>例子
<pre>pmf = (PersistenceManagerFactory) (Class.forName(<font color=#000099>"com.libelis.lido.PersistenceManagerFactory"</font>).newInstance()); <br>pmf.setConnectionDriverName(<font color=#000099>"versant"</font>); <br>pmf.setConnectionURL(dbName); <br>pm = pmf.getPersistenceManager(); <br>tx = pm.currentTransaction(); <br>tx.begin(); <br>Provider aProvider = <strong>new</strong> Provider(<font color=#000099>"LIBeLIS"</font>); <br>pm.makerPersistent(aProvider); <br>Address anAddress = <strong>new</strong> Address(<font color=#000099>"25 rue Paul Barruel"</font>, <font color=#000099>"France"</font>, <font color=#000099>"Paris"</font>); <br>aProvider.address = anAddress ; <br>tx.commit(); <font color=#006600><em>// objects are stored into the data source, client cache is discarded, references are invalid </font></em><br>tx.begin(); <br>System.out.println(aProvider); <font color=#006600><em>// aProvider is refreshed from the data source </font></em><br>tx.commit(); <br>pm.close();<br></pre>
<br>每次你修改了一个对象，它在JDO缓存中对应的实体将被标示为&#8220;脏（dirty）&#8221;。<br><br>例子
<pre>tx.begin(); <br>aProvider.address = aNewAdr; <font color=#006600><em>// aProvider is marked as dirty </font></em><br>tx.commit(); <font color=#006600><em>// aProvider will updated in the data source</font></em><br></pre>
<br>在事务的结束，PersistentManager 将把所有标示为&#8220;脏&#8221;的JDO对象（脏对象）更新到数据源中。<br><br>JDO缓存中的每一个对象都有自己的状态（实际上它们都和一个StateManager对象相关联）。并且JDO规范规定了一大堆状态和它们之间的过渡。如果感兴趣，请参照JDO规范了解详细。<br>NB：这些状态一般是JDO提供商关心的，而不是JDO编程者。<br>
<h5>开发周期</h5>
为了达到上面提到的完全透明的持久化，JDO定义了一个称为&#8220;增强（Enhancement）&#8221;的字节码工具机制（byte-code instrumentation mechanism）。它的思想是从业务类中剔除所有的显式的数据库依赖代码。和已存在的或新的数据源的映射通过外部的元数据（metadata）XML文件定义。<br>JDO增强器读取编译的java文件（.class文件），并且应用元数据文件中定义的持久化规则。例示如下：<br><img src="http://www.javaresearch.org/members/bruce/images/jdoEnhancer.png"><br>增强会添加到元数据文件描述的类的字节码中：<br>&#8226; 实现PersistentCapable接口的声明<br>&#8226; 该接口中声明的方法的字节码必须被实现<br>&#8226; 当修改了一个属性后该对象标示为&#8220;脏&#8221;的代码<br>&#8226; 需要时从数据源中获取对象的代码<br>&#8226; 根据元数据文件中指定的从数据源中的原始数据（raw data）到Java对象映射的代码<br>NB：在专家小组中，是否要把增强列入JDO规范曾经激烈争论过。一些专家认为开发者可能会被增强技术吓倒。不熟悉这个技术的开发者会惊讶于字节码增强，这是一个事实。但是增强是这样一种通用、强大的开发技术，可以在很多案例中有效地使用。开始时，每当开发者遇到一个Bug时，可能会责难增强器。我们强烈推荐增强器的&#8220;新手&#8221;仔细地看一下BCEL网站（由Source Forge开源社区提供）。在那儿，你能看到许多关于字节码增强的有用信息和工具。这种机制的熟手可以在他们的Java接口中成功地使用。所有的熟手都表现出了兴趣。<br><br>
<h5>在两层（Client/Server）结构中整合</h5>
在传统的Client/Server体系中，JDO应用需要使用由JDO实现提供的PersistenceManagers把它自己连接到一个或多个数据源。<br><img src="http://www.javaresearch.org/members/bruce/images/jdoClientServer.png"><br><br>临时对象可以持有持久对象的引用。持久对象可以持有分布在多个PersistenceManagers中的持久对象的引用。但是这不是一个必须遵从的特性。<br>大部分数据库相关的代码都从业务对象中移去，但是事务仍需要编程者明确的划分（使用Transaction 的begin、commit、rollback方法）。<br>管理运行在内存中的Java模型和磁盘上的数据源的物理模型之间的映射是PersistentManager的职责。当使用ODBMS时，这个映射非常直接，但使用RDBMS或更简单的数据源时可能会非常复杂。<br>
<h3>四、JDO和J2EE</h3>
JDO已经设计为整合入J2EE体系。JDO依靠一个新的Connector规范来管理一个J2EE应用和JDO容器之间的交互。在JDO规范中这个描述为管理环境（managed environments，意思是事务和连接由应用服务器自己管理）。JDO容器和J2EE应用服务器交互，得到数据源的连接（因为应用有它自己的连接池），并根据应用服务器的JTA兼容的事务管理器执行事务。<br><img src="http://www.javaresearch.org/members/bruce/images/jdoJ2eeContract.png"><br>JDO明确的解决了J2EE体系的一个主要缺陷，就是EJB部件模型将持久性和分布性结合起来。这两个概念是不相关的，但是EJB规范试图简化，迫使应用对持久性和分布性使用相同的粒度级别。这在软件工程的视角并不清晰，并且也不具可扩展性。<br>另外一点，EJB持久模型（CMP和BMP）过分简化了，只能应付有限的情况，不适合现实的应用需要。感兴趣的读者可以可以很容易地J2EE的门户中（例如the ServerSide）找到大量的EJB持久性和JDO的讨论。<br>使用JDO，你可以使用一种非常优雅、通用的设计：Session Bean（访问业务处理对象）自己访问业务数据对象。这样做，应用仍然拥有J2EE体系所有的优点（分布式、事务、连接，&#8230;），并且持久化由JDO透明、高效地管理。<br><img src="http://www.javaresearch.org/members/bruce/images/jdoEjbDesignPattern.png"><br>JDO可以支持在异种数据源中非常复杂的映射机制，然而，EJB/CMP模型仅适用于简单的JDBC模型。<br>使用JDO你没有业务对象的复杂性的限制（然而EJB/CMP不支持继承）。<br>使用JDO在你的业务数据对象中完全没有数据库代码（然而使用EJB/BMP 你的业务代码会掺杂入JDBC代码）<br>业务处理对象提供了处理多个业务数据对象的方法。<br>业务处理对象通常是非持久化的，它们通常通过混合的JDO查询和导航得到业务数据对象。<br>从SessionBean中剥离业务处理方法仍然很重要，因为这样你的业务模型可以把众多应用中任何的基础构架应用到J2EE应用中。<br>
<h3>资源链接</h3>
<p><br>&#8226; <a href="http://www.jcp.org/aboutJava/communityprocess/first/jsr012/index.html" target=_blank><u><font color=#0000ff>Sun JDO Specification </font></u></a><br>&#8226; <a href="http://www.jcp.org/jsr/detail/12.jsp" target=_blank><u><font color=#0000ff>JDO JSR page </font></u></a><br>&#8226; <a href="http://access1.sun.com/jdo/" target=_blank><u><font color=#0000ff>Sun JDO site </font></u></a><br>&#8226; <a href="http://bcel.sourceforge.net/" target=_blank><u><font color=#0000ff>Byte-code enhancement web sites </font></u></a><br>&#8226; <a href="http://www.libelis.com/inner-index.jsp?next=ProductDetail.jsp&amp;NID=21" target=_blank><u><font color=#0000ff>LIBeLIS LiDO site </font></u></a><br>&#8226; <a href="http://www.versant.com/products/enjin/index.html" target=_blank><u><font color=#0000ff>Versant enJin </font></u></a></p>
<p>摘自：<a href="http://www.javaresearch.org/article/showarticle.jsp?column=108&amp;thread=2406"><u><font color=#0000ff>http://www.javaresearch.org/article/showarticle.jsp?column=108&amp;thread=2406</font></u></a></p>
<!--##original##-->
<img src ="http://www.blogjava.net/masen/aggbug/109134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 19:36 <a href="http://www.blogjava.net/masen/articles/109134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CORBA </title><link>http://www.blogjava.net/masen/articles/109133.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 11:18:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109133.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109133.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109133.html</trackback:ping><description><![CDATA[<p><big><font color=#ff9900 size=5>CORBA 是什么</font></big>
<ul>
    <p><font color=#3399ff>公用对象请求代理（调度）程序体系结构（Common Object Request Broker Architecture），缩写为 CORBA，是对象管理组织（Object Management Group）对应当今快速增长的软硬件的协同工作能力的要求而提出的方案。简而言之，CORBA 允许应用程序和其他的应用程序通讯，而不论他们在什么地方或者由谁来设计。CORBA 1.1 由对象管理组织在 1991 年发布。他定义了接口定义语言（IDL）和应用编程接口（API），从而通过实现对象请求代理（ORB）来激活客户/服务器的交互。CORBA 2.0 于 1994 年的 12 月发布。他定义了如何跨越不同的 ORB 提供者而进行通讯。</font> </p>
    <p><font color=#3399ff>ORB 是一个中间件，他在对象间建立客户-服务器的关系。通过 ORB，一个客户可以很简单地使用服务器对象的方法而不论服务器是在同一机器上还是通过一个网络访问。ORB 截获调用然后负责找到一个对象实现这个请求，传递参数和方法，最后返回结果。客户不用知道对象在哪里，是什么语言实现的，他的操作系统以及其他和对象接口无关的东西。</font> </p>
    <p><font color=#3399ff>在传统的客户/服务器程序中，开发者使用他们自己设计的或者公认的标准定义设备之间的协议。协议的定义依赖于实现的语言，网络的传输和其他许许多多因素。ORB 将这个过程简单化。使用 ORB，协议定义是通过应用接口，而该接口是接口定义语言（IDL）的一个实现，他和使用的编程语言无关的。并且 ORB 提供了很大的灵活性。他让程序员选择最适当的操作系统，运行环境和设计语言来建设系统中每个组件。更重要的是，他允许集成已经存在的组件。</font> </p>
    <p><font color=#3399ff>CORBA 是在面向对象标准化和互操作性道路上的一个信号。通过 CORBA，用户不必要知道软硬件的平台和他们处在企业网的什么地方就可以操作。</font> </p>
</ul>
<p><big><font color=#ff9900 size=5>ORB 结构</font></big>
<ul>
    <p><font color=#3399ff>下面我来用些图形说明一下：</font> </p>
    <p align=center><font color=#3399ff>通过 ORB 发送请求<br><img height=221 src="http://docs.huihoo.com/gnu/linux/arch2a.gif" width=427 tppabs="http://www.chinalinuxpub.com/doc/pro/arch2a.gif"> </font></p>
    <p><font color=#3399ff>上面的图形说明的是客户端发送一个请求到对象的实现。客户端是希望对某对象执行操作的实体。对象的实现是一片代码和数据来实际实现对象。ORB 负责下面的必要的机制：对该请求找到对象的实现，让对象的实现准备好接受请求，和请求交换数据。客户端的接口完全独立于对象的位置，其实现的语言和其他不影响对象接口的东西。</font></p>
    <p align=center><font color=#3399ff>ORB 接口的结构<br><img height=317 src="http://docs.huihoo.com/gnu/linux/arch2a1.gif" width=467 tppabs="http://www.chinalinuxpub.com/doc/pro/arch2a1.gif"> </font></p>
    <p><font color=#3399ff>上面的图形显示的是一个独立的对象请求代理（ORB）的结构。ORB 的接口是灰色的矩形。箭头说明 ORB 的调用关系。</font></p>
    <p><font color=#3399ff>为了提出一个请求，客户端可以使用动态调用接口（Dynamic Invocation Interface）（和目标对象的接口独立）或者一个 OMG 的 IDL 占位程序（具体的占位程序依赖于目标对象的接口）。客户端也可以直接和 ORB 在某些地方交互。</font></p>
    <p><font color=#3399ff>对象的实现通过 OMG 的 IDL 产生的骨架或者是一个动态骨架的调用来接受请求。对象的实现可能在处理请求或其他的时候调用 ORB。</font></p>
    <p><font color=#3399ff>对象接口定义的定义可以有下面两种方式。接口可以通过接口定义语言静态的定义，这叫做 OMG 的 IDL。该语言按照可以进行的操作和该操作的参数定义对象类型。或者（也可以作为补充），接口可以加入到 Interface Repository service。该服务描述了该接口作为一个对象的组件，并允许运行时访问这些组件。在任何 ORB 实现中，IDL 和 Interface Repository 有相同的表达能力。</font></p>
    <p align=center><font color=#3399ff>客户端使用占位程序或者动态调用接口<br><img height=317 src="http://docs.huihoo.com/gnu/linux/arch2a2.gif" width=433 tppabs="http://www.chinalinuxpub.com/doc/pro/arch2a2.gif"> </font></p>
    <p><font color=#3399ff>客户端通过访问对象的对象引用和了解对象的类型及要求执行的操作来发布一个请求。客户调用占位程序例程来请求或者动态构造请求。</font></p>
    <p><font color=#3399ff>无论动态还是占位程序的接口都可以相同实现。接收方不可能知道请求是如何发布的。</font></p>
    <p align=center><font color=#3399ff>对象的实现接受请求<br><img height=317 src="http://docs.huihoo.com/gnu/linux/arch2a3.gif" width=465 tppabs="http://www.chinalinuxpub.com/doc/pro/arch2a3.gif"> </font></p>
    <p><font color=#3399ff>ORB 向对象实现定位适当的代码，传递参数，传输控制。这一切都通过 IDL 骨架或者动态骨架。骨架对于不同的接口和对象适配器是不同的。在执行该请求的时候，对象的实现可能由 ORB 通过对象适配器来获得一定的服务。当请求完成，控制和输出值返回给客户。</font></p>
    <p><font color=#3399ff>对象的实现可能会选择使用的对象适配器。该决定基于对象的实现要求的服务。</font></p>
    <p align=center><font color=#3399ff>接口和 Implementation Repositories<br><img src="http://docs.huihoo.com/gnu/linux/arch2a.gif" tppabs="http://www.chinalinuxpub.com/doc/pro/arch2a.gif"> </font></p>
    <p><font color=#3399ff>上图说明的是接口和实现信息如何让客户和对象实现访问的。接口用 OMG 的 IDL 和/或 Interface Repository 定义。该定义用于产生客户占位程序和对象的实现的骨架。</font></p>
    <p><font color=#3399ff>对象的实现的信息在安装时就提供好了，储存在 Implementation Repository 中以便请求发布的时候使用。</font></p>
</ul>
<img src ="http://www.blogjava.net/masen/aggbug/109133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 19:18 <a href="http://www.blogjava.net/masen/articles/109133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IIOP </title><link>http://www.blogjava.net/masen/articles/109088.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 04:18:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109088.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109088.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109088.html</trackback:ping><description><![CDATA[<font face=Arial>Internet&nbsp;Inter-ORB&nbsp;Protocol(互联网内部对象请求代理协议)，Java中使得程序可以和其他语言的CORBA实现实现互操作性的协议。 </font><br><br>
<img src ="http://www.blogjava.net/masen/aggbug/109088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 12:18 <a href="http://www.blogjava.net/masen/articles/109088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AOP</title><link>http://www.blogjava.net/masen/articles/109085.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109085.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109085.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109085.html</trackback:ping><description><![CDATA[<p><strong>为什么要区分J2EE容器和J2EE应用系统？</strong></p>
<p>　　我们知道，J2EE应用系统只有部署在J2EE容器中才能运行，那么为什么划分为J2EE容器和J2EE应用系统？ 通过对J2EE容器运行机制的分析（见我的电子教材&#8220;EJB实用原理&#8221;），我们可以发现：实际上J2EE容器分离了一般应用系统的一些通用功能，例如事务机制、安全机制以及对象池或线程池等性能优化机制。</p>
<p>　　这些功能机制是每个应用系统几乎都需要的，因此可以从具体应用系统中分离出来，形成一个通用的框架平台，而且，这些功能机制的设计开发有一定难度，同时运行的稳定性和快速性都非常重要，必须经过长时间调试和运行经验积累而成，因此，形成了专门的J2EE容器服务器产品，如Tomcat JBoss、Websphere、WebLogic等。</p>
<p>　　从J2EE系统划分为J2EE容器和J2EE应用系统两个方面，我们已经看到一种分散关注的思路（separation of concerns）。<br><br><strong>分散关注</strong><br><br>　　将通用需求功能从不相关类之中分离出来；同时，能够使得很多类共享一个行为，一旦行为发生变化，不必修改很多类，只要修改这个行为就可以。<br><br>　　 AOP就是这种实现分散关注的编程方法，它将&#8220;关注&#8221;封装在&#8220;方面&#8221;中。</p>
<p><strong>AOP是什么？</strong></p>
<p>　　AOP是OOP的延续，是Aspect Oriented Programming的缩写，意思是面向方面编程。AOP实际是GoF设计模式的延续，设计模式孜孜不倦追求的是调用者和被调用者之间的解耦，AOP可以说也是这种目标的一种实现。</p>
<p>　　举例：假设有在一个应用系统中，有一个共享的数据必须被并发同时访问，首先，将这个数据封装在数据对象中，称为Data Class，同时，将有多个访问类，专门用于在同一时刻访问这同一个数据对象。</p>
<p>　　为了完成上述并发访问同一资源的功能，需要引入锁Lock的概念，也就是说，某个时刻，当有一个访问类访问这个数据对象时，这个数据对象必须上锁Locked，用完后就立即解锁unLocked，再供其它访问类访问。</p>
<p>　　使用传统的编程习惯，我们会创建一个抽象类，所有的访问类继承这个抽象父类，如下：</p>
<center></center>
<div align=center></div>
<table cellSpacing=0 cellPadding=0 width="80%" align=center border=0>
    <tbody>
        <tr>
            <td bgColor=#cccccc>
            <p>abstract class Worker{</p>
            <p>　　abstract void locked();<br>　　abstract void accessDataObject();<br>　　abstract void unlocked();</p>
            <p>}</p>
            </td>
        </tr>
    </tbody>
</table>
<br>　　缺点：
<ul>
    <li>accessDataObject()方法需要有&#8220;锁&#8221;状态之类的相关代码。
    <li>Java只提供了单继承，因此具体访问类只能继承这个父类，如果具体访问类还要继承其它父类，比如另外一个如Worker的父类，将无法方便实现。
    <li>重用被打折扣，具体访问类因为也包含&#8220;锁&#8221;状态之类的相关代码，只能被重用在相关有&#8220;锁&#8221;的场合，重用范围很窄。<br><br>仔细研究这个应用的&#8220;锁&#8221;，它其实有下列特性：
    <li>&#8220;锁&#8221;功能不是具体访问类的首要或主要功能，访问类主要功能是访问数据对象，例如读取数据或更改动作。
    <li>&#8220;锁&#8221;行为其实是和具体访问类的主要功能可以独立、区分开来的。
    <li>&#8220;锁&#8221;功能其实是这个系统的一个纵向切面，涉及许多类、许多类的方法。如下图：<br><img height=258 src="http://www.jdon.com/AOPdesign/images/lock.png" width=250> <br></li>
</ul>
<p>　　因此，一个新的程序结构应该是关注系统的纵向切面，例如这个应用的&#8220;锁&#8221;功能，这个新的程序结构就是aspect（方面）</p>
<p>　　在这个应用中，&#8220;锁&#8221;方面（aspect）应该有以下职责：</p>
<p>　　提供一些必备的功能，对被访问对象实现加锁或解锁功能。以保证所有在修改数据对象的操作之前能够调用lock()加锁，在它使用完成后，调用unlock()解锁。</p>
<p><strong>AOP应用范围</strong><br><br>　　很明显，AOP非常适合开发J2EE容器服务器，目前JBoss 4.0正是使用AOP框架进行开发。<br>　　具体功能如下：<br>Authentication 权限<br>Caching 缓存<br>Context passing 内容传递<br>Error handling 错误处理<br>Lazy loading　懒加载<br>Debugging　　调试<br>logging, tracing, profiling and monitoring　记录跟踪　优化　校准<br>Performance optimization　性能优化<br>Persistence　　持久化<br>Resource pooling　资源池<br>Synchronization　同步<br>Transactions 事务</p>
<p><strong>AOP有必要吗？</strong></p>
<p>　　当然，上述应用范例在没有使用AOP情况下，也得到了解决，例如JBoss 3.XXX也提供了上述应用功能，但是没有使用AOP。</p>
<p>　　但是，使用AOP可以让我们从一个更高的抽象概念来理解软件系统，AOP也许提供一种有价值的工具。可以这么说：因为使用AOP结构，现在JBoss 4.0的源码要比JBoss 3.X容易理解多了，这对于一个大型复杂系统来说是非常重要的。</p>
<p>　　从另外一个方面说，好像不是所有的人都需要关心AOP，它可能是一种架构设计的选择，如果选择J2EE系统，AOP关注的上述通用方面都已经被J2EE容器实现了，J2EE应用系统开发者可能需要更多地关注行业应用方面aspect。</p>
<p><br><strong>AOP具体实现</strong></p>
<p>　　AOP是一个概念，并没有设定具体语言的实现，它能克服那些只有单继承特性语言的缺点（如Java），目前AOP具体实现有以下几个项目：</p>
<p>　　AspectJ (TM)：　创建于Xerox PARC. 有近十年历史，成熟<br>　　缺点：过于复杂；破坏封装；需要专门的Java编译器。</p>
<p>　　动态AOP：使用JDK的动态代理API或字节码Bytecode处理技术。<br><br>　　基于动态代理API的具体项目有：<br><a href="http://www.jboss.org/index.html?module=html&amp;op=userdisplay&amp;id=developers/pro" target=_blank><u><font color=#0000ff>　　JBoss 4.0</font></u></a> JBoss 4.0服务器<br><a href="http://nanning.sourceforge.net/" target=_blank><u><font color=#0000ff>　　nanning</font></u></a>　这是以中国南宁命名的一个项目，搞不清楚为什么和中国相关？是中国人发起的？<br><br>　　基于字节码的项目有：<br><a href="http://aspectwerkz.codehaus.org/" target=_blank><u><font color=#0000ff>　　aspectwerkz</font></u></a>　<br><a href="http://springframework.org/" target=_blank><u><font color=#0000ff>　　spring　？</font></u></a><br></p>
<p>在以后其它文章中，我将继续对AOP概念进行分析，和大家一起学习进步。</p>
<p><strong>参考资料：</strong><br><a href="http://www.voelter.de/data/articles/aop/aop.html" target=_blank><font color=#0000ff><u>http://www.voelter.de/data/articles/aop/aop.html</u></font></a><br><a href="http://www.ociweb.com/javasig/knowledgebase/2003-12/Aspect-Oriented_Java_Development.pdf" target=_blank><font color=#0000ff><u>Aspect-Oriented_Java_Development.pdf</u></font></a></p>
<p><a href="http://www.jdon.com/jdonframework/acl.htm" target=_blank><u><font color=#0000ff></font></u></a>&nbsp;</p>
<img src ="http://www.blogjava.net/masen/aggbug/109085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 12:17 <a href="http://www.blogjava.net/masen/articles/109085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI</title><link>http://www.blogjava.net/masen/articles/109084.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109084.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109084.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109084.html</trackback:ping><description><![CDATA[<span class=tpc_content>JNDI全称 Java Naming and Directory Interface <br>JNDI 是Java平台的一个标准扩展，提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样，JDNI是provider-based的技术，暴露了一个API和一个服务供应接口（SPI）。这意味着任何基于名字的技术都能通过JNDI而提供服务，只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service（COS）名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术，包括EJB都依靠JNDI来组织和定位实体。 <br>JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中，文件名被绑定给文件。在DNS中，一个IP地址绑定一个URL。在目录服务中，一个对象名被绑定给一个对象实体。 <br>JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如，每个上下文提供了一个查找操作，返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间，即使用分层上下文以及使用相同命名语法的子上下文。 <br>jndi的用途： <br>1。你可以用jndi来得到object类的属性 <br>如：Attribute attr =directory.getAttributes(personName).get("email"); <br>String email = (String)attr.get(); <br>2。你可以用jndi来搜索对象 <br>如：foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls); <br>查找谁的名字叫Fox在wiz部门的员工？ <br>3。你可以用jndi通过naming/directory服务查询像printers和databases的对象 <br>如：查询 Printer <br>Printer printer = (Printer)namespace.lookup(printerName); <br>printer.print(document); <br>4。你可以用jndi列表出命名空间的特殊级别的内容 <br>如： <br>NamingEnumeration list = namespace.list("o=Widget, c=US"); <br>while (list.hasMore()) { <br>NameClassPair entry = (NameClassPair)list.next(); <br>display(entry.getName(), entry.getClassName()); <br>} <br>以上根据jndi文档翻译的 <br>地址： <br><a href="http://java.sun.com/products/jndi/overview.html" target=_blank><u><font color=#800080>http://java.sun.com/products/jndi/overview.html</font></u></a> <br>tomcat数据库连接池配置中的 <br>java:comp/env代表你的JVM的环境,comp=computer env=environment <br><br><br>JNDI(The Java Naming and Directory Interface，Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来，使得我们可以用名称访问对象。目录服务是一种命名服务，在这种服务里，对象不但有名称，还有属性。<br>命名或目录服务使你可以集中存储共有信息，这一点在网络应用中是重要的，因为这使得这样的应用更协调、更容易管理。例如，可以将打印机设置存储在目录服务中，以便被与打印机有关的应用使用<br><br>JNDI概述<br>我们大家每天都不知不觉地使用了命名服务。例如，当你在web浏览器输入URL,<a href="http://java.sun.com/" target=_blank><u><font color=#800080>http://java.sun.com</font></u></a>时， DNS(Domain Name System,域名系统)将这个符号URL名转换成通讯标识（IP地址）。命名系统中的对象可以是DNS记录中的名称、应用服务器中的EJB组件 (Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用户Profile。<br>目录服务是命名服务的自然扩展。两者之间的关键差别是目录服务中对象可以有属性（例如，用户有 email地址），而命名服务中对象没有属性。因此，在目录服务中，你可以根据属性搜索对象。JNDI允许你访问文件系统中的文件，定位远程RMI注册的对象，访问象LDAP这样的目录服务，定位网络上的EJB组件。<br>对于象LDAP 客户端、应用launcher、类浏览器、网络管理实用程序，甚至地址薄这样的应用来说，JNDI是一个很好的选择。<br>JNDI架构<br>JNDI架构提供了一组标准的独立于命名系统的API,这些API构建在与命名系统有关的驱动之上。这一层有助于将应用与实际数据源分离，因此不管应用<br>访问的是LDAP、RMI、DNS、还是其他的目录服务。换句话说，JNDI独立于目录服务的具体实现，只要你有目录的服务提供接口（或驱动），你就可以使用目录。<br><br><br>JNDI 是一组API，它用命名/目录服务增强了网络应用。本文中的示例说明了用JNDI开发基于目录的应用是多么容易。它也说明了如何用同样的API访问不同的命名/目录服务。开发者不必学习不同的API。在某些情况下，例如，在RMI和CORBA应用中，JNDI允许你部署时才选择命名服务。<br>JNDI未来将增加的功能包括：与标准的Java SASL API(JSR-28，<a href="http://jcp.org/aboutJava/communityprocess/review/jsr028/" target=_blank><u><font color=#800080>http://jcp.org/aboutJava/communityprocess/review/jsr028/</font></u></a>) 的集成、支持国际化域名、支持安全DNS。</span> 
<img src ="http://www.blogjava.net/masen/aggbug/109084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 12:15 <a href="http://www.blogjava.net/masen/articles/109084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMS</title><link>http://www.blogjava.net/masen/articles/109081.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Sat, 07 Apr 2007 04:06:00 GMT</pubDate><guid>http://www.blogjava.net/masen/articles/109081.html</guid><wfw:comment>http://www.blogjava.net/masen/comments/109081.html</wfw:comment><comments>http://www.blogjava.net/masen/articles/109081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/masen/comments/commentRss/109081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/masen/services/trackbacks/109081.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em">　　在不同系统之间交换信息的一大障碍是如何在精确交换和格式化数据方面取得一致。Java Message Service（ Java消息服务，简称JMS）通过提供一种与J2EE应用程序或传统系统交互的方法部分的解决了这个问题。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　JMS的通用接口集合以异步方式发送或接收消息。异步方式接收消息显然是使用间断网络连接的客户机，诸如移动电话和PDA的最好的选择。另外， JMS采用一种宽松结合方式整合企业系统的方法，其主要的目的就是创建能够使用跨平台数据信息的、可移植的企业级应用程序，而把开发人力解放出来。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　Java消息服务支持两种消息模型：Point-to-Point消息(P2P)和发布订阅消息（Publish Subscribe messaging，简称Pub/Sub）。JMS规范并不要求供应商同时支持这两种消息模型，但开发者应该熟悉这两种消息模型的优势与缺点。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　P2P消息模型是在点对点之间传递消息时使用。如果应用程序开发者希望每一条消息都能够被处理，那么应该使用P2P消息模型。与Pub/Sub消息模型不同，P2P消息总是能够被传送到指定的位置。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　Pub/Sub模型在一到多的消息广播时使用。如果一定程度的消息传递的不可靠性可以被接受的话，那么应用程序开发者也可以使用Pub/Sub消息模型。换句话说，它适用于所有的消息消费程序并不要求能够收到所有的信息或者消息消费程序并不想接收到任何消息的情况。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　JMS通过允许创建持久订阅来简化时间相关性，即使消息预订者未激活也可以接收到消息。此外，使用持久订阅还可通过队列提供灵活性和可靠性，而仍然允许消息被发给许多的接收者。 Topic Subscriber topic Subscriber = topicSession.createDurableSubscriber(topic, subscriptionName); 　　Connection对象表示了到两种消息模型中的任一种的消息系统的连接。服务器端和客户机端对象要求管理创建的JMS连接的状态。连接是由Connection Factory创建的并且通过JNDI查寻定位。 //取得用于 P2P的 QueueConnectionFactory QueueConnectionFactory = queueConnectionFactory( ); Context messaging = new InitialContext( ); QueueConnectionFactory = (QueueConnectionFactory) Messaging.lookup(&#8220;QueueConnectionFactory&#8221;); //取得用于 pub/sub的 TopicConnectionFactory TopicConnectonFactory topicConnectionFactory; Context messaging = new InitialContext(); topicConnectionFactory = (TopicConnectionFactory) messaging.lookup(&#8220;TopicConnectionFactory&#8221;); 　　注意：用于P2P的代码和用于PublishSubscribe的代码非常相似。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　如果session被标记为transactional的话，确认消息就通过确认和校正来自动地处理。如果session没有标记为 transactional，你有三个用于消息确认的选项。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　&#183; AUTO_ACKNOWLEDGE session将自动地确认收到一则消息。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　&#183; CLIENT_ACKNOWLEDGE 客户端程序将确认收到一则消息，调用这则消息的确认方法。 　　　&#183; DUPS_OK_ACKNOWLEDGE 这个选项命令session&#8220;懒散的&#8221;确认消息传递，可以想到，这将导致消息提供者传递的一些复制消息可能会出错。这种确认的方式只应当用于消息消费程序可以容忍潜在的副本消息存在的情况。 queueSession = queueConnection.createQueueSession(false, session.AUTO_ACKNOWLEDGE);//P2P topicSession = topicConnection.createTopicSession(false, session.AUTO_ACKNOWLEDGE); //Pub-Sub
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　注意：在本例中，一个session目的从连结中创建，非值指出session是non-transactional的，并且 session将自动地确认收到一则消息。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　JMS现在有两种传递消息的方式。标记为NON_PERSISTENT的消息最多投递一次，而标记为PERSISTENT的消息将使用暂存后再转送的机理投递。如果一个JMS服务离线，那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器，并且这种传递方式只有当你不需要接收所有的消息时才使用。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　虽然 JMS规范并不需要JMS供应商实现消息的优先级路线，但是它需要递送加快的消息优先于普通级别的消息。JMS定义了从0到9的优先级路线级别，0是最低的优先级而9则是最高的。更特殊的是0到4是正常优先级的变化幅度，而5到9是加快的优先级的变化幅度。举例来说： topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub 或 queueSender.send(message, DeliveryMode.PERSISTENT, 8, 10000);//P2P 　　这个代码片断，有两种消息模型，映射递送方式是持久的，优先级为加快型，生存周期是10000 (以毫秒度量 )。如果生存周期设置为零，这则消息将永远不会过期。当消息需要时间限制否则将使其无效时，设置生存周期是有用的。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　JMS定义了五种不同的消息正文格式，以及调用的消息类型，允许你发送并接收以一些不同形式的数据，提供现有消息格式的一些级别的兼容性。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　&#183; StreamMessage -- Java原始值的数据流
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　&#183; MapMessage--一套名称-值对
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　&#183; TextMessage--一个字符串对象
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　&#183; ObjectMessage--一个序列化的 Java对象
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　&#183; BytesMessage--一个未解释字节的数据流
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　JMS应用程序接口提供用于创建每种类型消息和设置荷载的方法例如，为了在一个队列创建并发送一个TextMessage实例，你可以使用下列语句： TextMessage message = queueSession.createTextMessage(); message.setText(textMsg); 　　以异步方式接收消息，需要创建一个消息监听器然后注册一个或多个使用MessageConsumer的JMS MessageListener接口。会话(主题或队列)负责产生某些消息，这些消息被传送到使用onMessage方法的监听者那里。 import javax.jms.*; public class ExampleListener implements MessageListener { //把消息强制转化为TextMessage格式 public void onMessage(Message message) { TextMessage textMsg = null; // 打开并处理这段消息 } } 　　当我们创建QueueReceiver和TopicSubscriber时，我们传递消息选择器字符串： //P2P QueueReceiver QueueReceiver receiver; receiver = session.createReceiver(queue, selector); //Pub-Sub TopicSubscriber TopicSubscriber subscriber; subscriber = session.createSubscriber(topic, selector); 　　为了启动消息的交付，不论是Pub/Sub还是P2P，都需要调用start方法。 TopicConnection.start( ); //pub-sub QueueConnection.start( ); //P2P TopicConnection.start ( );// pub-sub QueueConnection.start ( );// P2P
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　当一条消息被捕捉时，这条消息做为一条必须被强制转化为适当消息类型的普通Message对象到达。这是一个被用来提取或打开消息内容的getter方法。下列代码片段使用StreamMessage类型。 private void unPackMessage (Message message) { String eName; String position; double rate; StreamMessage message; Message = session.createStreamMessage( ); //注意下面的代码必须按照我给出的顺序书写 message.writeString(eName); message.writeString(position); message.writeDouble(rate); //实现处理消息的必要的程序逻辑 }
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　停止消息的传递，无论是Pub/Sub还是P2P，都调用stop方法。 TopicConnection.start( ); //pub-sub QueueConnection.start( ); //P2P TopicConnection.start ( );// pub-sub QueueConnection.start ( );// P2P 　　其他的J2EE组件--servlet或EJB--可以当作消息生产者；然而，它们可能只能同步操作，这可能是因为它们的请求-应答的性质决定的。虽然XML目前还不是被支持的消息类型，发送一个XML文件和创建一条文本类型消息以及把XML文件添加到消息的有效负载都一样简单，都是以非专有的方式传送数据。值得注意的是，一些JMS供应厂商已经提供了可用的XML消息类型。但是使用非标准的消息类型可能会出现可移植性问题。 String reportData; //reportData内容为XML 文档 TextMessage message; message = session.createTextMessage(); message.setText (reportData);
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　消息驱动组件(MDB)是一个当消息到达时被容器调用的异步消息消费程序。和entity和session EJB不同，MDB没有本地和远程接口并且是匿名的；它们对于客户是不可见的。MDB是JMS系统的一部分，作为消费者实现服务器上的商业逻辑程序。 一个客户程序可能通过使用JNDI定位一个与MDB相关联的JMS。 例如： Context initialContext = new InitialContext(); Queue reportInfoQueue = (javax.jms.Queue)initialContext.lookup (&#8220;java:comp/env/jms/reportInfoQueue&#8221;); 　　MDB是由Bean类和相应的XML部署描述符组成。 Bean 类实现MessageDriveBean 接口： import javax.ejb.*; import jms.Message.*; public interface MessageDriveBean { public void ejbCreate(); public void ejbRemove(); public void setMessageDrivenContext(MessageDrivenContext ctx); } 　　消息监听器接口： import javax.jms.*; public interface MessageListener { public void onMessage( ); }
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　部署描述符 ＜!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd"＞ ＜ejb-jar＞ ＜enterprise-beans＞ ＜message-driven＞ ＜ejb-name＞MDB＜/ejb-name＞ ＜ejb-class＞MDB＜/ejb-class＞ ＜transaction-type＞Container＜/transaction-type＞ ＜message-driven-destination＞ ＜jms-destination-type＞javax.jms.Queue＜/jms-destination-type＞ ＜/message-driven-destination＞ ＜security-identity＞ ＜run-as-specified-identity＞ ＜role-name＞everyone＜/role-name＞ ＜/run-as-specified-identity＞ ＜/security-identity＞ ＜/message-driven＞ ＜/enterprise-beans＞ ＜/ejb-jar＞ 　　既然我们现在已经有了一些基本的JMS知识，那么我们可以使用JMS做什么呢？任何事情都可以。 　　例如，分别用于销售、库存、客户服务和账目处理的系统。这些部门之间的系统很可能已经存在了很长时间，这些处理要求把事务移动到系统中去，这并不是一个小的工作。这就是消息服务适用的地点。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　当售货员完成销售的时候，一条消息被发给库存系统；一旦订单消息发送给收发货人员，就可以按照订单出货了。当订单成功地发货，系统将通知顾客服务和会计系统这个订单已经成功的交易了。所有对应的每个子系统都自动地根据收到的消息进行更新。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">　　JMS一般都不是用来整合一个系统，而是整合许多可能参与消息驱动环境的系统。JMS是一个用于开发和集成企业应用程序的重要的工具。因为许多公司都有以前遗留下来的系统和新近开发的系统综合起来的系统，消息的使用是整合整个企业的重要的步骤。 </p>
<img src ="http://www.blogjava.net/masen/aggbug/109081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/masen/" target="_blank">Masen</a> 2007-04-07 12:06 <a href="http://www.blogjava.net/masen/articles/109081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>