10. 集群映射接口

从v7.1.0开始,实现了集群映射接口。集群映射通过使用分布式事件总线系统在所有集群之间进行通信来辅助。

10.1. 要求

只要未禁用事件总线组件,任何完整的Tigase发行版都将支持Cluster Map API。此功能需要JDK v8,但由于Tigase需要此功能,您应该已经安装了它。

集群映射存储在内存中并遵循 map.util.interface java标准,可用于改善集群连接,并帮助集群服务器相互跟踪。

10.2. 映射创建

必须使用以下命令创建映射:

java.util.Map<String, String> map = ClusterMapFactory.get().createMap("type",String.class,String.class,"1","2","3" )

其中”type”是映射ID。这会在本地创建映射,然后向所有集群服务器触发事件。每个集群服务器都有一个事件处理程序等待,在这种情况下,NewMapCreate 事件。 Map Key类和Map Value类用于类型转换。字符串数组是参数,例如用户会话的ID。一旦收到,分布式事件总线将创建一个本地映射。

eventBus.addHandler(MapCreatedEvent.class, new EventHandler<MapCreatedEvent>() {
    @Override
    public void onEvent(MapCreatedEvent e) {
    }
});

此处显示了映射创建的简短示例:

java.util.Map<String, String> map = ClusterMapFactory.get().createMap("Very_Important_Map_In_User_Session",JID.class,Boolean.class,"user-session-identifier-123");

这将在所有其他集群节点上触发事件 MapCreatedEvent 。字符串 “Very_Important_Map_In_User_Session” 和 “user-session-identifier-123” 在 onMapCreated()` 方法中作为参数给出。事件用户代码必须知道如何处理类型为”Very_Important_Map_In_User_Session”的地图。它可能会检索用户会话 “user-session-identifier-123”并将此映射放入此会话中。它应该用于告诉其他节点如何使用新创建的映射处理事件,并且应该将其存储在用户会话中。

10.3. 映射更改

对一个集群上的映射的更改将在eventbus中触发 AddValueRemoveValue 事件。在集群之间发送的节看起来像这样:

<ElementAdd xmlns="tigase:clustered:map">
  <uid>1-2-3</uid>
  <item>
    <key>xKEY</key>
    <value>xVALUE</value>
  </item>
  <item>
    <key>yKEY</key>
    <value>yVALUE</value>
  </item>
</ElementAdd>

处理添加项目的代码:

eventBus.addHandler(ElementAdd, tigase:clustered:map, new EventHandler() {
  @Override
  public void onEvent(String name, String xmlns, Element event) {
  });

其中元素 ‘event’是UID,名称字符串是映射键/值对的名称。

此示例从集群映射中删除一个元素。删除项目看起来相似:

<ElementRemove xmlns="tigase:clustered:map">
  <uid>1-2-3</uid>
  <item>
    <key>xKEY</key>
    <value>xVALUE</value>
  </item>
</ElementRemove>

代码也相似:

eventBus.addHandler(ElementRemove, tigase:clustered:map, new EventHandler() {
  @Override
  public void onEvent(String name, String xmlns, Element name) {
  });

10.4. 映射破坏

如果不再使用本地映射,Java垃圾收集器通常会删除它。然而,集群映射不会以这种方式被删除。如果不再使用这些映射,则必须手动销毁它们:

ClusterMapFactory.get().destroyMap(clmap);

调用这个,名为clmap的映射将在每个集群节点上被销毁。

当映射在另一个集群节点上被销毁时,事件处理程序将捕获事件:

eventBus.addHandler(MapDestroyedEvent.class, new EventHandler<MapDestroyedEvent>() {
    @Override
    public void onEvent(MapDestroyedEvent event) {
    }
});