已有资源总数:
3353899
国民经济行业分类代码 sql 脚本
资源大小:
58.41KB
资源类型:
发布人: 发布日期:
2011-04-01 11:38
资源分类:
资源分:
下载人数:
CSDN和《程序员》创始人
全球最大中文IT社区
专注于移动应用开发者的创优和创富
软件说明:
网上找来找去找不到,由于是花了我一下午时间弄的,所以稍微贵一点,嘻嘻~由于行业分类分四层,我这里指到第三层,改天有机会会弄个四层的版本~
推荐资源
作者其他资源
共有评论
热门Tag 本周热点资源
本周上传用户排名计算机的职业种类及相关岗位有哪些?
悬赏分:5
解决时间:2007-12-4 15:52
提问者:
我在网上找的好辛苦啊,可就是找不到有用的……哪位高手能帮我一下?
最佳***
IT行业分类是很细的,很多朋友并不十分清楚,很多朋友非常想进入这个行业,但有时觉得不知道如何开始,这里我抛个砖头,供大家批评,讨论,相互有所长进。
IT行业总体来说分为三个方面:
3.集成电路
如果您希望进入IT行业,那么您先要确定进入这三个方面中的一个。
三个方面的就业方向:
1.集成电路方向,这是一个非常专业的方向,需要求职者有很强的专业知识,这些专业知识很能通过培训来补充,需要很好的类似于大学教育的培养;这类人才就业面很窄,但如果就业了,其薪水很高(当然要看企业的情况)
2.软件方向,这个方面比集成电路设计在专业上相对宽一些,一个好的软件工程师,也需要有扎实的数学基础。常规的培训可以使一个没有软件基础的人成为一个软件蓝领,但要成为软件设计人员,还是需要相当的工作与学习时间;这类人才大多就业于软件企业;
3.网络方向,这个方面涉及的面就比前两者宽得多,通过培训可能从一个对网络技术不了解的人逐步成为网络的工程师,因为网络技术是一种更偏向于操作的技术。在就业面也宽得多,因为信息化是一个全社会的工程,政府、企业都在进行信息化,都需要在网络方面寻找合适的人才进行其网络系统的运行、管理、维护。
因此,从就业面来看, 网络工程师软件工程师集成电路工程师
现在社会、学校、企业都兴起了一股软件工程师培养热,这是一种误导,的确我们需要大量的软件工程师,但现在的培训还只是一种软件编写的人员培训,以后这种培训出来的学员是否真正能成为软件开发的主导力量,这还是一个疑问,我们的软件公司是否有足够的位置留给这些软件CODING人员?
而不同的是,网络工程师却是各行各业所需要的。
什么是网络工程师,我们可以从企业信息化的岗位体系中作一些了解。企业(或政府)信息化过程中需要以下四种人:
1.企业信息化主管:负责信息化建设中的目标与方案决策,信息化建设中的方向研究;
2.工程技术人员:负责信息化系统的设计、建设,包括设备、系统、数据库、应用系统的建设;
3.运行维护人员:负责信息化系统的运行、维护、管理以及基本的开发;
4.操作应用人员:主要应用信息化系统进行本职工作。
在企业信息化建设运行的过程来看,一个企业会把建设过程以外包方式交给专业的IT公司来完成,于是一般一个企业不会有IT系统的工程技术人员,可以说IT系统的工程技术人员都集中于专业的IT公司;而当信息化系统建成后,企业一般会有一个人,或一个组来负责信息化系统的运行、维护、管理,这部份人是企业必配的,而且从成本角度来看,企业会招聘一个对网络设备、网络系统、数据库、网络管理、网络安全以及基本网络开发都有所了解的人来负责其信息化系统,这类人一般叫网管。这类人的知识是水平性的,多方面的,但不是特别专业的。如果当企业真正遇到非常专业的技术问题,一般会让这个网管带着问题咨询专业的IT公司。
因此从这个角度来看,网络工程师的就业面会远大于其它两类工程师。
那现在社会中有很多称呼为网络工程师的认证培训或培训认证,我们如何来选择呢,我们可以网络技术的系统来分析与了解:
1.网络设备技术,这主要涉及网络的硬件建设,包括路由器、交换机、组局网、广网,这方面有代表性的是CISCO、NORTEL;
2.网络操作系统,这主要涉及操作系统的系统管理与网络管理,这方向有代表性的是WINDOWS 2000、UNIX、LINUX等;
3.网络数据库,这主要涉及应用于网络的数据库,这方面有代表性的是SQL和ORACLE等;
4.网络安全,大家不应把网络安全片面的想成对操作系统、应用系统的安全,其实安全问题在网络的各方面都存在,在这方面国内还没有出现比较好、比较全面的认证;
5.网络管理,这涉及一个局网、广网的综合管理、优化、计费等等,也没有一个综合性的认证;
6.网络应用开发,企业的网站的基本开发、互动性开发,技术有HTML、ASP、JSP、J***A等等。
这六个方面都是企业信息化必备的因素,所以大家如果要补充自己的知识,可以从这六个方面去补充,自己还要作一个定位,是成为一个全面性的人员,还是专业性的人员。不过如果能在这个方面打下扎实的基本功,那么再在工作中选择一个方向,会更加厉害。
总之,大家应分步确定自己的方向,然后努力在多方向充实自己 .
分享给你的朋友吧:
对我有帮助
回答时间:2007-12-3 11:06
回答者:
擅长领域:
参加的活动:
暂时没有参加的活动
相关内容
2007-12-11
2010-10-14
2011-4-17
2008-6-11
2010-5-13
查看同主题问题:
分享到:
推广链接
用户名:
记住我的登录状态
2011 Baidu成为一个优秀的架构师、职业经理人
2005年12月05日 项目的流程要分成几个phase,好的程序也因该modular architecture.具体怎么实现modular,bean内部代码怎么组织和和bean之间怎么communation,就要看你用那种设计模式和框架结构了,当然什么也不用,也是一种无纪律模式,hoho… #8230;. 教科书上的设计模式本来有24种,literator已经在collection实现,故实际上用到的只有23种。设计模式分为创建,结构模式,行为模式。具体的资料可以见
. 项目里的创建模式:大的颗粒也就是aop里面的a ect,采用 ring 的ioc注入模式,一些基本组件如 dao等采用factory pattern创建。 数据库访问采用DAO模式 key words: ring ioc,di,aop ring: 说起framework来就要说说 ring,这个是最近几年的最红火的framework, ring精髓是使用了ioc容器和aop框架. ioc:Inversion of Control,控制反转,词义比较模糊,后来大师级人物Martin Fowler也站出来发话,以DI给ioc以更准确地定义 依赖注入DI(Dependency Injection),通俗的说就是通过容器管理组件与组建之间的关系。 aop:aop里面的a是单词a ect,国内有两种翻译面向方面编程和面向切面编程,具体那个那个更确切的不要惯了,先明白aop什么是什么意思,在oo的设计过程中,我门会把一个流程中各个对象找出来,并根据要实现的功能赋予每个object要具有那些attribute和method.那么在一个业务流程中,我们从大的oo的思想来考虑,把相对独立的环节划为出来,如权限等。这些如权限等的环节就是a ect,两个a ect之间的连接点就是joi oint,在链接点所采用的处理逻辑就是advice,一系列链接点的集合就是pointcut 归类于:
— TerryChan @ 6:05 pm 正在要开发一个产品,具体保密,公司机密不能泄漏!:)不过可以稍微暴一下料,产品的代号为peony,古人有&ldquo time time 花下死,作鬼也风流,可见peony的美丽和魅力,偶的东西与美有关,希望代码最后的结果也非常有魅力,lol! 对这个product的技术和需求流程基本熟悉,流程的环节和步骤较多,故打算把精力放在采用合理的设计模式。个人积累的基础支持功能API已经采用了 ring的注入模式,数据库的访问当然采用DAO,另外打算选择采用proxy模式、adapter模式等合适的design pattern。 对采用的design pattern将在对其进行笔记记录体会,记录的最大目的是加深对所采用的设计模式的理解和体会。 待续… #8230 #8230 #8230 #8230 #8230 #8230 #8230;.. 归类于:
— TerryChan @ 11:27 am
2005年09月27日 昨晚与在ibm,现在在美国费城出差的哥们聊天 这小子,原来出国到加拿大混了一年多,没有找到什么什么好工作,最后回到上海,进了ibm,,,,,现在成了天天出国与客户谈需求,走的路线都是国际航班,,,,, 和我聊的全是全球形式,加拿大就业形式好了,北美的员工最暇逸,11点才到公司,,,, 说等等他在闯闯加拿大,他的女朋友好像在加拿大 看来,现在国际打工也渐渐成为一种道路了,国内的资深程序员已经积累了很多,走向国际,一缺英语,二缺改革思路了
归类于:
— TerryChan @ 6:09 pm
2005年09月22日 今天由于实现一些东西,同事再本机开了两个同样的程序,每个程序15个线程 操作系统window 然后又在另外一台服务器上布置了两个同样的程序,每个程序15个线程 操作系统linux, 忽略了两台机器的配置:我的机器配置可能不如服务器,但两个程序用到的cpu只有百分之几;内存也只用到了一半 程序都用java开发的 结果:从运行的结果来看,linux的线程机制,使得程序运行的速度比window快10%-20%.
归类于:
— TerryChan @ 4:44 pm
2005年09月20日 效率问题,个人觉得nuth对于中小搜索引擎系统的爬虫足够。个人测试如下:nutch一个小时爬虫解析8千-1万个左右的 blog网页(15个线虫,linux操作系统),这个速度应该可以提高,速度的提高应该可以从一下几个方面考虑:带宽是最重要的,呵呵;机器的配置;另外linux/unix上的爬虫是比window要快;采用低级语言实现爬虫,nutch是java实现的,在速度上肯定比c或脚本语言要慢一些。应该来说最终各种爬虫工具的速度极限是差不多的。 forward:nutch对于forward的处理,是默认一个网页只能转向三次,小于三次forward进行解析,这个可进行配置。 nutch的解析按照html的解析,具体的搜索精确与否与制定的解析策略和搜索策略有关,在解析策略方面估计都差不多,都是吧网页中的文本做成索引,另外考虑整体的效率可能对文本的大小有个限制。个人觉得nutch的html解析组够了,不过可能根据具体爬虫方向做一些修改,比如我如果要用nuthc爬wap或blog的网页,对html parser做一些修改,可以提高效率。 归类于:
— TerryChan @ 8:12 am
2005年09月19日 目前中小搜索系统的引擎技术已经非常成熟了,中文搜索技术最大的难题是中文分词,而现在公认的最好的中文分词是根据词义进行分词语,当然根据时间的推移,词义库应该要逐步丰富.比如当超女成为最时髦的词语,就要加入词义库里面 中小搜索引擎的开源技术,当仁不让应该是lucene技术,然后根据是网际搜索/内容搜索,本地搜索,配置相应的策略和前端技术支持. 对于网际搜索,nutch是个很好的开源系统,它的架构是非常好的,但对于实际的网络搜索,他的机制是不够的,对他的修改也是非常麻烦的事情.通常我的理解是借鉴里面好的爬虫机制,加以自制的搜索存储机制. 互联网的搜索门户已经出现了几个老大了,但对于wap搜索,这方面还是不够:是盈利模式大家都找不到好的;手机界面非常小,不能显示多的内容;wap资源不多. 把web内容显示到手机上不是很好的选择,wap百度做了wap搜索,实际上就是吧web搜索的内容转换成了wap.但这种转换的机制不好,造成了转换后的内容组织混乱,估计也很难做好. 当google,百度把web搜索门户做到极限时,就注定了以后的搜索系统不能在沿着他们的脚步走了,个人觉得无线搜索,行业搜索,专业领域搜索,资源搜索,是未来新兴搜索的市场. 归类于:
— TerryChan @ 2:44 pm
2005年09月09日
JavaSpaces技术是进行分布式计算的一种简单机制,在分布式计算应用程序中,JavaSpaces 提供了对象的提供者和请求者可用来方便地进行通信的共享虚拟空间,这允许以Java对象的形式
对任务、请求和信息进行简单的交换。Java aces提供了永久地建立和保存对象的能力,Java aces是建立在Jini之上的一种技术,它作为一种共享分布式通信的机制,还可作为一种存储对象的机制;JavaSpaces是一种Jini技术服务,这表示使用Java aces的开发人员也可以利用各种Jini服务比如说利用事务处理和通知等。JavaSpaces以一种非常简单的接口提供了这些功能,但是,有效地利用这种简单的接口需要大量的概念和工具。
在分布式系统中,对象之间应当能够相互通信、共享信息。JavaSpace服务(JavaSpace service)利用对象的分布式存储(distributed repository)和三个简单操作(读、写和取),实现了一个简单的、构建分布式系统的高层体系结构。JavaSpace服务通过Jini事务管理器和通知机制来支持事务,当与某个给定模板相匹配的条目写入JavaSpace服务时,通知机制能够通知某个对象。
二、JavaSpaces 概念及特性
1、JavaSpaces 概念
可以从以下几个方面来理解JavaSpace概念:纯对象风格;作为Jini服务;具有共享分布式通信的机制;对象存储机制。
从纯对象的观点,所有JavaSpace都是我们所说的JavaSpace接口的实现。它确实是得出那些有趣结果的一个非常小的接口。从Jini的观点来看,JavaSpace是一个利用Jini基础结构并向其他Jini客户机和服务提供其功能的一个Jini服务。JavaSpaces提供了一种完成共享分布式计算的机制。这可能是它所提供的一种最重要的功能了。JavaSpaces还提供了一个非常有趣且简单的对象存储机制。这并不是说它们是一种对象数据库,但这确实是一个非常有用的功能。
2、JavaSpace服务
JavaSpace服务为Java对象提供分布式的共享存储器。任何与Java兼容的客户端都可以将共享对象放进这个存储器中。然而,对于这些Java对象有几个限制条件。首先,保存在JavaSpace服务的对象都必须实现接口Entry(在net.jini.core.entry软件包中)。JavaSpace服务Entry附加到Jini Entry的方式定义在Jini核心规范中。一个Entry对象能够有多个构造函数并需要相当数量的方法。其他的需求包括 一个public的无参数的构造函数、public字段和非基本数据类型的字段。
JavaSpace服务代理使用无参数的构造函数在反串性化过程中实例化匹配的Entry对象。所有的用于模板对Entry对象进行匹配的字段都必须是public的。Jini核心规范中定义,一个Entry对象不能包含基本数据类型的字段。这个对象类型的字段要求简化了匹配的模板模型,因为基本的数据类型不能有null值,该值在模板中作为通配符。
同Jini一样,JavaSpace技术需要几个底层的服务。JavaSpace服务依赖于Jini查询服务,在需要事务时,必须启动Jini事务服务,JavaSpace服务还依赖于一个Web服务器和RMI活动守护程序rmid。
3、JavaSpace服务的属性
JavaSpace技术简化了分布式系统的设计与开发。一个JavaSpace服务有五个主要的属性:
1)JavaSpace服务是一种Jini服务。
2)一个条目将一直保存在JavaSpace服务中,除非它的合约到期,或是由某个程序从JavaSpace服务中取出。
3)JavaSpace服务定位对象的方法是将对象与模板进行比较。模板指定了JavaSpace服务比较各个条目的搜索条件。如果有一个或多个条目匹配模板,JavaSpace服务将返回其中的一个。
4)JavaSpace服务使用Jini事务管理器来支持操作执行的原子性。
5)JavaSpace服务的对象是共享的。程序可以从JavaSpace服务中读出或取得条目,改变这些条目的public字段,以及写回到JavaSpace服务供其他程序使用。
4、永久对象仓库
JavaSpaces的一个特点是对象数据仓库。写入一个空间的项都是正式的Java对象。 但请注意,JavaSpaces并不是一个对象数据库。Entry实例在位于JavaSpace中时并不是活动的,只是能够作为拷贝访问。这表示不能直接更改空间中的一个项。例如,如果在一个空间的某行中两次写相同的Entry实例,则此空间中将会有两个项。因此,空间中不存在维护项的对象标识的概念。
5、共享分布式计算
租用、事件和事务处理的产生是由分布式程序设计的特性所决定的。相对于一般的本地计算来说,分布式计算环境中的基础环境易出错。JavaSpaces引入了一种不同的模型。JavaSpace:提供了进行通信的一种中介模型。图1示出这种模型。
初看上去,这似乎在分布式系统中又引入了一个可能出问题的环节。但实际功能是分离了进程。不用操心特定进程通信的细节,进程1(上图1中)所要操心的是写一个项到JavaSpace,进程2无需关心项是怎样进入Java ace的,它只要取走它们,然后做自己的工作即可;对进程进行分离有几个好处,如果进程2失败,并不会影响进程1,进程1仍然能够继续完成自己的任务;如果需要添加另一个进程到图中(在图1所示的紧密耦合模型中),必须更改一个或多个程序的代码,或者必须一开始就编写涉及多个进程的复杂代码,而在图2中要添加另一个进程只需在图中简单地加上它即可。
在上图中,进程3可以很轻松地向空间写入项了。因为进程1不需要知道进程2的细节,所以添加进程3也不需要更改它,这里进程2并不关心空间中的项来自何处,它只需使用它们即可,这种松散的耦合模型对于降低分布式程序设计的复杂性特别有用。
三、JavaSpaces 技术
1、对象的文件系统
JavaSpaces的目标是提供对象的文件系统,也就是说,JavaSpaces可提供一种无所不在的、自然的方式来存储和使用对象,它的设计是为了自然地工作于用Java开发的面向对象应用程序。另外和文件系统相似的是,JavaSpaces可支持在应用之间共享对象,因此就像一个应用(或用户)可以把文件放到文件系统中众所周知的位置以供其他应用(或用户)取出一样,JavaSpaces可作为支持Java的客户和服务之间共享的通信中介。
但通常的文件系统只存储字节包,如在UNIX和Windows系统中,共享文件甚至不与类型相关联。多数情况下,这取决于使用文件的应用及已建立的约定,把某种意义或解释与文件系统中被称为文件的字节包联系起来。
而JavaSpaces是面向对象的存储系统。JavaSpaces不是存储简单的无类型数据,它利用Java存储整个对象,以及作为Java对象所具有的好处:强类型、可移动代码、安全执行等。因此在JavaSpaces中,被存储的实体有实际类型,并且可以包含代码。
JavaSpaces的另一点不同在于寻找被存储实体的方式。在文件系统中,对先前存储数据的访问是通过命名,文件系统中的每个文件都有一个在文件系统中唯一的名称。若这个名称是被使用它的各方周知且认可的(比如C:\autoexec.bat或/dev/tty),则按照约定,它可以有特殊的属性并且可以被很多其他实体使用。文件系统中的搜寻通常是搜索文件名中的一部分或搜索文件的实际内容(适于部分情况如文本文件)。
在JavaSpaces中,名称并不重要。事实上,对象的名称只是可用来寻找对象的众多属性中的一个。我们可以基于对象的类、超类,或它们实现的接口来搜寻对象,也可以基于对象的属性搜寻对象-按照约定,任何属性都和名称一样对待。
2、基于属性的搜寻
如果对象不必用名字来标识它们,那么客户如何使用JavaSpaces来存储和找到对象呢?JavaSpaces使用与Jini查找服务基于属性的搜寻完全相同的技术,每个存储在JavaSpaces中的对象都必须实现net.Jini.core.entry.Entry接口,意思是它可以被解释为是其内部成员对象的强类型集合。事实上,JavaSpaces和Jini查找服务使用属性搜寻的唯一区别,就在于查找服务定义了一组模板如何与一组项目匹配的条件,而JavaSpaces只有匹配单个项目的工具。我们知道Entry是一个无方法的标记接口,对象可实现它,告诉系统这个对象的创建者知道此对象被用到查找服务的特殊方式(对象的成员被独立地序列化等)。Entry对象在JavaSpaces中也具有完全相同的语义:它们被当作是自己指向的公有、非静态、非最终、非变化对象的集合。每个Entry可通过与其成员对象匹配的模板被搜寻,搜寻时使用的模板可以基于类型或对象的值,支持通配符。
由于相同的概念已被广泛地应用在Jini查找服务中,因此我们已经熟悉了它。尽管JavaSpaces使用不同的API集来存储、搜寻和取出对象,但它使用完全相同的基于属性的搜寻规则。它使用的API更适用于存储服务的需要。
3、JavaSpaces编程模型
JavaSpaces信奉的哲学是少就是多;使用JavaSpaces的编程模型很小,在JavaSpaces上可进行的操作只有四种:
向JavaSpaces写入一个新对象;
读JavaSpaces中的一个对象;
取出JavaSpaces中的一个对象(相当于读并删除被读的项目);
要求JavaSpaces在有与给定模板相匹配的对象被写入时通知请求者。
就这么多,实在不能再简化了。这种概念性的操作可通过net.Jini. ace.JavaSpace接口中一组稍多些的方法被使用,这些方法为某些操作提供了重载的实现,以在某些方面加速空间的处理。所有这些操作都支持普通Jini中的租借概念,被存储的对象实际是租借的,客户必须为存储的对象续订租约,否则JavaSpaces将删除此对象。同样,JavaSpaces服务也租借事件注册,就像查找服务一样。所有这些操作都具有Entry参数,它们用来指定被存储的对象(写操作中),或指定被匹配的模板(在读、取出和通知操作中)。
下面来看一下JavaSpaces的接口,此接口net.Jini. ace.JavaSpace由JavaSpaces服务的服务代理实现。和所有Jini代理一样,我们不知道(通常不必关心)服务代理如何实现此接口,特定的代理可能使用RMI或CORBA或原始套接字来与后端JavaSpaces通信,而服务可以由内存中的hash表或完整的数据库实现。不过有一点是统一的,它们的代理必须实现这个简单的接口,以使客户和其他Jini服务能以相同的方式使用它们。
JavaSpace实际的接口定义很简短紧凑,请参阅程序清单1:
程序清单1
Java ace.java
import net.jini.core.entry.*;
import net.jini.entry.*;
import net.jini.core.tra action.*;
import net.jini.core.event.*;
import net.jini.core.1ease.*;
import iava.rmi.*;
public interface JavaSpace{
Lease write(Entry entry,Tra action txn,long lease)
throws Tra actionException,RemoteException;
long NO_WAIT=0;
Entry read(Entry tmpl,Tra action txn,long timeou:)
throws UnusableEntryException,Tra actionException,
InterruptedException,RemoteException;
Entry readlfExists(Entry tmpl,Tra action txn,
long timeout)
throws UnusableEntryException,Tra actionException,
InterruptedException,RemoteException;
Entry take(Entry tmpl,Tra action txn,long timeout)
throws UnusableEntryException,Tra actionException,
InterruptedException,RemoteException;
Entry takelfExists(Entry tmpl,Tra actzon txn,
long timeout)
throws UnusableEntryException,Tra actionException,
interruptedException,RemoteException;
EventRegistration notify (Entry tmpl,Tra action txn,
RemoteEventListener listener,
long lease,
MarshalledObject handback)
throws Tra actionException,RemoteException;
Entry a hot(Entry e)throws RemoteException;
正如所见,程序清单1中列出的七个方法可用来提供某些非常复杂的行为的机制。不过,在遇到复杂问题时,最好从简单的地方入手。幸运的是,这些接口都很简单。
1)Entry
在学习实际的方法前,应该对Entry(项)类给予某种特殊的关注。下面是net.jini.core.entry.Entry的接口定义:
package net.jini.core.entry;
public interface Entry extends java.io.Serializable{
在建造一个实现项的类时,需要遵循以下几条规则:Entry子类的每个字段必须是公共的(字段可以是非公共的,但不能把它们保存在空间中);字段不能为简单字段,它们必须是对象;字段必须是可串行化的;必须提供一个公共的无参数的构造函数。
2)Read
read方法用于在JavaSpace中查找项。从本质上来说,它提供了一种搜索JavaSpace的方法。
Entry read(Entry tmpl,Tra action txn,long timeout)
throws UnusableEntryException,Tra actionException,
InterruptedException,RemoteException;
第一个参数是一个项,用作执行搜索的模板,如果项的某个字段为空,则空间中相同类型的任意项内的同一个字段都将匹配,这里类型一词用来表示匹配项可以是与模板相同的类或者是模板的子类。如果模板中的一个字段不为空,则相同类中其他项内的字段必须精确匹配;如果找到一个匹配,就会返回匹配项;如果空间中有不止一个匹配项,则空间可以返回任意匹配项;至于返回哪个项不能保证,这表示不应该指望读项的顺序会有什么对应关系(如到达的顺序等);第二个参数提供了一个Tra action实例,应该在其下执行读操作; 最后一个参数为长整型,以毫秒为单位,此值说明在read方法中对于匹配项的出现在空间中要等待多久。这表示,如果一个匹配项在第一次调用read方法时不在空间中,则read方法将等待此项被添加到空间中,等待时间为此参数给出的超时值,如果等待时间超过超时值后还没有项匹配,则返回空。
3)readlfExists
readlfExists方法是一个非常类似于read的方法,它具有与read完全相同的参数和返回值;不过,readlfExists在这些参数的使用上稍有不同,它也是用来搜索空间的,而且使用相同的匹配模板实例的规则,read和readlfExists的不同之处在于超时值的处理。
readlfExists方法试图匹配作为第一个参数传入的模板项,如果未匹配,它立即返回,而不是像read方法那样等待匹配项。既然它立即返回,那么还要超时参数干什么呢? 这个问题涉及Java aces怎样处理事务,一个匹配项可能位于空间中,但可能在至今尚未完成的事务处理下写过,这表示此匹配项并不真正对readlfExists方法可见,超时参数指出readlfExists等待完成此未结束的事务处理要等多久。因此read方法要等待直至找到匹配项或超时期满,而readlfExists方法仅在恰好存在与未结束事务处理之下的匹配项相同的匹配项时等待。
take方法也具有与read方法相同的参数和返回值。它使用项模板的相同匹配规则,其超时值与read的超时值类似,即等待直到匹配项出现为止。但其重要的差别在于,如果找到一个匹配项,不仅返回给方法的调用者,而且还从空间中删除它。另外,如果多个客户机调用take方法且它们匹配空间中相同的项,则只有一个客户机取得该项,而其他客户机得到空返回值。
5)takelfExists
就像readlfExists方法对应于read方法一样,takelfExists方法对应于take方法,即它的超时参数指出等待具有一个匹配项的未结束的事务处理完成要等待多长时间。
6)write
write方法用于把项放入空间。
write(Entry entry,Tra action
txn,long lease)
throws Tra actionException,RemoteException;
write以希望放入空间的项作为第一个参数。请注意,任意种类的项都可以写入一个空间。write方法也使用write所属的Tra action实例以及一个租用参数,write方法的返回值为一个Lease实例。这允许调用者对将项保留在空间中有某些控制权。
7)notify
notfiy方法提供感兴趣的项被写入某个空间时到得通知的异步机制。
EventRegistration notify (Entry tmpl,Tra action txn,
RemoteEventListener listener,long lease,MarshalledObject handback)
throws Tra actionException,RemoteException;
第一个Entry参数指出匹配空间中的项时使用的模板,匹配规则与read方法的相同,与read方法不同的是notify指出调用者对只要写匹配项就得到通知感兴趣,而不是对调用时在那里的项感兴趣。RemoteEventListener参数告诉空间送回事件给谁,在写一个新项到匹配模板的空间时,此空间发送一个事件到RemoteEventListener,以便它可以处理此事件;Handback参数作为事件数据的组成部分被发送到***程序,这给notify方法的请求者提供了与Listener实例通信的一种途径;Lease参数指出调用者在接收通知时等待多长时间,时间以毫秒表示;EventRegistration返回的值为notify方法的调用者(如Lease实例)管理其注册提供某些信息。
8) a hot
它是一种优化空间性能的方法。
Entry a hot(Entry e)throws RemoteExceptlon;
在利用相同的模板项对一个空间重复调用方法时, a hot方法有助于提高程序的性能。Sna hot工作的方式是你对传递希望优化性能的模板的空间调用它, 调用之后返回一个Entry实例,此Entry实例代表传入的项。基本上,空间会记住此新项实际上是旧项。在传递的这个新代表项调用空间时,避免了串行处理的大量开销。在模板项很大且串行化代价很高时,这样做可以极大地改善性能。
有一件需要注意的重要事情是,这仅对在其上调用 a hot方法的空间有效。如果在另一个不同的空间上调用某个方法并传递快照项,则新空间将不承认快照项代表原模板项。另一个要点是取回的项与传入的项根本不同。不应该将新项与已经拥有的任何项进行比较。
四、JavaSpaces技术的应用
Jini提供了在分散式环境中寻找( look-up)、注册( registration)、租借(leasing)等功能。而 JavaSpaces则负责管理分散式物件的处理程序( proce ing)、分享(sharing)、以及流通(migration )等。因此 Jini 与 JavaSpaces 彼此存在著相互合作的关系。简单的说,JavaSpaces就好像网路上的一个市场,它提供一个简单、快速、统一的介面,让网路上分散的资源可以被分享、协调与流通 。
对于要存储对象或使对象可被其他对象使用的很多应用,JavaSpaces技术具有立竿见影的效用。不过也可以通过其他方式使用JavaSpaces,它可以作为一种新的分布式系统编程范型的基础。这是Linda的最初目的,而Linda正是JavaSpaces的基础。尽管Linda可以用做简单的存储引擎,但它的真正目的是提供一种新的用于创建分布式应用的模型。在这种新模型中,分布式系统的创建将使对象在应用之间流动,通过中心的Linda元组空间进行协同。这种思想不是为新的分布式应用创建定制的远程通信接口或协议,而是应用可根据它们写入元组空间及从元组空间中读出的对象集合来定义。如果用Java术语描述它,就是说不是为每个新任务定义或细化新的RMI远程接口,而是JavaSpaces接口将成为应用之间交互的公共API,应用将定义自己的Entry对象集,并给这些对象赋以自己的语义。
Java ace是一个Jini服务,它提供一种共享分布式对象仓库。JavaSpaces是用 Java所发展的技术,并且以RMI实作其网路通讯的功能,一般应用在n-tiers 架构的中间层(middle tiers)。JavaSpaces虽然能提供求者与供应者之间查询与沟通的机制,但它并不是资料库,而是以简单的me aging system为基础,进而提供更强大的功能。除了在Jini应用之外,JavaSpaces技术也可被应用在其它系统与服务中,如:Workflow systems 、Customer management systems、Su ly chain management 、Intelligent rich data distribution、 Trading services 、Auction systems 、Resource allocation and management systems、Agent Systems、以及 Publish and su cribe services等,现在我们来简要地介绍一下几个可以使用Java aces的领域:
1)信息共享
Java aces可以共享对象。因此,许多Java aces的应用程序可以做这个工作是不奇怪的。 可通过空间方便地交换信息。写到一个空间的每个项都可以从该空间的任一个客户机读出。 读取者和写入者不需要互相了解。所需知道的只是何种项放入了此空间。例如,空间可在聊天或通话系统中使用,这种系统已经变得非常流行了。其中,空间被用作共享的留言板,多个客户机可以写入和读取消息。
2)计算服务
除共享数据以外,Java aces的一个非常有意思的用途是共享分布式系统计算。 一般在这种用法中,计算一个(或多个)问题块的产生器可能很昂贵,但这种问题可以分成并行任务。产生器把问题块发送到某个JavaSpace。然后,运行在分离的机器上的该空间的客户机使用这些块,进行计算并将完成了的块返回给JavaSpace。然后再把这些完成的块装配起来。
3)工作流
JavaSpaces也很适合于管理工作流环境。可以把工作流环境与纯计算服务环境区分开来,在工作流环境中所调度的工作可以由人而不是纯计算完成。
归类于:
— TerryChan @ 7:20 pm Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。 Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/R ma ing解决方案。Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务–如果你需要–还能实现你自己的a ects。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IoC容器集成的强大而灵活的MVC Web框架。 WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.1,现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。 Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。 Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL dash; the Object Graph Notation Language),IoC(Inversion of Control倒置控制)容器等。 WebWork2建立在Xwork之上,处理HTTP的响应和请求。WebWork2使用ServletDi atcher将HTTP请求的变成Action(业务层Action类), se ion(会话)a lication(应用程序)范围的映射,request请求参数映射。WebWork2支持多视图表示,视图部分可以使用JSP, Velocity, FreeMarker, Ja erReports,XML等。 Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(me age resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现***MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jo 这样复杂的日程序表。Jo 可以做成标准的Java组件或 EJBs。 Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。 使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求开发者编写具体的SQL 语句。相对Hibernate等 全自动ORM机制而言,ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统 设计提供了更大的自由空间。作为全自动ORM 实现的一种有益补充,ibatis 的出现显 得别具意义。 这一高价值的商业应用程序,易于***、易于实施、易于使用。只需要短短几个小时,您就可以使用申购-采购-***-付款、报价-订单-***-收款、产品与定价、资产管理、客户关系、供应商关系、员工关系、经营业绩分析等强大功能了!功能未减,实施时间缩减到 4 小时。最重要的是:这一高价值的商业应用程序是免费的!可以自行***和实施这套系统(如果您略懂 Oracle 和 Java 技术)。
中文站点: 这个weblogging 设计得比较精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。 与Struts结合使用最出名的一个tag主要是显示表格数据很漂亮、完善。 JFreeChart它主要是用来制作各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。 Ecli e平台是IBM向开发源码社区捐赠的开发框架,它之所以出名并不是因为IBM宣称投入开发的资金总数 4千万美元,而是因为如此巨大的投入所带来的成果:一个成熟的、精心设计的以及可扩展的体系结构。 代表了完整的J2EE应用,使用了Web、EJB以及JMS等技术,特别是其前台界面部分使用Struts 框架技术,基于XML的portlet配置文件可以自由地动态扩展,使用了Web Services来支持一些远程信息的获取,使用 Apahce Lucene实现全文检索功能。
主要特点: 1、提供单一登陆接口,多认证模式(LDAP或SQL); 2、管理员能通过用户界面轻松管理用户,组,角色; 3、用户能可以根据需要定制个性化的portal layout; 4、能够在主流的J2EE应用服务器上运行,如JBo +Jetty/Tomcat,JOnAS; 5、支持主流的数据库,如PostgreSQL,MySQL; 6、使用了第三放的开源项目,如Hibernate, Lucene, Struts; 7、支持包括中文在内的多种语言; 8、采用最先进的技术 Java, EJB, JMS, SOAP, XML; Jet eed是一个开放源代码的企业信息门户(EIP)的实现, 使用的技术是Java和XML. 用户可以使用浏览器, 支持WAP协议的手机或者其它的设备访问Jet eed架设的信息门户获取信息. Jet eed扮演着信息集中器的角色, 它能够把信息集中起来并且很容易地提供给用户.
Jet eed具有如下的特征:
* 即将成为标准化的Java Portlet API
* 基于模板的布局, 包括JSP和Velocity
* 通过开放的内容同步技术支持远程XML内容交换
* 定制默认的主页
* 使用数据库进行用户认证
* 内存缓存技术, 加快页面的响应
* 通过Rich Site Summary技术, 支持同步内容
* 和Cocoon, WebMacro, Velocity集成.
* Wirele Markup Language (WML) 支持
* 使用XML格式的配置文件注册portlet.
* 完整的Web A lication Archive (WAR) 支持
* Web应用程序开发的基础设施
* 可以在本地缓存远程内容
* 与Avantgo同步
* 可移植到所有支持JDK1.2和Servlet 2.2的平台
* 与Turbine模块和服务集成
* 可以根据用户, ***媒体类型和语言的不同设定, 产生不同的个性化服务
* 持续化服务使得所由的portlet能够容易的存储每个用户的状态, 页面和portlet
* 使用皮肤技术使得用户可以选择portlet的颜色和显示属性
* 自定义功能是的管理员可以选择portlet以及定义个人页面的布局
* 在数据库中存储PSML
* 通过Jet eed的安全portlets管理用户, 组,角色和权限
* 基于角色对访问portlet进行控制 JOnAS是一个开放源代码的J2EE实现,在ObjectWeb协会中开发。整合了Tomcat或Jetty成为它的Web容器,以确保符合Servlet 2.3和JSP 1.2规范。JOnAS服务器依赖或实现以下的Java API:JCA、JDBC、JTA 、JMS、JMX、JNDI、JAAS、JavaMail 。 Turbine是基于Servlet的框架包,也是开放源代码Jakarta项目。目前还没有关于Turbine的大量文档。它类似于Struts,但是有一些主要区别。突出的一点就是它并没有与JSP耦合。Turbine的特点是它提供了大量可重用的组件。此框架包中包含了大量组件,但是这些组件是离散的。它似乎应该给出更多的组件库,但是由于它缺少文档,所以很难掌握完整的体系结构。 Tapestry是一个开源的基于servlet的应用程序框架,它使用组件对象模型来创建动态的,交互的web应用。一个组件就是任意一个带有jwcid属性的html标记。其中jwc的意思是Java Web Component。Tapestry使得java代码与html完全分离,利用这个框架开发大型应用变得轻而易举。并且开发的应用很容易维护和升级。Tapestry支持本地化,其错误报告也很详细。Tapestry主要利用javabean和xml技术进行开发。 Apache Lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自已需要自订其功能。 iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。 Bea hell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。它将脚本化对象看作简单闭包方法(simple method closure)来支持,就如同在Perl和JavaScript中的一样。 它具有以下的一些特点:使用Java反射API以提供Java语句和表达式的实时解释执行;可以透明地访问任何Java对象和API;可以在命令行模式、控制台模式、小程序模式和远程线程服务器模式等四种模式下面运行;与在应用程序中一样,可以在小程序中(A let)正常运行(无需编译器或者类装载器);非常精简的解释器jar文件大小为175k OpenCms是一个J2EE的产品,它是用Java写成的。它和Tomcat捆绑在一起。但是也能够使用ATG Dynamo、WebLogic和WebSphere。OpenCms支持多种RDBMS来保存内容,包括Oracle、SQL Server、Sybase和mySQL。新版本提供了一个新的模板引擎,JSP支持,一种新的连接管理系统,提高了稳定性。 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regre ion testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。 opencrx很容易与你现存的系统集成 (ERP, IVR, CTI, …)是你对你以前投资的最大保护而且openCRX支持大多数通用技术,例如 RMI, CORBA, JMS, SOAP, 以及 JCA; openCRX也包括了支持典型插件的智能前台,例如文档管理,库存跟踪, 设备管理,等. openCRX 可以运行于任意J2EE兼容的应用服务器 (e.g. JBo , BEA WebLogic or IBM WebSphere) 和主流数据库 (e.g. MaxDB, Firebird, PostgreSQL, MS SQL, Oracle, or IBM DB2). 容易定制 基于 XML 的定制:径直的,迅速的以及可行的(包括多语言特性) 容易扩展写下你自己的工作流,或者发展可扩展的得益于openCRX的基于组件的体系和像 J2EE,MDA 等的开放标准,这是一个很简单的任务。(摘自http://www.opencrx.com.cn/crx/) BlueJ是一个专门为入门级教学设计的JavaTM 开发环境。它是由澳大利亚墨尔本Monash大学BlueJ小组设计并开发的。 XWiki是一个强大的Java开源的Wiki引擎。它支持一些受欢迎的特性如:
* 内容管理(浏览/编辑/预览/保存),
* 支持附件,
* 版本控制,
* 全文本搜索,
* 权限管理
* 使用Hibernate进行数据存储,
* RSS输出与显示外部的RSS feeds,
* 多语言支持,
* 提供XML/RPC的API,
* WYSIWYG HTML编辑器,
* 导出为PDF
* Groovy脚本支持等等….。 EJBCA是一个全功能的CA系统软件,它基于J2EE技术,并提供了一个强大的、高性能并基于组件的CA。EJBCA兼具灵活性和平台独立性,能够独立使用,也能和任何J2EE应用程序集成。 利用OpenLaszlo免费平台可以快速地,简单地开发漂亮Web 应用程序。这些Web应用程序可以运行在当前任何流行的浏览器与桌面操作系统。它只需要一个XML文件。 Sun微系统公司公开了旨在建立P2P(Peer to Peer)通用技术基础的JXTA计划。JXTA技术是网络编程和计算的平台,用以解决现代分布计算尤其是点对点(P2P)计算中出现的问题。 JXTA将建立核心的网络计算技术,提供支持在任何平台、任何地方以及任何时间实现P2P计算的一整套简单、小巧和灵活的机制。JXTA首先将归纳目前P2P的功能特别,而后建立核心的技术来表达目前的P2P计算的局限性。其重点是创建基本的机制,而具体的策略选择权则交给应用的开发者。JXTA将充分利用XML、Java等开放技术,使得UNIX操作系统更强大和灵活,比如利用管道(Pipes)传输Shell命令实现复杂的计算任务。JXTA支持P2P应用的基本功能来建立一个P2P系统,还将努力证实这些可以成为建立更高层功能的基础构造模块。JXTA架构可以分为三个层面:JXTA核心层、JXTA业务层和JXTA应用层。 JDOI truments是一个用Java开发的嵌入式面向对象数据库.它还实现了Sun的JDO规范用于Java对象的透明持久化.它可运行在
windows2000, windows2003 64bits,和Linux(Fedora Core2)平台上. EPIC是一个开源的Perl开发工具.支持语法高亮显示,快速语法检查,内容帮助,perldoc支持,源码格式,模板支持和一个Perl调试器. GeoAPI为OpenGIS规范提供一组Java接口。 FINA是一个三层J2EE应用程序用于从一些金融机构(如银行,投资公司等)接收数据,然后把数据存储到DB (Oracle/MSSQL/DB2)数据库中并生成相应的报表. FINA是一个完全可定制的和综合的强大报表设计器. XSM(eXte ible Site Manager)下一代的web网站管理系统。它能够让用户轻松地在线管理它们的网站,并同时在服务器上维护一个静态的网站。 QOLdap是一个Ecli e平台下LDAP目录浏览器. JDots(Java Dynamic Object Tree System)是一个很小的Java包,它能够让Java开发者构建一棵Java对象树,这些对象之间还可互相通信.一个对象可以发送一个方法调用到它的父节点或子节点对象.参数只能是可包含任何数据格式的TagLists类型. MiddlegenIDE是一个
在Ecli e下的插件,它可生成映射文件,JavaBean源码,配置文件和导入相关的jar.而你所要做的只是配置好数据库连接信息和选择要生成映射文件与Java类的数据库表.MiddlegenIDE当前版本只支持生成Hibernate映射文件与JavaBean源码. Stripes是一个视图框架用于利用最新的Java技术来构建Web应用程序.它具有以下特点:不需要对每一page/action进行映射配置(ActionBea 将自动被发现,它利用注释进行配置),强大的绑定引擎用于构建复杂并脱离请求参数(request parameter)的web对象,易于使用并可本地化的验证与类型转换系统.可重复使用ActionBean作为视图帮助类.支持一个form对应多个事件.透明的文件上传能力.支持持续开发(比如在构思你的ActionBean之前可以先构建与测试JSP)等. Flow4J是一个可在Ecli e平台下以拖放的方式进行工作流建模的插件.一个工作流程可包含许多流程步骤(在该项目中叫作flowlet),然后这些步骤可接连在一起组合成复杂的流程.所有流程将包含以下两种类型的flowlet:Control Flowlets如开始,判断与跳转Flowlets这些将在Ecli e中配置.另一种类型是Task Flowlets:它是一个包含特定任务的Java类,包含的功能可以是任何事件的如EJB调用或JNI调用,这些任务还可用一些脚本语言如Jython,Groovy,JavaScript等来进行开发.当在Ecli e中设计完这些流程之后,所有流程的Java源代码将自动创建. 利用Cri y提供的一个统一接口,你可以调用RMI,WebService,REST,XML-RPC,EJB,Burlap,He ian等其它服务.你不需要知道这些服务是怎样工作的,要调用的服务类型可在properties文件中定义.远程调用就像简单Java对象调用一样,你可以把Cri y集成到一个SOA(Service Oriented Architecture)或RCP(Rich Client Platform)中. 这是一个软件开发状况(包括版本,时间,测试,效率,程序代码等等)分析工具. 它会将其绘制成图表来分析,并可以以时间轴输出HTML/SVG报表. XMoon扩展自Jakarta Struts框架用于开发处理基于XML或一些脚本语言(如: BeanShell, JRuby, JudoScript, Jython,Rhino)的Web应用程序.它还提供一个用于展示该框架宠物店Demo. 它为JSP/J2EE领域中的Voice A lication提供一组基于Ecli e的开发工具. Red-Piranha是一个开源搜索系统,它能够真正学习你所要查找的是什么.Red-Piranha可作为你桌面系统(Windows,Linux与Mac)的个人搜索引擎,或企业内部网搜索引擎,或为你的网站提供搜索功能,或作为一个P2P搜索引擎,或与wiki结合作为一个知识/文档管理解决方案,或搜索你要的RSS聚合信息,或搜索你公司的系统(包括SAP,Oracle或其它任何Database/Data source),或用于管理PDF,Word和其它文档,或作为一个提供搜索信息的WebService或为你的应用程序(Web,Swing,SWT,Flash,Mozilla-XUL,PHP, Perl或c#/.Net)提供搜索后台等等. Logisim是一个教学工具用于设计和模拟数字逻辑电路. xalan-java是一套xslt处理器,用来将XML文件转换为HTML,TEXT和XML等其他类型文件格式。支持XSLT1.0和XPATH 1.0版。开发人员可以通过命令行方式或在J***A APPLET和SERVLET中使用,并可以作为自己开发的应用程序的类库使用。xalan-java实现的是tra formation API for XML(TRaX)接口,此接口为jaxp1.2标准中的一部分。 这是一个实现了SNMP协议的Java包.它提供对基本的SNMP客户端与在SNMP版本1和2中定义的代理操作的支持.这个包提供了一种机制用于取得与设置SNMP对象标识(OID:object identifier)值通过一个简单的通信接口并可用于描述SNMP结构等. Cobertura是一个基于jcoverage的免费Java工具,它能够显示哪一部分代码被你的测试所覆盖,并可生成HTML或XML报告. Jeceira是一个实现了JSR 170规范的内容管理系统. 一个JBo 实验室项目用于创建符合JSR 168规范的Wiki.它已被用于增强JBo Portal项目。 Woodstox是一个快速开源且符合StAX(STreaming Api for Xml proce ing)规范的XML处理器(做为一个处理器意味着它可以处理输入(相当于解析)与输出(相当于写入,序列化))。 Jiplet是Java SIP Servlet的简写,Jiplet Container是一个开源的服务端SIP应用程序容器.Java开发者可以利用Jiplet API来开SIP应用程序并把程序部署到Jiplet容器中.SIP (Se ion Initiation Protocol)被广范用于通过互联网提供***服务.这个容器为开发,部署和运行SIP应用程序提供了一个类似于Java Servlet的开发与运行环境.它的许多特性都非常类似于Java Servlet容器包括支持servlet映射(servlet ma ing),范围变量(scoped variables),上下文处理(context handling)等. 另外还有一个用于测试SIP应用程序的开源项目 Tudu Lists是一个日程(todo list)管理J2EE应用程序.它基于JDK5.0,Spring,Hibernate,和DWR AJAX框架.Tudu Lists同样也是一个简单但实效的项目管理工具. jCookie是一个免费,开源的Java包用于Java客户端cookie处理.客户端HTTP状态管理(或cookie处理)对于那些需要与Web应用程序如email或在线银行服务进行交互的Java应用程序是非常重要的. MrPostman是一个email网关,它使你能够直接从自己喜欢的Email客户端(如: Outlook Expre ,Thunderbird等)访问Yahoo Mail,Hotmail,gmail(Google mail)和其它webmail服务.它被设计成可扩展,因此可以很容易地添加更多的web mail服务.MrPostman还支持RSS新闻简读. Deep Network Analyzer(DNA)是一个灵活的,可扩展的深度网络分析器(服务器软件)与框架,它可收集和分析网络数据包,网络对话(se io )与应用层协议(HTTP,DNS,P2P,VoIP等),被动地隔离企业级网络.DNA主要设计用于Internet安全,入侵探测,网络管理,协议与网络分析,信息搜集,网络监测应用程序. WebHuddle一个小巧(只有100KB),简单(不需要***-直接运行在浏览器上)并且安全(所有数据通过HTTPS协议加密)的Web based视频会议系统. AbaGUIBuilder是一个用Java开发的可视化Java GUI设计器。它类似于Delphi/VB设计器,能够让应用程序开发者快速设计和创建UI Java应用程序。它当前还包括一套数据库感知组件(aware component). Co erCore是为IMS学习设计系统提供的一个J2EE运行期引擎,可以用于将IMS学习设计系统集成到你的应用程序中。 FlightGear是一个开源基于Ecli e RCP的多平台飞行模拟器。 Galleon是一个免费开源的TiVo媒体服务器.它能够让你在你的TV上欣赏各种格式的媒体内容并可进行交互式操作。把这个服务器运行在家庭电脑上并组织你的媒体内容,然后就可以在你的家庭网络上进行观看了。 在这个项目中有许多关于AJAX技术的解决方案.它展示运行在J2EE平台上AJAX应用程序开发的设计模式.其中AJAX+JSF组合就是BluePrints Solutio Catalog的一部分。
。 SnowMail是一个开源的Email客户端.它支持多POP3/SMTP账号;安全SSL连接(如果mail服务器允许);所有数据,包括邮件,账号设置,通信录都采用密码加密技术进行本地存储;Statistical SPAM过滤器等.整个项目利用免费的Java IDE
进行开发. JSR220-ORM项目为JSR220(EJB3)与JSR243(JDO2)规范的实现提供一个可视化的开发工具.它将会追踪这些规范的变化,只要它们合并在一起变成一个公共的持久化标准,这个项目也将会为这个标准提供完全实现的工具. PyDev是一个允许用户利用Ecli e进行Python开发。它提供了一些很好的功能如:代码填空,语法高亮显示,语法分析,重构(refactor)和调试等等. 这个插件允许你在Ecli e开发平台下编辑,编译和运行groovy scripts与cla es.该插件只适用于Ecli e 3.1. JavaSpaces的一个开源实现. SIPF(Sieme Intranet Portal Framework)提供一个个性化的,结构化的信息访问和应用程序的无缝集成.一个基于web的并且结构分明的可视化桌面工作环境. Lutece是一个Web门户引擎,它能够让你快速创建基于HTML,XML或数据库内容的internet或intranet门户网站.Lutece可很好的运行在Linux与Windows平台上,采用MySQL作为默认的数据库.Lutece提供一个非常简单的管理界面能够让最终用户直接使用而不需要任何专门的技术.这个工具由巴黎城市数据处理部门所开发主要用于区域Web站点项目,它已被运用在超过18个城市的Web网站上(具体可查看
). OpenQueue是一个用于发布与订阅消息队列的开放协议。这使得运行在不同机器上的,采用不同语言开发的且没有联系的应用程序之间能够进行异步通信。 HylaFAX传真服务器的一个Java客户端.它可传真PostScript格式的文档,轮询传真,自动生成与预览封面页,编辑传真的工作参数,查看接收到传真和存储文档,支持vCard 2.1导入与导出地址薄。这个项目用到一个组件叫
,这个组件提供了一些可公用的单元类用于处理一些公共的任务如:可分类的表格(sortable tables), 自动完成, 国际化(i18n) 与一个设置框架。JHylaFAX与XNap Commo 都需要Java5.0 (JRE) 。 JavaServer(TM) Faces技术简化了JavaServer应用程序用户界面的开发.各种技术水平的开发者都能够快速创建web应用程序通过在一个页面中装配一些可重复使用UI组件;并可把这些组件与应用程序的数据源连接起来;也可把客户端产生的事件与服务端事件处理者连接起来.这个项目是Sun对JSF技术规范的最完整实现. Keel Framework是一个把专注于应用程序开发某方面(如:用户接口,数据库,消息,安全等等)的开源或商业的框架以插件的方式整合在一起的元框架。Keel围绕三种核心模式进行构建:
模式(Component Oriented Programming:面向组件编程)这就为应用程序提供了一个灵活的插件(plugging/u lugging)框架.
模式(Separation of Concer :关注分离)这允许用户执行/控制/修改任何组件的功能而不会影响到其它组件.
模式(Inversion of Control:反转控制).
Keel Framework当前已经集合了Avalon,Cocoon,Struts,Hibernate,Velocity,
WebWork2,Axis, Maverick,JBo ,OpenJMS,Turbine,Lucene,BSF,Jelly,
JFreeChart,Quartz等项目!这有一篇英文的简介文章
. eXtremeTable是一个可扩展的用于以表格的形式来显示数据的一组JSP标签库. 这个插件包括的功能有:PHP语法分析,调试,代码格式化,大纲视图,代码模板定制等. 利用这个插件可以轻松地开发和测试PL/SQL代码。 Freemind是一实用的开源思维导图/心智(MindMap)软件.它可用来作为:1.管理项目(包括子任务的管理,子任务的状态,时间记录,资源链接管理).2.笔记或知识库.3.文章写作或者头脑风暴.4.结构化的存储小型数据库. OOWeb是一个轻量级的,可嵌入的Java HTTP服务器.它把URL目录映射成对象,页面映射成方法,GET/POST自变量映射成方法的参数.这提供了真正的面向对象(OO)Web开发也就不需要庞大的容器. Druid是一个允许用户以图形的方式来创建数据库的工具.用户可以add/change/delete数据库对象(表格,字段等).一旦数据库创建完成Druid就能够为你生成便于浏览所有表格的HTML/PDF文档,Java cla es(每一个表格对应一个table),数据字典,SQL script等. jXLS是一个可利用XLS模板来生成Excel文件的Java开源包. StrutsBox主要特点包括: ◆基于Ecli e3.1开发平台 ◆一个用来编辑Struts配置文件的可视化编辑器 ◆以图形的方式来显示Struts应用程序的Web Flow ◆一个可高亮显示语法的JSP编辑器 ◆可利用向导来创建Struts项目与一个新的Struts form ◆支持Struts 1.0,1.1与1.2标准 inferencing是一个用于存储,查询,解析RDF的Java框架.它可被配置作为一个web服务器或当一个Java包来使用.它的特点包括3种查询语言(SeRQL, RQL, RDQL),支持内存(RAM),磁盘(disk),与RDBMS存储. JVoiceXML一个开源的VoiceXML解析器. OAJ(OpenAccountingJ)是一个免费,开源,基于Web的Accounting/ERP系统.它利用一些开源的优秀组件如:
来为你的商业应用提供一个可靠的,可定制的,安全的平台.OAJ可以用来替代现存的PHP OpenAccounting. WSABI For Axis:一个基于Java的Web应用程序用于管理Apache Axis部署.允许用户使用一个直观的GUI来监控与配置基于CRUD SOAP的Web服务,Handlers (JAX-RPC与Axis)与全局配置(Global Configuration)等. JooReports是一个基于OpenOffice.org利用Java创建Office文档与报表的解决方案.模板可利用word处理器进行设计.生成的文档可以是PDF,Word和其它格式.数据源包括POJOs与XML. 在Ecli e开发平台下的插件. Ecli e Version Tree这个插件提供一种以图形树的方式来显示CVS资源. 基于java nio的Cindy提供一个简单,高效的异步I/O框架,支持tcp/udp/pipe并易于测试. 一个基于Web Service的工作流管理系统,采用Java和CBD思想进行开发.uEngine提供了商业BPM解决方案的大部分特性如:流程设计器,EIP,Web服务工具和DB应用程序生成器. JVC(Java View Control) Java(视图-控制)开发框架的目的是构建一个快速开发、可维护的、稳定的web开发框架,并开放源代码,互相促进开发技术。 目前比较流行的web开发框架有WebWork、Struts、Spring,这几个都是非常好的开发框架,都能实现MVC模式.参考上述几个框架的思想,开发简化了的视图-控制框架,弱化了模型层,为什么要弱化模型层,这是因为往往在模型中大部分是重复的工作。 项目主要的特点是 1.开发简单快速:大部分开发不需要写javabean,系统自带的Action能满足90%需求,只需要编写page文件(控制文件)与视图j 。 2.提供了Web系统开发过程中都需要开发的通用用户权限管理:可以控制角色对每个Command的访问权 3.提供功能强大的验证框架:使用表达式编写验证公式,支持所有逻辑表达式,并且前台j (生成javascript脚本)和后台Servlet(提交到后台的request参数)均可以调用。 4.可维护性:一般修改了数据库表需要同时修改M、V,需要重新编译,虽然简单,但带来了繁琐的操作,而且有可能引起其他错误,而jvc框架弱化了M,不需要编写对象关系映射的类,而是用命名规范使得对于大部分的修改只是需要修改V(j 页面)。 5.自定义Action可独立调试,一般Action由于需要从requset得到参数而无法进行独立调试,而jvc框架借鉴了WebWork方法把HTTP请求的封装为ActionContent类,除了交互和使用上的方便外,实现了往往开发web比较困难的独立调试。并且为下一步升级到Web+EJB或其他分布式架构做好准备。 jWic是一个Java框架用于开发基于事件的Web应用程序.它能够让你的应用程序脱离与URLs和页面流(page flows)的联系. Mule是一个企业服务总线(ESB)消息框架.它的主要特性包括:
1.基于J2EE1.4的企业消息总线(ESB)和消息代理(broker).
2.可插入的连接性:比如Jms,jdbc,tcp,udp,multicast,http,servlet,smtp,pop3, file,xm 等.
3.支持任何传输之上的异步,同步和请求响应事件处理机制.
4.支持Axis或者Glue的Web Service.
5.灵活的部署结构[Topologies]包括Client/Server, P2P, ESB 和Enterprise Service Network.
6.与Spring 框架集成:可用作ESB 容器,也可以很容易的嵌入到Spring应用中.
7.使用基于SEDA处理模型的高度可伸缩的企业服务器.
8.强大的基于EIP模式的事件路由机制等. ModSecurity是一个入侵探测与阻止的引擎.它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecurity的目的是为增强Web应用程序的安全性和保护Web应用程序避免遭受来自已知与未知的攻击. EditorList插件用于改进对Ecli e编辑器的管理.它提供一个视图用于在一个列表中显示所有Ecli e编辑器并能对编辑器按自己的要求进行分组. JML是一个Java M Me enger开发包.支持MSNP8/9/10/11. JMAGE是一个Java imaging框架可在运行期动态编辑图片.它主要运用于Web应用程序中.类似于WYSIWYG imaging应用程序. 这个项目实现了一个学习管理系统(LMS).它提供一个通过内容发布来创建一个虚拟课堂的框架. wlFxp是一个类似于FlashFXP的Ftp/Fxp客户端.它的特点包括站点管理,列队管理,支持socks4/5, OTP和TLS/SSL. Fourfive是一个领先的开源Web报表解决方案,使用XML作为它的配置文件。支持集群、负载平衡、动态发布、PDF, Excel, LDAP,图表、过滤器、排序、布局定制、门户、Ja erReports、Velocity模板、兼容Internet Explorer, Netscape, Mozilla, Opera。 AWTaglib是一个J 标签可用于创建网格(grid)控件.它还提供一些额外的功能可以把网格中的数据导出为XLS,PDF和CSV(利用Ja erReports来实现)并能与Struts框架相结合. GILD(Groupware enabled Integrated Learning and Development)是一个用于程序开发教学与学习的Ecli e插件.Gild能够让教师把代码例子与课程资料相结合. Calyxo一个基于MVC模式的Web框架.它为开发真正模块化的应用程序提供支持.它还包括支持i18n,一个灵活视图管理器和一个强大验证引擎等.Calyxo被分成五个组件分别为:1.Calyxo Base,2.Calyxo Control,3.Calyxo Panels,4.Calyxo Forms,5.Calyxo Struts(这个组件的目的是让Calyxo的其它组件可结合到Struts框架中,比如Calyxo Panels与Calyxo Forms可被用来替代Struts Tiles与Struts Validator在Struts中的使用). Hibernate A otator能够让你利用Java 5注释(a otatio )来生成Hibernate ma ing xml文件.它可作为那些原来使用xdoclet但要移植到Java5的一个替代品或作为Hibernate A otatio 项目之外的另一个可选项目. ServiceMix是一个建立在JBI (JSR 208)语法规则和APIs上的开源ESB(Enterprise Service Bus:企业服务总线)。它包括一个完整的JBI容器,其主要是由标准化信息服务和路由器,JBI管理MBea ,JBI配置单元和Ant任务(***组件和管理容器)组成。新版本中集成了BPEL,增加了一个基于router的高性能目录,XPath转换引擎,Drools新规则,对RSS的支持与JCA的完全结合等等。 Volity为创建基于Internet的多人在线游戏提供一个开发平台.它主要关注于board和card游戏. JCas实现了一个免费,开源基于Java的CAS服务器. 一个能与Yahoo! Search Web Services进行通信的Java开发包. WS-JDBC是一个client/server JDBC驱动器,其中服务器部分是以Web服务的方式来实现.这意味着这个定制的JDBC驱动器客户端可以通过Internet来调用相应的服务. Xa o是一个基于java1.5注释(a otation)的文件生成工具.这个项目的目的是创建一个下一代的XDoclet项目. 采用java 1.5开发的文件下载工具.它能够从用户定义的表达式生成URL并进行下载. Virtual Qmail是一个用于Qmail的虚拟域名管理系统.这个系统允许通过Web的方式来管理它们的账号. Intelligent适合于那些已经掌握如何使用HTML与CSS的用户但还希望能有一个更易于管理的web页面. 整合Laszlo与JSF的一个开源包. XMLConfigReader是对Java ResourceBundle类的一个开源扩展.利用它可以直接从XML文件中读取配置数据并把数据存储在一个HashTable中. 对java.util.zip包的一个纯Java实现(没有使用本地代码). One-JAR可以解决如何把一个依赖于多个其它jar文件的应用程序发布成一个单一的可执行Jar文件.它使用一个可定制的类装载器(cla loader)来打开在主Jar中的Jar文件包. JPackIt可以把Java工程打包成一个可执行的包(如:jar,cla 或exe).包括所有Java应用程序资源如:代码,图片,属性文件和被引用的第三方包. Commoncli e这个插件类似于Commo 4E
归类于:
— TerryChan @ 6:57 pm
2005年08月03日
上篇 提到了openJms的构建及消息的发送和接收,这篇主要了解消息的发布和订阅。JMS 的发布/订阅模型定义了如何向一个内容节点发布和订阅消息,内容节点也叫主题(topic),主题是为发布者(publisher)和订阅者(su cribe) 提供传输的中介。发布/订阅模型使发布者和订阅者之间不需要直接通讯(如RMI)就可保证消息的传送,有效解决系统间耦合问题(当然有这个需要才行),还有就是提供了一对一、一对多的通讯方式,比较灵活。
先介绍JMS里2个概念,持久订阅模式和非持久订阅模式,其实也是发布/订阅模型在可靠性上提供的2种方式:
非持久订阅模式:只有当客户端处于激活状态,也就是和JMS 服务器保持连接的状态下,才能接收到发送到某个Topic的消息,而当客户端处于离线状态时,则这个时间段发到Topic的消息将会永远接收不到。
持久订阅模式:客户端向JMS 注册一个识别自己身份的ID,当这个客户端处于离线时,JMS 服务器会为这个ID 保存所有发送到主题的消息,当客户再次连接到JMS 服务器时,会根据自己的ID 得到所有当自己处于离线时发送到主题的消息,即消息永远能接收到。
下面我们就接着来看openJms在发布/订阅模式上的表现,由于篇幅关系,在这里只讲述非持久订阅模式,持久订阅模式可以根据JMS的标准来试。
消息发布的代码如下:
package javayou.demo.openjm import java.util.*;
import javax.jms.*;
import javax.naming.*;
/** * @author Liang.xf 2004-12-27 * openJms 发布消息演示 * */
public cla TopicPublish { public static void main(String[] args) { try { //取得JNDI上下文和连接 Hashtable properties = new Hashtable(); properties.put( Context.INITIAL_CONTEXT_FACTORY, org.exolab.jms.jndi.InitialContextFactory); //openJms默认的端口是1099 properties.put(Context.PROVIDER_URL, rmi://localhost:1099/); Context context = new InitialContext(properties); //获得JMS Topic连接队列工厂 TopicCo ectionFactory factory = (TopicCo ectionFactory) context.lookup( JmsTopicCo ectionFactory); //创建一个Topic连接,并启动 TopicCo ection topicCo ection = factory.createTopicCo ection(); topicCo ection.start(); //创建一个Topic会话,并设置自动应答 TopicSe ion topicSe ion = topicCo ection.createTopicSe ion(false, Se ion.AUTO_ACKNOWLEDGE); //lookup 得到 topic1 Topic topic = (Topic) context.lookup(topic1); //用Topic会话生成Topic发布器 TopicPublisher topicPublisher = topicSe ion.createPublisher(topic); //发布消息到Topic System.out.println(消息发布到Topic); TextMe age me age = topicSe ion.createTextMe age (你好,欢迎定购Topic类消息); topicPublisher.publish(me age); //资源清除,代码略 … … } catch (NamingException e) { e.printStackTrace(); } catch (JMSException e) { e.printStackTrace(); } }
而订阅消息的接收有同步的和异步2种,他们分别使用receive()和onMe age(Me age me age)方法来接收消息,具体代码:
同步接收:
package javayou.demo.openjm import java.util.*;
import javax.jms.*;
import javax.naming.*;
/** * @author Liang.xf 2004-12-27 * openJms 非持久订阅同步接收演示 * */
public cla TopicSu cribeSynchronous { public static void main(String[] args) { try { System.out.println(定购消息接收启动:); //取得JNDI上下文和连接 Hashtable properties = new Hashtable(); properties.put(Context.INITIAL_CONTEXT_FACTORY, org.exolab.jms.jndi.InitialContextFactory); properties.put(Context.PROVIDER_URL, rmi://localhost:1099/); Context context = new InitialContext(properties); //获得Topic工厂和Co ection TopicCo ectionFactory factory = (TopicCo ectionFactory) context.lookup( JmsTopicCo ectionFactory); TopicCo ection topicCo ection = factory.createTopicCo ection(); topicCo ection.start(); //创建Topic的会话,用于接收信息 TopicSe ion topicSe ion = topicCo ection.createTopicSe ion( false, Se ion.AUTO_ACKNOWLEDGE); //lookup topic1 Topic topic = (Topic) context.lookup(topic1); //创建Topic su criber TopicSu criber topicSu criber = topicSe ion.createSu criber(topic); //收满10条订阅消息则退出 for (int i=0; i10; i++) { //同步消息接收,使用receive方法,堵塞等待,直到接收消息 TextMe age me age = (TextMe age) topicSu criber.receive(); System.out.println(接收订阅消息[+i+]: + me age.getText()); } //资源清除,代码略 … … System.out.println(订阅接收结束.); } catch (NamingException e) { e.printStackTrace(); } catch (JMSException e) { e.printStackTrace(); } }
非同步接收:
package javayou.demo.openjm import java.util.*;
import javax.jms.*;
import javax.naming.*;
/** * @author Liang.xf 2004-12-27 * openJms 非持久订阅异步接收演示 * */
public cla TopicSu cribeAsynchronous implements Me ageListener { private TopicCo ection topicCo ectio private TopicSe ion topicSe io private Topic topic; private TopicSu criber topicSu criber; TopicSu cribeAsynchronous() { try { //取得JNDI上下文和连接 Hashtable properties = new Hashtable(); properties.put( Context.INITIAL_CONTEXT_FACTORY, org.exolab.jms.jndi.InitialContextFactory); properties.put(Context.PROVIDER_URL, rmi://localhost:1099/); Context context = new InitialContext(properties); //取得Topic的连接工厂和连接 TopicCo ectionFactory topicCo ectionFactory = (TopicCo ectionFactory) context.lookup( JmsTopicCo ectionFactory); topicCo ection = topicCo ectionFactory.createTopicCo ection(); //创建Topic的会话,用于接收信息 topicSe ion = topicCo ection.createTopicSe ion(false, Se ion.AUTO_ACKNOWLEDGE); topic = (Topic) context.lookup(topic1); //创建Topic su criber topicSu criber = topicSe ion.createSu criber(topic); //设置订阅*** topicSu criber.setMe ageListener(this); //启动信息接收 topicCo ection.start(); } catch (NamingException e) { e.printStackTrace(); } catch (JMSException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println(非同步定购消息的接收:); try { TopicSu cribeAsynchronous listener = new TopicSu cribeAsynchronous(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } //收到订阅信息后自动调用此方法 public void onMe age(Me age me age) { try { String me ageText = null; if (me age i tanceof TextMe age) me ageText = ((TextMe age) me age).getText(); System.out.println(me ageText); } catch (JMSException e) { e.printStackTrace(); } }
编译好后,启动openJms服务,打开admin管理台,为了运行方便,这里先列出三个类的运行命令:
java -cp .\; -Djava.ext.dirs=.\li javayou.demo.openjms.TopicPublish
java -cp .\; -Djava.ext.dirs=.\li javayou.demo.openjms.TopicSu cribeSynchronous
java -cp .\; -Djava.ext.dirs=.\li javayou.demo.openjms.TopicSu cribeAsynchronous
先运行2个接收命令,再运行发布命令,可以看到控制台的Topic有消息接收,并且接收1和2都有消息接收的提示,到此完成演示,由于是非持久订阅,所以可以看到控制台上的Topic消息条数不会减少。
最后,说说openJms的缺点,它不支持XA tra actio 、集群和热备等高级功能,如果你需要这些特性,最好还是使用商业的JMS服务器,但不论怎样,openJms为我们提供了一个学习JMS的最好路径,有兴趣了解JMS的还是来尝试尝试吧。
归类于:
— TerryChan @ 4:16 pm
本文介绍开源的JMS服务器openJms,及怎样使用openJms来构建系统之间健全、高度可用的通讯,从而简化企业级应用的开发。openJms符合SUN的JMS API 1.0.2规范,支持消息队列,还支持消息传递的发布/订阅模式,本文先就系统服务的搭建及JMS的非结构化消息发送和接收进行说明。
JMS 有五种消息类型。三种结构化或半结构化的消息类型(MapMe age、ObjectMe age 和 StreamMe age)以及两种非结构化的或自由格式的消息类型(TextMe age 和 BytesMe age)。而这里虽然我们只对非结构化消息进行说明,但非结构化的消息格式却能够更好地进行交互操作,因为它们在消息上很少利用结构,在此基础上与XML再进行结合,将能方便的进行更好的扩展,XML相关简化操作参考
下面具体来介绍服务器搭建,在
下载openJms,解压后可以直接使用,在 \openjms-0.7.6.1\bin 里,有openJms的运行脚本,执行 startup 启动,弹出一个新的窗口,服务就运行在新窗口内,shutdown 为停止命令:
服务运行后,就可以开始使用JMS服务了,至此服务搭建完毕,简单得不能再简单了。
下面是消息发送和接收的开发,开发中需要的jar包在\openjms-0.7.6.1\lib里可以找到:
openjms-0.7.6.1.jar
jms-1.0.2a.jar
exolabcore-0.3.7.jar
commo -logging-1.0.3.jar
把上面的类包加入到项目中,下面是消息发送服务的代码:
package javayou.demo.openjm import java.util.*;
import javax.jms.*;
import javax.naming.*;
/** * @author Liang.xf 2004-12-24 * For openJms 演示, Me age 发送 * */
public cla QueueSend { public static void main(String[] args) { try { //取得JNDI上下文和连接 Hashtable properties = new Hashtable(); properties.put( Context.INITIAL_CONTEXT_FACTORY, org.exolab.jms.jndi.InitialContextFactory); //openJms默认的端口是1099 properties.put(Context.PROVIDER_URL, rmi://localhost:1099/); Context context = new InitialContext(properties); //获得JMS信息连接队列工厂 QueueCo ectionFactory queueCo ectionFactory = (QueueCo ectionFactory) context.lookup( JmsQueueCo ectionFactory); //获得JMS信息连接队列 QueueCo ection queueCo ection = queueCo ectionFactory.createQueueCo ection(); //产生队列Se ion,设置事务为false,自动应答消息接收 QueueSe ion queueSe ion = queueCo ection.createQueueSe ion( false, Se ion.AUTO_ACKNOWLEDGE); //获得默认内建在JMS里的队列之一:queue1 Queue queue = (Queue) context.lookup(queue1); //产生JMS队列发送器 QueueSender queueSender = queueSe ion.createSender(queue); //发送数据到JMS TextMe age me age = queueSe ion.createTextMe age(); me age.setText(Hello, I’m openJms.); queueSender.send(me age); System.out.println( 信息写入JMS服务器队列); //以下做清除工作,代码略 // … … } catch (Exception e) { e.printStackTrace(); } }
执行程序发送消息,然后打开JMS控制台,用 admin 命令启动管理平台,点击菜单Actio -Co ectio -online,出现界面如下:
可以看到JSM默认的队列queue1里已经有1条消息了,而其他的队列还是空着的。
下面我们来看看消息接收服务的代码:
package javayou.demo.openjm import java.util.*;
import javax.jms.*;
import javax.naming.*;
/** * @author Liang.xf 2004-12-24 * For openJms 演示, Me age接收 * */
public cla QueueReceiveSynchronous { public static void main(String[] args) { try { //取得JNDI上下文和连接 Hashtable properties = new Hashtable(); properties.put( Context.INITIAL_CONTEXT_FACTORY, org.exolab.jms.jndi.InitialContextFactory); properties.put(Context.PROVIDER_URL, rmi://localhost:1099/); Context context = new InitialContext(properties); //获得JMS信息连接队列工厂 QueueCo ectionFactory queueCo ectionFactory = (QueueCo ectionFactory) context.lookup( JmsQueueCo ectionFactory); //获得JMS信息连接队列 QueueCo ection queueCo ection = queueCo ectionFactory.createQueueCo ection(); //启动接收队列线程 queueCo ection.start(); //产生队列Se ion,设置事务为false,自动应答消息接收 QueueSe ion queueSe ion = queueCo ection.createQueueSe ion( false, Se ion.AUTO_ACKNOWLEDGE); //获得默认内建在JMS里的队列之一:queue1 Queue queue = (Queue) context.lookup(queue1); //产生JMS队列接收器 QueueReceiver queueReceiver = queueSe ion.createReceiver(queue); //通过同步的方法接收消息 Me age me age = queueReceiver.receive(); String me ageText = null; if (me age i tanceof TextMe age) me ageText = ((TextMe age) me age). getText(); System.out.println(me ageText); //以下做清除工作,代码略 // … … } catch (Exception e) { e.printStackTrace(); } }
编译后运行接收信息服务,可以看到接收到并打印之前发送的消息,再看看控制台,发现queue1的消息队列变为0,消息已被读取,消息发送和接收到此结束。
归类于:
— TerryChan @ 3:38 pm
Pages (7):
......近来blog
bloger中人
IT生活
最新日志
存档 (1) (2) (1) (20) (7) (6) (2) (3) (3) (6) (3) (2) (6) (31) (3) (1) (8) (6) (5) (17) (18)
最新评论
Sonic 发表于《
发表于《
skycliff 发表于《
hbing 发表于《
发表于《
is Powered by