用于管理订阅的发布/订阅系统和方法
技术领域
本发明涉及发布/订阅系统,例如运行发布/订阅消息代理(messagebroker)的数据处理系统,并且涉及用于在这种系统中管理订阅和取消订阅请求的方法。
背景技术
在“发布/订阅”通信系统中的是一类消息传递应用,其中,借助于中间代理或其它实现订阅匹配以标识特定的订阅者感兴趣的信息的系统部件,信息提供者(发布者)分离于该信息的用户(订阅者)。订阅可以指定感兴趣的主题名称,或者可以指定感兴趣的信息内容。通常,在这种基于主题的发布/订阅消息传递系统中,众多的发布者向消息代理发布关于特定主题(例如新闻、天气、运动)的消息。订阅者通过接收于代理的订阅请求在这些主题中注册它们的兴趣。举例来说,订阅者可以是这样的应用程序或系统,即其要求所有的请求接收关于主题“天气”所发布的任何的信息,同时,另一订阅者可以请求关于主题“新闻”和“运动”的信息。发布者并不需要关心它们的发布将去往何处,并且订阅者也不需要知道它们接收的消息来自何处。作为替代,代理根据代理中所注册的有效订阅管理消息的分发以确定它们到达正确的目的地。代理还确保以正确的格式分发消息,并且验证每个发布者向已订阅了包括该消息的特定主题的订阅者发布的权限。
一般来说,发布者生成它想要发布的消息并且定义该消息的主题。代理从它的输入节点检索消息并且将其传递至用于向所有已注册感兴趣的订阅者分发的发布节点。向订阅者分发消息可以通过从代理的点对点的广播或者可以通过多播。在后一种情况下,为了减少网络业务,可以将关于特定主题的消息分发至中间共享地址,该中间共享地址是为所有已在特定的主题中注册过感兴趣的订阅者提供的,从而使得它们可以针对最新发布的信息进行收听。
另一种发布/订阅通信的方法使用客户端订阅匹配部件。就是说,来自被认可的发布者的所有发布被传送至每个运行一个或多个订阅者应用的系统,并且与本地订阅者应用相关联的部件确定删除何种发布(因为本地订阅者对它们不感兴趣)以及将何种发布传递给本地订阅者应用。
为了便于更确切地标识感兴趣主题,已开发了多级的并且允许使用通配符的特定主题语法(syntax)。以这种方式仔细定义的相关主题的集合可以由单个订阅所覆盖。
在来自国际商业机器公司(IBM)的产品WebSphere BusinessIntegration Message Broker V5.0(“WebSphere”是国际商业机器公司的商标)的文献库中题为“Publish/Subscribe”(第三版,2005年2月)的文献中进一步描述了这种类型的一种公知的发布/订阅系统。
在该文献中,说明了“主题”可以是描述在发布/订阅系统中所发布的数据特性的任意字符串。主题是成功投递消息的关键。作为对在每个消息中包括指定目的地址的替代,发布者将主题指派给消息。代理将主题与已订阅该主题的客户(订阅者)的列表相匹配并且将消息投递至那些客户中的每一个。可以由系统管理员预先定义主题,然而也可以在发布中第一次被指定的时候定义主题。
每个定义的主题成为主题树中的元素或者节点。得到的树通常是具有一个或多个根主题的分层(多级)结构。通过名称来标识节点并且通过指定层次的连续级别上的节点的名称可结合节点来定义更窄的主题。级别可以通过斜杠“/”符号来分隔。
在一些IBM产品所使用的语法中,发布/订阅主题便是由以斜杆来分隔的任意字符串这样标识的。除了斜杆“/”以外,特殊的意义也应用于加号“+”和井号“#”(在美国也称作磅字符),其表示不同类型的通配符。现在将使用例子更为详细的讨论这些特殊的字符。
斜杆符号(“/”)表示在树中被解释为级别的主题名称内的分区,如上面所说明的。举例来说,“雇员/雇用/开发”是仅指示有关开发函数内雇用的雇员的信息的具有三级的主题名称。斜杆用于定义主题名称区中的层次。不存在对主题树中的级别数目的限制并且可以有任意数目的根节点(即任意数目的主题树)。
为了更好的适应性,定义井号字符(“#”)为可以与任意数目的分区相匹配的通配符。尽管一些实现仅允许在主题的开始或结束使用井号字符,然而这一规则却不可以在其它情况下应用。因此订阅“雇员/#”会收到所有具有主题名“雇员/雇用”和“雇员/雇用/开发”的消息。为此,井号通配符被称为多级通配符。由于#通配符的语义学是它可以与零个或更多的分区相匹配,“雇员/#”还可以与仅仅是“雇员”的相匹配(但这种情况下,由于没有分区分隔,斜杆是没有意义的)。通常,多级通配符用于与未知深度的子树相匹配。通过在“雇员”前使用“#/”,即“#/雇员”,其它诸如“开发/雇员”的恰好含有底级关于“雇员”的多级主题串将会匹配。
第二种类型的通配符是加号“+”。由于它仅会与单个分区相匹配,因此它被称作单级通配符。举例来说,“雇员/+”会与“雇员/雇用”相匹配而不会与“雇员/雇用/开发”相匹配。由于主题中必须存在第二级名称,因此它也不会与单独的“雇员”相匹配。
在上述语义学中,可以仅通过使用一个或多个任一类型的通配符来定义主题的集合。在没有通配符的情况下,不同的主题是特定的并且是不重叠的,从而使得,使用上面的例子,主题“雇员”不包括主题“雇员/雇用”并且仅含有具有关于“雇员”的单个顶级的项目。类似地,第二级主题“雇员/雇用”区别于第三级主题“雇员/雇用/开发”。主题不重叠并且因此不互为子集或超集。
在主题定义中使用通配符限于订阅者。发布者只可以发布关于离散主题的信息(“发布”),该离散主题必须在还含有发布本身的发布命令中向代理标识。相反,订阅者可以使用借助于通配符而定义的主题集向代理发送订阅请求。如此后所用的,术语“主题集”将指的是离散主题和其它主题集的任何混合的超集。
订阅者可用的另一可选的部件是筛选器。筛选器是也可以包含通配符的表达式,其应用于发布消息的内容(相对于主题定义)以确定该内容是否与订阅相匹配。当利用代理注册订阅的时候,除了指定主题和目的地以外,还可以指定筛选器以根据其内容进一步细化发布的选择。通过在主题域中单独指定#(等效于“所有主题”),甚至有可能仅使用筛选器来选择发布。然而,由于所有消息均到达代理,这也许会导致过量的网络业务。
发布/订阅的另一方面是订阅者必须自行改变它们的订阅并且因此提供了注销或“取消订阅”请求功能。通常,仅在取消订阅主题与列表中的一个主题一样的时候允许从订阅者的订阅列表中移除主题。这样使列表保持为完全肯定的感兴趣主题的列表,其可以易于与随后申请的发布主题进行匹配测试。如果取消订阅请求与针对该客户所列出的主题不一样,则忽略它。订阅列表可能变得相当长并且查询功能(即使提供)需要涉及大量的运算符。出于这些原因,管理列表以确保只订阅了当前感兴趣的信息则可能成为问题。
在感兴趣主题集是具有许多可能的子主题(例如可以使用通配符、特别是多级通配符来定义)的高级别的感兴趣主题集的情形下,这种情况尤其是问题。这是因为试图取消订阅小于完整主题集的任何主题都会失败。由于其可能需要订阅者重新订阅大量非标准定义的更低级别的主题,这种适应性的缺乏是对有效地并且有目的地使用发布/订阅技术的阻碍。尽管筛选器的使用允许订阅者进一步地限制接收的消息,然而这只有通过将结构化查询应用于实际的消息内容(涉及额外的计算)才能实现。在附加的查询过程中再次需要涉及大量的运算符。此外,正如已经指出的,通配符的广泛使用以及对筛选器的依赖仍然可能导致过量的网络业务。
发布/订阅通信已得到很好的证实适合面向消息的中间件产品以及在其中订阅匹配器部件确定应当将何种发布消息传递给特定的订阅者的消息传递环境。如上所述,对于每个订阅者,订阅匹配器可以是本地的,或者可以是位于发布者与订阅者之间的中间节点或网络中的节点集合的消息代理或代理网络。发布/订阅解决方案还为Web服务(Web Service)通知实现了增加的接收。
本发明的发明人已经认识到,在订阅/取消订阅阶段,能够有效地排除一部分概括定义的主题集而不移除概括定义本身是值得期望的。除了概括主题集定义这个特别的问题以外,任意取消订阅和真正订阅附加主题应当更有效的工作,这也是普遍值得期望的。
发明内容
本发明的第一方面提供了一种在发布/订阅系统中用于管理订阅主题和主题集的方法,在所述发布/订阅系统中,订阅指示订阅者感兴趣的信息主题并且用于标识应当传递给订阅者的发布信息。所述方法包括:响应于标识第一主题或主题集的订阅者的订阅请求,将第一主题或主题集的标识符存储为肯定订阅;响应于针对订阅者的取消订阅请求,所述取消订阅请求标识构成肯定订阅的已标识主题或主题集的部分重叠的第二主题或主题集,将第二主题或主题集的标识符存储为否定订阅;以及将接收的发布的主题与存储的肯定和否定订阅二者的主题和主题集的标识符进行比较,从而确定应当将何种发布传递给订阅者。
在一个实施例中,比较步骤确定存储的肯定和否定订阅的先后顺序,从而使得较近存储的标识符优先于次近存储的标识符。第二主题集可以是完全包含于第一主题集的子集、或者超集、或者可以是部分重叠的主题集。在一个实施例中,如果第二主题或主题集是第一主题或主题集的超集、子集和部分重叠的集合中的任何一个,则将第二主题或主题集的标识符存储为否定订阅;并且如果第二主题或主题集对于第一主题或主题集完全匹配,则删除第一和第二主题或主题集的标识符。
在一个实施例中,比较步骤以存储主题和主题集定义的顺序的逆序将发布与存储的主题和主题集定义进行比较。对于这样的发布信息,即最后存储的主题或主题集定义对应于取消订阅请求,将其标识为不传递给订阅者的信息,而对于这样的发布信息,即最后存储的主题或主题集定义对应于订阅请求,则将其标识为传递给订阅者的信息。
本发明的一种实现提供了一种在发布/订阅系统中代理发布信息和订阅者请求的方法,所述系统包括:
多个订阅者,每个订阅者能够请求订阅一个或多个它希望接收关于其信息的主题和主题集,并且能够取消订阅它不希望接收关于其信息的主题和主题集;
多个发布者,用于提供关于主题范围的信息;以及
代理,用于将来自发布者的信息依照与各个订阅者关联的主题和主题集的订阅列表分发给订阅者。所述方法包括以下步骤:
从每个订阅者的订阅和取消订阅请求生成包括请求的主题和主题集定义的订阅列表并且存储该列表;
将来自每个发布者的信息项目与每个订阅者的订阅列表中的主题和主题集定义进行匹配;以及
将来自每个发布者的匹配的信息项目发布给适当的订阅者。如果订阅列表中的请求主题和主题集定义对应于订阅请求,则将它们存储为带肯定标记的主题项,并且如果它们对应于取消订阅请求,则将它们存储为带否定标记的项,并且匹配步骤从最近添加的主题项开始,以逆序将来自每个发布者的信息项目与列表中的主题项进行比较。不发布与否定主题项匹配的项目并且仅发布与肯定主题项匹配的项目。
本发明还提供了一种包括指令的计算机程序,当形成发布/订阅系统的一部分的计算机执行所述计算机程序的时候,该程序使得所述计算机实现如上所述的管理订阅或代理发布信息和订阅者请求的方法。
从另一方面,本发明还提供了一种在发布/订阅系统中用于代理发布的信息和订阅者请求的消息代理,该系统包括多个订阅者,所述多个订阅者每个都能够请求订阅一个或多个它希望接收关于其信息的主题和主题集,并且能够取消订阅它不希望接收关于其信息的主题和主题集,以及多个用于提供关于主题范围的信息的发布者。所述消息代理包括:
(a)用于执行订阅管理步骤的装置,所述步骤包括:(i)响应于标识第一主题或主题集的订阅者的订阅请求,将第一主题或主题集的标识符存储为肯定订阅;以及(ii)响应于针对订阅者的取消订阅请求,所述取消订阅请求标识构成肯定订阅的已标识主题或主题集的部分重叠的第二主题或主题集,将第二主题或主题集的标识符存储为否定订阅;以及
(b)用于比较的装置,所述用于比较的装置将接收的发布的主题与存储的肯定和否定订阅二者的主题和主题集的标识符进行比较,从而确定应当将何种发布传递给订阅者;以及
(c)用于传递的装置,响应于用于比较的装置确定应当将发布传递给订阅者,所述用于传递的装置将发布传递给订阅者。
一种代理实现包括:用于从每个订阅者的订阅和取消订阅请求生成包括请求的主题和主题集定义的订阅列表并且存储该列表的装置;用于将来自每个发布者的信息项目与每个订阅者的订阅列表中的主题和主题集定义进行匹配的装置;以及用于将来自每个发布者的匹配的信息项目依照与各个订阅者关联的主题和主题集的订阅列表分发给适当的订阅者的装置。如果订阅列表中的请求主题和主题集定义对应于订阅请求,则可以将它们存储为带肯定标记的主题项,并且如果它们对应于取消订阅请求,则可以将它们存储为带否定标记的项。从最近添加的主题项开始,用于匹配的装置以逆序将来自每个发布者的信息项目与所述列表中的主题项进行比较,由此不发布与否定主题项匹配的项目并且仅发布与肯定主题项匹配的项目。
在订阅列表中允许订阅和取消订阅主题或主题集定义二者的共存(例如肯定和否定项),连同以逆序评估用于匹配的列表,使得比订阅主题集更窄范围的取消订阅主题和主题集能够被接纳而不会有问题。这在一个或多个订阅主题集是使用多级通配符的高级别主题的情况下有特别的价值,而在使用单级通配符的时候也是有益的。没有必要重建更为冗长的订阅列表。基于本发明的解决方案可以提供较之公知的基于主题的发布/订阅解决方案的效率改进。
应当认识到,什么是肯定的以及什么是否定的是常规的问题,并且即使颠倒了代数符号或者除了“+”或“-”标记之外使用一些微分算子来区分列表中的订阅和取消订阅主题项定义,本发明仍会起作用。
优选地,生成步骤包括这样的步骤,即响应于来自订阅者的取消订阅主题或主题集的请求,确定当前订阅列表中的任何主题项是否包含于最新的取消订阅主题集中,并且如果这样,则将该主题项从所述列表中移除。生成步骤优选地还包括另一步骤,即如果任何其它的肯定主题项重叠于取消订阅主题或主题集,则将对应于取消订阅主题或主题集的否定主题项添加到所述列表的末尾。生成步骤优选地还包括另一步骤,即从所述列表的起始移除任何的否定主题项。
这样避免了列表中的冗余并且为匹配步骤对它进行了优化。
借助于生成步骤,可以将该技术有利地扩展到新的订阅,所述生成步骤包括这样的步骤,即响应于来自订阅者的订阅主题或主题集的请求,确定当前订阅列表中的任何主题项是否包含于最新的订阅主题集中,并且如果这样,则将该主题项从所述列表中移除;以及另一步骤,即如果对应于最新的订阅主题或主题集的肯定主题项不包含于所述列表中的任何其它的肯定主题项中或者如果对应于最新的订阅主题或主题集的肯定主题项重叠于所述列表中的任何否定主题项,则将它添加到所述列表末端。还可以跟随附加的步骤,即为了优化而将当前位于订阅列表起始的任何否定主题项移除。
本发明在使用多级主题定义以及通过使用选定级别中的通配符定义主题集的情况下尤其适用。多级和单级通配符都可以使用。尽管在优选的语法中,通配符对于定义主题集是必要的,然而在其它语法中,更高级别的主题名称可以包括以相同的更高级别的名称开始的更低级别的主题。
确定一个主题集被另一个所包含相对简单并且只需要一级一级地检验级别名称是否与更宽的集合的通配符级别一样或落入了更宽的集合的通配符级别。
这样优选地实现了重叠的确定,即通过从关于其它集合的第一主题集构造例子主题,并且然后将所述例子与其它集合进行比较以确定它是否是成员并且因此重叠于第一集合。
应当指出,发布者和订阅者还可以与代理网络进行交互,所述代理网络中的每一个向该网络内的其它代理传播订阅并且转寄发布。因而,当文中使用术语“代理”的时候,应当将它视为包括单个代理或者作为提供代理服务的网络而一起工作的多个代理。
还应当指出,发布/订阅不仅在纯粹的消息传递系统中使用,而且举例来说,还可以在事务处理系统的事件处理部件中使用。然而,在目前的情况下最感兴趣的是系统的消息传递类型,在该系统中订阅者是由人类用户所操作的客户计算机或终端。
附图说明
下面根据如附图中所描述的优选实施例,仅通过例子对本发明进行更为详细地描述,其中:
图1是包括诸如可以实现本发明的代理的常规的发布/订阅系统的概略图;
图2示出了出自本发明的方法的实现中所使用的函数topiclncludes(x,y)的结果的例子;
图3示出了出自本发明的方法的实现中所使用的函数topicOverlaps(x,y)的结果的例子;
图4是示出了以根据本发明的代理方法生成和管理订阅列表的流程图;
图5至图7示出了操作图4的方法的例子;以及
图8是示出了根据图4的方法所生成的订阅列表使用图1的系统中的主题处理发布的流程图。
具体实施方式
在图1中示出了包括消息代理10的发布/订阅系统的框图。该说明对常规消息代理和根据本发明的消息代理来说都是通用的并且可适用的。下面的讨论中将假定为后者。
还描述了多个发布者12,所述发布者是诸如基于计算机的商用数据库的数据源。这些向代理10提供通常称为“发布”的信息项目。发布不仅包括信息内容而且包括在代理可识别的语法中的发布主题的名称。发布者随机地向代理有效地提供发布。
如以上所讨论的,通过使用分隔符可以细化主题定义并且使其更为明确,从而产生可以视为主题树的节点的多级主题。
还连接到代理10的是多个订阅者14,所述订阅者是诸如终端或因特网连接的个人计算机的客户计算机,通过所述客户计算机,人类操作者提交将由关于代理所选择的主题的发布来满足的请求。尽管有一个重要的区别,订阅者还是使用与发布者相同的语法来定义感兴趣的主题。区别在于订阅者可以在它们的订阅请求中包含通配符。在本例中,假定如上所述的多级井号通配符“#”和单级通配符“+”可用。这些通配符的使用使得订阅者能够请求关于主题集的而不仅仅是关于离散主题的信息。当然,为了同时在多个离散主题或其它主题集中注册感兴趣,订阅者可以进行超过一个的订阅请求。
订阅者14经由逻辑连接15向代理10提供它们感兴趣的主题或主题集名称,并且代理中的列表生成软件16将来自每个订阅者的请求汇编成存储在该代理中的订阅列表17。匹配软件18将来自发布者12的每个新的发布消息与为每个订阅者存储的订阅列表17进行比较,并且如果它们匹配,则使分发软件19经由逻辑连接20向那些已请求该发布的主题的订阅者分发匹配的发布。
对于与订阅列表中的订阅请求匹配的发布,它必须与离散的订阅主题一样或者包含于订阅列表中如举例来说通过使用通配符定义的主题集中。下面将给出这种例子。
应当认识到,图1示出了简化的系统,为了易于说明,假定与订阅者以点对点通信的单代理,但该系统同样可以是网络中代理的集结,例如通过多播分发发布而不是简单的广播。
如以上已经说明的,伴随常规系统的一个问题一直是用于订阅者取消订阅(注销)现有订阅的功能的相对有限。只有取消订阅请求确切地指定主题或命名的主题集,才可以从订阅列表移除它们。否则,忽略该请求。到目前为止还不可能部分地取消订阅订阅列表中的离散订阅。
现在将描述一种允许在图1的系统中部分取消订阅的方法。然而,为了这样做,首先有必要描述两个函数:在本发明的方法中所使用的topiclncludes(x,y)和topicOverlaps(x,y)。
根据y是否等于x或是x的子集,函数topiclncludes(x,y)简单产生真或假的输出。图2示出了一些主要是主题集的例子,主题或主题集名称位于用维恩图圆或椭圆表示的它们的中心。将y主题和主题集以阴影示出从而将它们与x主题集区分开来。尽管两个离散的主题可以相等,然而在以上所描述的语法中,对于“x”来说,如果它包含通配符,则它只可能超集。因此,在例子(i)到(v)中,x主题是集合“a/#”,即所有以“a”为第一级的主题。该集合显然包含例子(i)中的子集“a/+”并且包含(实际上等于)例子(ii)中的它本身“a/#”,因此所述二者均为“真”。然而集合“a/#”不包含例子(iii)中没有交集的离散主题“b”或者例子(iv)中重叠的但不包含的集合“#/a”。它也不包含所有主题的集合“#”,所述集合“#”是超集而不是子集。
函数topicOverlaps(x,y)确定x和y的交集是否非空。图3中示出了一些例子,其中,主题和集合名称再次位于它们各自的维恩图圆或椭圆的中心。在所示的例子中,假定x主题始终是主题集“a/+”。在例子(i)中,可以看出这与集合“+/a”重叠,重叠的主题“a/a”由阴影区域表示,因此函数的输出是“真”。在例子(ii)中,离散主题“a/b”完全包含于集合“a/+”中,因此输出再次为“真”。在例子(iii)中,集合“a/+”本身完全包含于超集“a/#”中,因此这个输出也是真。只有在集合“a/+”和“b/#”没有交集的例子(iv)中输出为假。可以注意到,相对于包含而言的部分重叠只有在x和y都是主题集,并且都不是离散主题的时候才会发生。
为了评估函数topicOverlaps(x,y),对于任意两个特定的主题集,在两个主题模式之外构造有代表性的例子。如果该例子与两个主题集均匹配,那么它们重叠。应用函数topiclncludes(x,y)以确定匹配。用于构造所述例子的算法如下:
1)针对参数主题1和主题2,为主题2构造一般的例子;
2)针对主题2中的每个级别:
如果当前级别是“+”:
如果我们在主题1中有相应的级别并且它不是通配符(+或#)则将主题1级别添加到所述例子,否则使用任意匹配串(“xxx”);
否则如果当前级别不是“#”:
则将当前主题2级别添加到所述例子;
如果当前主题列表中的第一级别是“+”或者与当前主题2级别相同,则将主题列表中的第一级别移除;
3)使用既定的匹配程序topiclncludes(x,y)将生成的例子与主题1进行比较,从而指出主题1与主题2是否重叠:
如果所述例子与主题1匹配,则返回输出“真”;否则返回输出“假”。
现在转向根据本发明的方法的实现,图4和图8的流程图中对其进行了描述,而图5、图6和图7中示出了该结果的例子。尽管本发明的焦点和主要好处在于部分取消订阅功能,然而本发明在订阅处理上也提供了一些改进。在两种情况下,本发明均减少了订阅列表中的冗余,从而改进了处理两种请求类型的效率。出于这个原因,图4中对订阅和取消订阅操作均进行了描述。
处于本发明核心的是一种新型的订阅列表的思想,所述订阅列表可以含有对应于主题订阅的带肯定标记的项,以及对应于取消订阅的否定项。随着描述的进行,这样的使用及其意义会变得更为明显,但在理解图4的时候只需要承认两种类型均可以存在于订阅列表中。
在图4的方法中,起始点是生成软件16(图1)对来自客户的请求的接收。步骤40中进行关于这是订阅还是取消订阅主题或主题集的请求的确定。如果该请求是订阅,则在步骤41中对它进行确定,即如果该主题是集合,那么它是否包含当前订阅中任何现有的主题项(注意:主题项既可以是肯定的也可以是否定的)。如果是,则在步骤42中将现有的主题项从列表中移除。如果该主题不是集合或者是不包含任何现有主题项的集合,则接下来在步骤43中确定将要被订阅(被添加)的主题或主题集是否其自身包含于任何的肯定主题项中。如果不是,在步骤44中将新的主题或集合作为肯定项添加到订阅列表的末尾。如果在步骤43中确定主题或主题集包含于任何的肯定主题项中,但在步骤45中又确定其重叠于任何的否定主题项(借助于函数topicOverlaps(x,y)),那么还是将它作为肯定项添加到列表末尾。以这种方式,即当添加新订阅的时候,移除订阅列表中的冗余,导致了更有效的处理。
总的来说,将新主题或集合添加到当前订阅的订阅动作的结果是:首先,移除当前订阅中包含于将要添加的主题集中的任何主题项,并且其次,如果将要添加的主题集没有包含于任何的肯定主题项中,或者,如果它包含于任何的肯定主题项中却重叠于任何的否定主题项,则将其添加到主题列表的末尾。
现在转向图4的右手边,如果客户请求是取消订阅主题或主题集,如步骤40中所确定的,在步骤46中首先确定该主题或主题集是否包含当前订阅列表中任何现有的项(肯定的或否定的)。如果答案是“是”,那么在步骤47中移除包含的主题项。步骤46和步骤47在作用上与步骤41和步骤42相同并且可以在实际的程序代码中对其进行结合,但为了易于说明这里将其分别示出。
然而,如果检验46结果是否定的,即取消订阅是针对离散主题或针对不包含任何现有主题项的主题集,则在步骤48中进行关于将要移除的主题,如果是集合的话,是否重叠于订阅列表中剩余的任何肯定主题项的确定。如果不是,则程序结束而不会有进一步的动作,但如果是的话,则在步骤49中将新的取消订阅主题集作为否定项添加到列表末尾。如果将要移除的主题是离散主题,则它不能重叠于任何剩余的肯定主题项并且在步骤48中的确定再次是否定的。这不会产生动作,由于在第一的位置添加有关非任何肯定订阅的主题名的离散主题取消订阅的否定项是没用的,因此这是正确的结果。
总的来说,将主题或主题集从当前订阅移除的取消订阅动作的结果是:首先,移除包含于将要移除的主题集中的每一个主题项,并且其次,如果任何剩余的肯定主题项重叠于将要移除的主题或主题集,则将新的主题或主题集添加到主题列表的末尾。
图5、图6和图7示出了由生成软件16根据图4的方法所实现的各种订阅和取消订阅操作的累积结果的三个例子。中间列出了订阅和取消订阅动作,而左边以维恩图示出了主题和主题集并且在右边示出了存储表达式的结果(订阅列表)。
在图5中,在第(i)行中,进行了对主题集a/#的初始订阅。在第(ii)行中,订阅了集合#/a并将其添加到列表。在第(iii)行中进行了对主题a/b的订阅,但由于这包含于a/#中,因此将其舍弃并且不添加到列表。最后,在第(iv)行中,进行了对#(所有主题)的订阅。这导致所有先前列出的项都被舍弃。因此,任何发布都会立即被与所有的主题通配符进行匹配并且被分发给订阅者。
在图6中,在第(i)行中初始订阅的是集合a/+,其成为列表中的第一主题。在第(ii)行中接下来的动作是取消订阅是a/+的子集的主题a/b。将“-a/b”项添加到列表。在第(iii)行中取消订阅主题c。由于它不包含于或者重叠于当前订阅,现有订阅无论如何也不会与主题“c”的发布匹配,因此将其舍弃。
最后,在第(iv)行,取消订阅集合a/#。由于这包含所有当前列出的项,因此订阅者有效地取消订阅了所有项目并且“a/+”项和“-a/b”项被从列表移除而使其为空。在这种情况下,根本没有发布会被分发给该订阅列表的订阅者。
在图7的最后的例子中,列出的第一订阅还是集合“a/#”,如第(i)行中所示。在第(ii)行中,取消订阅主题集“a/b/#”。由于这完全包含于“a/#”中,因此将其作为否定项添加到列表。在第(iii)行中,进行了对主题“a/c”的订阅,但由于它完全处于已经订阅的集合“a/#”之中并且不重叠于取消订阅集合“a/b/#”,因此可以将其舍弃。这是因为,如果发布主题“a/c”,其会与列出的主题集“a/#”匹配并且无论如何会被分发给订阅者。最后,在第(iv)行中,进行了对集合“a/+/c”的订阅。尽管这完全处于订阅集合“a/#”之中,然而由于它重叠于取消订阅集合“a/b/#”而不可以被忽略。因此将其作为肯定项添加到列表的末尾,正如现在将会说明的,其越过了取消订阅。
图8描述了由匹配软件18在代理10中实现的方法。起始点是代理在步骤50中对来自发布者之一的发布的接收,所述发布含有根据既定的语法的主题的定义以及实际的信息。发布者具有向每一个订阅者(客户)发布的权限,在步骤51中为所述每一个订阅者(客户)提取相关的订阅列表,并且取得订阅列表中最后的(最近录入的)主题项。
在步骤52中,确定接收的主题是否包含于从列表取得的最后的主题项中。如果是,则在步骤53中确定取得的主题项是否是肯定的,即它代表请求订阅。如果是,则存在匹配并且在步骤54中向订阅者发布主题发布而不必再费周折。现在可以结束匹配程序。如果取得的主题项是否定的,如步骤53中所确定的,则已经取消订阅了发布的主题并且结束程序而不向订阅者发布。
在步骤52中,如果确定接收的主题没有包含于订阅列表中的最后的主题项中,则有必要继续与列表中的其它项(如果有的话)的比较。如果没有其它项,如步骤55中所确定的,则程序简单结束而不发生任何发布。如果列表中存在更多的项,则在步骤56中取得倒数第二项并且在步骤57中将其与接收的主题进行比较。如果接收的主题没有包含于最近取得的项中,那么程序返回到步骤55,其结果是提取项并且以逆序对其进行比较。然而,如果最近的项包含接收的主题,则实现步骤53和步骤54以确定接收的主题是否与肯定项匹配并且应当因此而被发布或不发布。
可以看到,通过以逆序检查与肯定和否定主题项二者的匹配,与否定项的匹配有效地防止了发布并且越过或者绕过了与较早添加到订阅列表的更宽的肯定项可能的匹配的结果。列表中最近添加的项具有最高的优先级并且最先起作用以确定是发布还是不发布接收的主题。图7中可以看到这样的例子,其中最后的订阅“+a/+/c”优先于取消订阅“-a/b/#”,所述取消订阅“-a/b/#”本身优先于订阅“a/#”(隐含正号)。
因此,图1、图4和图8的方法和系统允许从先前的订阅主题集部分取消订阅,并且当新的订阅和取消订阅二者均被请求的时候进一步优化订阅列表。