在可扩展基础设施环境中演化持久存储库中的条目的制作方法

文档序号:6413044阅读:161来源:国知局
专利名称:在可扩展基础设施环境中演化持久存储库中的条目的制作方法
技术领域
本发明涉及采用持久存储库的环境,更具体地说涉及在该环境中创建的虚拟空间中的条目。
背景技术
太阳公司开发了JavaTM,这是一种第三方发行的计算工具。JavaTM的三个部件是JavaTM编程语言、Java虚拟机TM(JVM)和JavaTM平台。
JavaTM编程语言与所有其他语言类似,只是一种具有它自己的语法、结构和过程的编程语言。它是用来编写JavaTM应用例如小应用程序(applet)、小服务程序(servlet)和JavaBeansTM组件的语言。然而,JavaTM语言的一个独特部分在于它不像大多数其他语言那样编译为机器可读代码。它编译为字节码。这些字节码可由JVM解释。
JVM是JavaTM解释器。JavaTM程序以字节码的格式是可移植的,但是它们只可移植到已导入(port)了JavaTM解释器的平台。幸运地是,从运行Windows、Unix或Macintosh的桌面系统到移动电话,几乎对于所有类型的系统都可获得免费的JVM。所有这些系统都能够是JavaTM平台。
平台一般标识出通常由操作系统定义的应用编程接口(API)集合。编写将在特定操作系统例如Windows上运行的程序的程序员使用的API集合不同于为Macintosh操作系统编写程序的程序员所使用的API集合。然而,JavaTM平台提供的API可运行在运行JavaTM平台的任何操作系统上。在某些意义上,JavaTM平台是位于JavaTM代码和操作系统之间的中间平台。它使得程序员可一次性地编写程序而到处都可运行。
由于JavaTM代码可运行在若干不同操作系统和若干不同设备上,因此可看出这一特性的逻辑延伸是将这些系统或设备连接到了一起。Jini用作为进行这些连接的框架。Jini是使得网络上的不同服务可发现(discover)彼此的规范集合。所述规范还使得这些设备可参与该网络上的操作;所述网络有时称为共同体(community)。然而,为了避免在下面的讨论中产生混淆,将把所述网络称为网络或JiniTM共同体。
JiniTM着重于服务。服务也可看作为服务接口。例如,某个设备例如服务器可向外部世界提供作为设备API的接口。这一API接口就是服务。由于JiniTM是分布式网络,因此就存在客户端和服务器。然而,这些客户端和服务器只关心使得它们可访问其他客户端和服务器的接口。客户端或服务器将了解特定的服务API,但是不关心其实现。例如,网络上可能有个打印机。网络上的另一个成员将知道有个打印机API,但是不关心它是何种打印机。该打印机服务将使得所述成员可发送打印工作到该服务,并处理所述打印工作到所述打印机的特定API的翻译。
JiniTM服务的一个示例是JavaSpacesTM。简单地说,JavaSpacesTM定义了一个持久存储库。按照上面的讨论,希望使用JavaSpacesTM的客户端只需要知道JavaSpacesTMAPI。客户端不需要知道与在其上实现该JavaSpacesTM的服务器的类型有关的细节。
Cisco系统公司开发的Scalable InfrastructureTM(可扩展基础设施)系统提供了一个全分布的可扩展基础设施,用于建立在JiniTM和JavaSpacesTM(空间(Space))上的通信系统。希望与共同体的其他成员或共同体外部进行通信的设备或应用将对象插入到所述空间中。空间然后向共同体的订阅成员公布所述对象的存在。双重代理(double agent)能够在一方利用任何期望的协议,而在另一方利用空间协议进行通信。与空间不相关的代理处理路由、管理性及其他任务,例如空间和共同体之间的通信。
然而,在这种应用中使用空间存在一些限制。空间内的条目是不可演化的。空间实现内的虚拟机下载了该条目的类(class)后,就不允许进一步的修改。不能增加新的字段,当前字段在下载后也不能从条目中删除,除非重起虚拟机。这限制了JavaSpacesTM和Scalable InfrastructureTM通信系统二者的灵活性和可适用性。

发明内容
这里描述了一种在持久存储库中提供可演化条目的方法。所述方法包括从代理接收去往所述持久存储库的条目。将所述条目转换为插入在所述持久存储库中的版本化条目。如果启动了读(read)或取(take)操作,则从所述持久存储库中读所述版本化条目,并将其转换为条目。
在一个实施例中,所述转换是通过到所述持久存储库的接口和条目矩阵实现的。所述条目矩阵跟踪已作出的改变以及与所述改变相关联的关联代码基,以使得所述接口可在版本化条目和初始条目之间进行映射。


通过参考附图来阅读所公开的内容可最佳地理解本发明,其中图1示出了可扩展基础设施系统的示例。
图2示出了根据现有技术,将条目插入持久存储库的代理的示例。
图3示出了将可演化条目插入持久存储库的代理的实施例。
图4示出了创建演化条目的方法的实施例的流程图。
图5示出了网络设备的实施例。
具体实施例方式
图1示出了Cisco系统公司开发的Scalable InfrastructureTM系统的示例。系统10包括若干不同共同体12、14、16和18。每个共同体对于成员和配置都具有无限可能性。例如,共同体12包括两个共同体20和22,各自建立在具有自己的成员的空间四周。这里使用的空间意味着持久存储库,例如JiniTM的JavaSpacesTM服务所提供的持久存储库。与此对比,空间16内建立的共同体只有一个成员。
这里使用的共同体指的是这些代理的集合和持久存储库。可以使用任何类型的持久存储库,只要具有下述能力,即可将对象插入该存储库中而不会丢失所述对象的属性,并可在插入对象时提供通知服务。在这一特定的示例中,JavaSpacesTM将被用作为持久存储库,但是SI系统适用于任何类似的技术。为了便于讨论,将把持久存储库称为“空间”。空间可以若干不同的实现来使用,下面的讨论仅仅是示例。
需要注意,本图中所示出的连接表明的是硬布线连接,但通常并非如此。该系统更可能地会以软件实现,并且这些连接是虚拟连接;可根据需要进行分解和重组,以在所述共同体的各个成员之间以及各个共同体之间提供通信。
Scalable InfrastructureTM系统结合代理来使用持久存储库,以在各个成员之间提供通信。例如,共同体20的成员可能希望与共同体14的成员联系。该成员的设备例如电话或个人计算机允许呼叫成员发出呼叫。所述呼叫导致一个对象被插入到接收成员的空间中。这一对象的出现由许多代理中的一个进行注册,并传输到共同体14的空间。一个对象被插入到该空间中,并且,与接收成员相关联的代理取得该对象,接收成员接收所述呼叫。
在电话呼叫之外还有多种类型的对象可被插入空间中。这些对象将被称为条目。条目是具有类型的对象组,表现为可被写入空间中的类。将条目写到空间中会创建该条目的一个拷贝,可用于将来的查找操作。查找操作通常是读操作或取操作。读操作返回与读请求相匹配的条目,或者表明未发现匹配。取操作的操作与读类似,但是如果发现了匹配,则从空间中删除匹配条目。
在一些情形下,匹配条目的需求可能会导致问题。查找操作通常需要所有的条目对象将其字段的一些或全部设置为必须精确匹配的指定值,其余字段是通配符。然而,条目必须具有与请求相同的字段,否则就不会获得匹配。因此,如果条目具有增加的字段或删除了字段,则查找操作将会导致未发现匹配。也就是说,条目不可演化。
现在参考图2,发生了当前如何将条目插入空间中的示例。代理A 32写一个条目,其表明了给定用户的所有呼叫偏好,例如默认电话号码、移动电话号码、寻呼号码等等。所述偏好表明呼叫路由的顺序和规范,例如“首先呼叫我的默认号码,使其振铃3次,然后尝试我的移动电话”。这一条目将被称为偏好条目36。类似地,代理B写关联用户的类似偏好条目。这些条目中的任何一个可被其他代理所发现,并且由于每个都具有相同的基本偏好条目模板38,因而可以附带所有已定义的字段地使用。
如果代理B试图向该条目增加字段或从该条目删除字段,则会导致不匹配。然而,一般地,当所述类被运行所述空间的虚拟机下载之后,管理性接口就会防止进行改变。为了允许被改变的字段,虚拟机将不得不停止并重起。这使得虚拟机可重新编译和下载具有新字段或删除了字段的类。然而,这是不可行的。
现在参考图3,本发明的实现使得所述条目的两个版本存在于空间中,每个具有不同的版本。代理B写被映射为版本化条目42的条目40,例如“PreferenceEntry_1.2”,版本化条目42是被实际写到空间中的条目。类似地,代理A写被映射为版本化条目44的偏好条目36,例如“PreferenceEntry_1.1”。然后将这些版本化条目写到空间中。
在一个实施例中,代理通过调用接口层(这里称为代理层)来写条目。代理层然后与条目矩阵交互,并将版本化条目写到空间。按照这种方式,代理不需要“了解”所述条目矩阵或版本化处理,它们只是将所述条目写为标准条目,代理层处理所述版本化。
在本发明的实施例中引入了一个工具框,其中使用该工具框来参考与JavaSpaces和对特定条目作出改变的开发者之间的管理性交互。下述具体示例只是为了便于讨论,而非以任何方式限制来限制本发明的应用。所述示例开始于开发者建立将要写条目的代理,并已决定对该条目增加一些新字段。
先前的条目可能是PreferenceEntry extends SiAbstractEntry{Private String versionNumber=“1.1”;Public String fieldOne;Public String fieldTwo;}开发者然后将该条目修改为PreferenceEntry extends SiAbstractEntry{Private String versionNumber=“1.1”;Public String fieldOne;Public String fieldTwo;Public Boolean bChanged;Public Integer iCounter;}所述条目的空间实例是否包括版本1.1或1.2条目并不重要。这一问题的原因在于具有两个PereferenceEntry对象。一旦所述机器具有单个PreferenceEntry条目,则它不能重新加载较新的类格式,并且在尝试从空间读或取该条目时,发生“不匹配的类型/条目”异常而结束。
然而,如果对每个版本使用不同的代码基,则该条目的两个不同版本就可以共存在空间中,即使具有不同的字段。代码基是这样一种机制,虚拟机通过它来经由超文本传输协议(HTTP)将其还未见过的类下载到它的名称空间中。
将要使用所述工具框来同时用于创建和更新维护版本化信息的条目矩阵。条目矩阵不仅定义了新条目,还定义了它们所包含的内容。例如Public class EntryMatrix extends SiAbstractEntry{public class evolvingentry{public integer MajorVersion;public Integer MinorVersion;public String SiEntryName;public String strDateUpdated;public String str Version ChangeReason;public String strPriorCodebaseUrl;public String strCodebaseUrl;public String strJavaSource;public vector vLinkedListOfEvlovedEntries;}public String spaceGuid;public String spaceName;public Vector vEvolvableEntries;}工具框然后针对已被改变或修改的每个条目来填充条目矩阵。使用先前的示例,PreferenceEntry是条目矩阵的具有其关联版本的元素之一。MinorVersion也可称为版本标识符。上面示出为示例的条目矩阵将被填充如下public class EntryMatrix extends SiAbstractEntry{public class evolvingentry{public integer MajorVersion;等于1public Integer MinorVersion;分别等于1和2(1.1和1.2)public String EntryName;“PreferenceEntry”public String SiEntryName; PreferenceEntry_1.1和PreferenceEntry_1.2public String strDate Updated;日期public String strVersionChangeReason;被改变的原因public String strPriorCodebaseUrl;server//path1/version1.1/和server//path1/version1.2/public String strCodebase Url;public String strJavaSource;将来可使用的实际Java源代码public vector vLinkedListOfEvlovedEntries;public Byte[]bytesOfEntryClass;提供代码基的可替换方案以使得虚拟机可下载所述类。}public String spaceGuid;public String spaceName;public Vector vEvolvableEntries;}
spaceGuid和spaceName用来使得不同的版本可在虚拟空间内应用不同的JavaSpaces实例。vEvolvableEntries是已排序的EvlovingEntries的向量,包括元素vLinkedListOfEvlovedEntrides中的过去的条目及其版本的向量。
这里必须注意,行public Byte[]使得虚拟机具有另一个选择来访问用于适当的版本的代码基。从空间中取或读条目的代理可能不能访问该代理的代码基中的版本化条目的正确版本。该行使得该代理可访问作为空间中的对象的代码基。也就是说,将用于特定版本化条目的代码基版本作为对象放置在空间中,代理可从空间读它,而不是如上所述地使用HTTP来读它。
工具框将写所述条目矩阵对象,并将之分布到所有的持久存储库上。一旦已填充条目矩阵并将之拷贝到各个JavaSpacesTM示例,不同版本的代理就可以使用该矩阵来创建具有相同“名称”的多个条目,共存在同一空间中,而无需重起所述空间。
现在参考图4,以流程图的形式示出了创建并写多个条目的处理的实施例。将针对上述代理来讨论本实施例,但无意于限制本发明的应用或权利要求的范围。在50,接收来自希望将条目写到空间中的代理的调用。调用的接收者是所述接口或代理层。在本示例中,代理A将是在版本1.1代码基下创建的代理,而代理B是在版本1.2代码基下创建的代理。然后在52,当代理A的代理层写一个条目例如上述PreferenceEntry时,它实际写出的是PreferenceEntry_1.1或上述示例中定义的SiEntryName。这避免了所有的名称冲突,需要维护这一版本连接的唯一元素是条目矩阵和JavaSpaces接口。在一个实施例中,将条目转换为版本化条目是由JavaSpaces接口使用条目矩阵中的信息来执行的。
然后根据上述写/通知或读/取操作来对版本化条目进行操作。在写/通知操作中,创建一个新的具有类型“PreferenceEntry_1.1”的对象,其将来自代理层实际写下的PreferenceEntry对象的所有字段映射到将要插入到空间中的版本化对象。然后在54将版本化对象插入到空间中。将版本化对象插入到空间中后,就可以取或读它,但这些处理是可选的。
在读/取操作中,然后将版本化条目映射回为一般的PreferenceEntry对象。例如,如果代理A插入了给定用户的偏好,则获得了版本化条目PreferenceEntry_1.1。如果代理B需要取或读当前系统中的该条目,则会返回错误,因为两个版本之间的字段不同,这是因为代理B使用版本1.2。然而,在实现本发明时,当代理B在54取与代理A相关联的成员的条目时,在58,代理层将PreferenceEntry_1.1的字段映射回为一般的PreferenceEntry,代理B已获得了匹配并具有了所需的信息。所述代理并不知道这些处理中的任何一项。它们只是写和读对象PreferenceEntry。
在一个实施例中,用代理应使用的条目的版本来定义所述代理。这可以依赖于最初启动代理时设置的标记。两种条目类型都是有效的,不会有冲突。如果系统正从版本1.1迁移到版本1.2,则会使版本1.1条目越来越少,直到整个系统使用版本1.2。
不一定要将系统迁移到较新的版本。两个版本都可以永远地共同使用。然而,如果较新的版本具有更快的处理这一更好的功能,或者出于某种其他原因而比较旧的版本更可取,则可能优选地使系统只使用较新的版本。例如,在通信系统中,外部设备例如电话或网页接口使用这样一种协议,该协议也具有写版本1.1条目的代理。当升级这些设备时,它们可能开始使用写版本1.2条目的代理。在升级一些设备时,其他设备可能没有升级,因此系统可能继续同时使用1.1和1.2版本,直到所有的设备都被升级到使用版本1.2。最终,所有1.1版本代理都变为空闲。
在另一个实施例中,所述代理可以运行为“版本不敏感的”。当改变条目矩阵时通知所述代理。它们然后会重新读条目矩阵,并开始处理所有具有最新版本的条目。这还避免了强制重起代理。
所述代理和接口一般实现为软件中的机器可读指令,其被执行时执行本发明的处理。在一些情形下,所述机器可读代码被包括在一个制品例如磁盘、光盘和新处理器中,它们被用来升级现有的网络设备以可实现本发明的实施例。或者,所述指令可被部署在新网络设备中。能够实现本发明的处理的网络设备的一个示例示出在图5中。
网络设备60可包括持久存储库70的一部分。JavaSpacesTM可分布在若干不同设备中的若干不同存储器上,即使它可能被定义为一个空间。网络设备还可包括独立的存储器或包含空间的所述部分的同一存储器的多个分区。存储库64可包括用于所述空间的一个或多个代码基和条目矩阵的容量。与空间的分布类似,这些也可被分布到其他设备。
按照这种方式,可将可演化条目用在分布式计算基系统中,例如基于JavaTM和JiniTM的通信系统以及类似系统,而无需改变底层代码以不得不重起。它可以获得系统的更大的灵活性以及更容易的可升级性,例如Scalable InfrastructureTM系统。
这样,虽然此时已经描述了用于持久存储库中的可演化条目的方法和装置的特定实施例,但是不应将这些具体的引用看作为对本发明的范围的限制,本发明的范围如所附权利要求所定义。
权利要求
1.一种在持久存储库中提供可演化条目的方法,该方法包括从代理接收去往所述持久存储库的条目;将所述条目转换为版本化条目;以及将版本化条目插入到所述持久存储库中。
2.如权利要求1所述的方法,其中所述方法还包括从所述持久存储库读版本化条目。
3.如权利要求2所述的方法,其中所述方法还包括从版本化条目转换出一个条目。
4.如权利要求1所述的方法,其中将所述条目转换为版本化条目还包括访问条目矩阵以确定所述版本化条目的版本标识符。
5.如权利要求4所述的方法,其中所述方法还包括访问与所述版本标识符相关联的代码基。
6.如权利要求5所述的方法,其中所述方法还包括访问作为空间中的对象的所述代码基。
7.如权利要求1所述的方法,其中所述版本标识符基于发送所述条目的代理。
8.如权利要求1所述的方法,其中所述方法还包括将条目矩阵的改变通知给所述代理;以及使得所述代理在发送所述条目前读所述条目矩阵。
9.一种网络设备,包括持久存储库;处理器,用于执行代理来产生条目;将所述条目转换为版本化条目;以及将所述版本化条目插入所述持久存储库。
10.如权利要求9所述的网络设备,其中所述设备还包括用于存储至少一个代码基的存储装置。
11.如权利要求10所述的网络设备,其中所述存储装置还用于存储条目矩阵。
12.如权利要求9所述的网络设备,其中所述处理器通过访问条目矩阵来确定版本标识符,从而转换所述条目。
13.如权利要求9所述的网络设备,其中所述代理确定用于所述版本化条目的版本标识符。
14.如权利要求9所述的网络设备,其中所述处理器还从所述持久存储库读所述版本化条目,并将它转换为用于另一个代理的条目。
15.一种具有机器可读代码的制品,所述代码被执行时使得所述机器从代理接收去往所述持久存储库的条目;将所述条目转换为版本化条目;并且将版本化条目写入所述持久存储库中。
16.如权利要求15所述的制品,其中所述代码被执行时还使得所述机器从所述持久存储库读版本化条目。
17.如权利要求15所述的制品,其中所述代码被执行时还使得所述机器从版本化条目转换出一个条目。
18.如权利要求15所述的制品,其中所述被执行时使得所述机器将所述条目转换为版本化条目的代码还使得所述机器访问条目矩阵以确定版本标识符。
19.如权利要求15所述的制品,其中所述代码被执行时还使得所述机器访问与所述版本标识符相关联的代码基。
20.如权利要求15所述的制品,其中所述代码被执行时还使得所述机器将条目矩阵的改变通知给所述代理;并且使得所述代理在发送所述条目前读所述条目矩阵。
21.一种网络设备,包括用于提供持久存储库的装置;用于下述功能的装置执行代理来产生条目;将所述条目转换为版本化条目;以及将所述版本化条目插入所述持久存储库。
22.如权利要求21所述的网络设备,其中所述设备还包括用于存储至少一个代码基的装置。
23.如权利要求22所述的网络设备,其中所述用于存储的装置还存储条目矩阵。
全文摘要
描述了一种在持久存储库中提供可演化条目的方法。所述方法包括从代理接收去往所述持久存储库的条目。将所述条目转换为插入到持久存储库中的版本化条目。如果启动了读或取操作,则从持久存储库中读所述版本化条目,并将其转换为条目。
文档编号G06F9/46GK1669000SQ03816503
公开日2005年9月14日 申请日期2003年7月11日 优先权日2002年7月11日
发明者彼得·迈克尔·吉茨, 戴维·叶列梅耶·诺维斯, 戴尔·J·西维 申请人:思科技术公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1