转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827

关于连接管理分为上下两部分

连接管理

在大并发环境下,连接资源 需要随着用户并发访问量的增加而增加,所以可伸缩的连接资源就是支持大访问量的关键技术。openfire系统通过增加独立部署的连接管理器程序提高并发的能力,连接管理的前端是一台负载均衡设备,它负责把用户访问分配到指定连接管理器,多台连接管理器在访问服务器。使用连接管理器后,服务器的连接池是提供给连接管理器连 接,而一台连接管理器也提供指定数量的连接给客户端访问,这样通过添加连接管理器,以适应用户访问量。

l 它是啥?

你部署的每个openfire连接管理单元,依靠处理一部分客户端连接,来提高openfire服  务器的容量。它适用于大规模的openfire安装(几千的在线用户)。

l 每个连接管理能够处理多少用户呢?

每个连接管理应该只是能够处理5000的在线用户。对于无绑定的实验性支持正在被提  高,用以更多的提高每个连接管理单元所能处理的连接数量。

l 连接管理可以被用在其他服务器上吗?

当然(理论上)。连接管理协议正在通过开放的XEP处理来提高。我们希望和其他服务 器供应商一起协作,以便全部的XMPPP/Jabber协会支持这个协 议。我们同样期望会       有其他的兼容openfire的连接管理实现。例如,一个用本地代码编写的连接管理可以在       一个特殊的平台上达到一个非常高的容量。

l openfire连接管理用的许可和openfire本身一样吗?

当然,这个模块是是在开源GPL下的dual-licensed,或者是Jive Software同意授权的一 个商业软件许可。

连接配置

Of配置Connection Manager——So easy!

第一步:服务器设置

在服务器设置/连接管理中,将连接管理设置为启动。并设置端口号和密码。如图

第二步:配置manager.xml文件

配置<domain>xxxx</domain>节点,这里面的内容为of服务器域名

配置<password></password>节点,这里密码填写在控制台的密码。

第三步:启动连接管理器

找到connection_manager\bin目录下的cmanager.bat(windows环境)文件点击启动。          如图:

启动完后,在of控制台将出现如图信息:

第四步:测试连接

使用Spark登陆连接管理器,如果配置成功,控制台“客户端回会话”值将变为“1”

Connection

Connection是一个接口代表在服务器上的一个连接。该接口的主要方法:

方法名

说明

validate

验证连接,通常这样做是通过发送一个数据包之间的空格字符。

init

初始化会话连接,允许连接类与会话相关信息配置

deliver

发送数据包

deliverRawText

发送文本字节

类图:

Connection接口下面有三个实现类:NIOConnection、SocketConnection、VirtualConnection。其中VirtualConnection是个抽象接口,而它又派生两个子类:

ClientSessionConnection、HttpVirtualConnection。

NIOConnection

该类中最为常用的方法是deliver()。

代码清代:

  1. public void deliver(Packet packet) throws UnauthorizedException {
  2. if (isClosed()) {
  3. backupDeliverer.deliver(packet);
  4. }
  5. else {
  6. ByteBuffer buffer = ByteBuffer.allocate(4096);
  7. buffer.setAutoExpand(true);
  8. boolean errorDelivering = false;
  9. try {
  10. XMLWriter xmlSerializer =
  11. new XMLWriter(new ByteBufferWriter(buffer, encoder.get()), new
  12. OutputFormat());
  13. xmlSerializer.write(packet.getElement());
  14. xmlSerializer.flush();
  15. if (flashClient) {
  16. buffer.put((byte) '\0');
  17. }
  18. buffer.flip();
  19. ioSession.write(buffer);
  20. }
  21. catch (Exception e) {
  22. Log.debug("NIOConnection: Error delivering packet" + "\n" + this.toString(), e);
  23. errorDelivering = true;
  24. }
  25. 。。。。。。。
  26. }
  27. }

该方法中用了Mina框架的字节缓冲类ByteBuffer。ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer。

1.创建ByteBuffer

ByteBufferbuffer = ByteBuffer.allocate(4096);

以上方法将创建一个容量为4096字节的ByteBuffer,如果发现创建的缓冲区容量太小,

唯一的选择就是重新创建一个大小合适的缓冲区。

2.设置自动扩张,of在这里设置了true

buffer.setAutoExpand(true);

3.回绕缓冲区
   buffer.flip();
   这个方法用来将缓冲区准备为数据传出状态,执行以上方法后,输出通道会从数据的开头

而不是末尾开始。回绕保持缓冲区中的数据不变,只是准备写入而不是读取。

ConnectionManager

Openfire Connection Manager是Openfire服务器的扩展,它可以透明的处理大规模并发XMPP客户端对Openfire服务器的联接。根据Connection Manager主页介绍,每个Connection Manager可以处理至少五千个并发用户。Openfire服务器可以连接一个或多个Connection Manager。每个Connection Manager可以处理一个或多个支持XMPP的客户端。为Openfire配置Connection Manager后,支持XMPP的客户端仅需要连接Connection Manager,由Connection Manager负责管理对来自XMPP客户端对Openfire服务器的连接。

连接管理的端口说明:

5222

默认端口为客户XMPP。这个端口可以用于担保和无担保的连接。客户将首先使用一个未加密的连接,连接可能安全使用StartTLS。

5223

Jabbe默认SSL通行遗留的端口。这个老方法,很快被弃用,使用加密的连接就被创建。

5275

默认的XMPP端口外部组件。

5269

默认端口为服务端对服务端的 XMPP通信。

5262

默认XMPP连接多路传输端口

管理流程

1. 打开 Openfire Admin Console

2. 点击 Server 选项卡下面的 Server Settings 页面

3. 点击左侧的 Connection Managers 页面

4. 选择 Enable 单选按钮以打开 Connection Manager 监听服务

5. 设置 password 。例如, 123 。

通过以上配置,完成了开启 Openfire 监听Connection Manager 服务。下面是对连接管理的源码分析。

通过控制台页面connection-managers-settings.jsp,会调用如下两个方法来启动连接管理:

步骤一:connectionManager.enableConnectionManagerListener(true);

这是一个启动服务端对服务端通信的端口侦听器:

1.设置xmpp socket有效值true.

JiveGlobals.setProperty("xmpp.multiplex.socket.active",                                          "true");

2.创建连接管理的监听程序createConnectionManagerListener()

  1. private void createConnectionManagerListener() {
  2. // Start多路复用器soket
  3. if (isConnectionManagerListenerEnabled()) {
  4. // Create SocketAcceptor with correct number of processors
  5. multiplexerSocketAcceptor = buildSocketAcceptor();
  6. // Customize Executor that will be used by processors to process incoming stanzas
  7. ExecutorThreadModel threadModel = ExecutorThreadModel.getInstance("connectionManager");
  8. int eventThreads = JiveGlobals.getIntProperty("xmpp.multiplex.processing.threads", 16);
  9. ThreadPoolExecutor eventExecutor = (ThreadPoolExecutor) threadModel.getExecutor();//固定大小线程池
  10. eventExecutor.setCorePoolSize(eventThreads + 1);
  11. eventExecutor.setMaximumPoolSize(eventThreads + 1);
  12. eventExecutor.setKeepAliveTime(60, TimeUnit.SECONDS);
  13. multiplexerSocketAcceptor.getDefaultConfig().setThreadModel(threadModel);
  14. // Add the XMPP codec filter
  15. multiplexerSocketAcceptor.getFilterChain().addFirst("xmpp", new ProtocolCodecFilter(new XMPPCodecFactory()));
  16. }

3.启动连接管理的监听程序    

步骤二:connectionManager.setConnectionManagerListenerPort(port);

设置启动监听端口

 

ConnectionManagerImpl

ConnectionManager声明了五种连接:client、clientssl、external component、other server、connectionmanager,它们有各自的端口并且可禁用。ConnectionManagerImpl创建多个SocketAcceptor监听各个端口,并绑定不 同的ConnectionHandlerOpenfire连接管理配置服务端配置步骤。

创建监听的方法:

  1. private synchronized void createListeners() {
  2. if (isSocketStarted || sessionManager == null || deliverer == null || router == null || serverName == null)
  3. {
  4. return;
  5. }
  6. //创建s2s通信端口监听
  7. createServerListener(localIPAddress);
  8. // 创建连接管理监听
  9. createConnectionManagerListener();
  10. // 创建外部组件监听
  11. createComponentListener();
  12. // 创建客户端监听
  13. createClientListeners();
  14. // 创建SSL监听
  15. createClientSSLListeners();
  16. }

启动监听的方法:

    1. private synchronized void startListeners() {
    2. if (isSocketStarted || sessionManager == null || deliverer == null || router == null || serverName == null) {
    3. return;
    4. }
    5. // 检查插件是否被加载
    6. PluginManager pluginManager = XMPPServer.getInstance().getPluginManager();
    7. if (!pluginManager.isExecuted()) {
    8. pluginManager.addPluginManagerListener(new PluginManagerListener() {
    9. public void pluginsMonitored() {
    10. // 停止插件监听事件
    11. XMPPServer.getInstance().getPluginManager().removePluginManagerListener(this);
    12. // 启动监听
    13. startListeners();
    14. }
    15. });
    16. return;
    17. }
    18. isSocketStarted = true;
    19. // Setup port info
    20. try {
    21. localIPAddress = InetAddress.getLocalHost().getHostAddress();
    22. }
    23. catch (UnknownHostException e) {
    24. if (localIPAddress == null) {
    25. localIPAddress = "Unknown";
    26. }
    27. }
    28. // 启动s2s端口监听
    29. startServerListener();
    30. // 启动连接管理端口监听
    31. startConnectionManagerListener(localIPAddress);
    32. // 启动外部组件监听
    33. startComponentListener();
    34. // 启动客户端监听
    35. startClientListeners(localIPAddress);
    36. // 启动SSL监听
    37. startClientSSLListeners(localIPAddress);
    38. // 启动http监听
    39. startHTTPBindListeners();
    40. }

(转)OpenFire源码学习之十:连接管理(上)的更多相关文章

  1. (转)OpenFire源码学习之十八:IOS离线推送

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...

  2. (转)OpenFire源码学习之十二:HttpBind&Script Syntax

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43417343 HttpSessionManager 该类管理所有通过httpbing连接 ...

  3. (转)OpenFire源码学习之十四:插件管理

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43418433 Plugin管理 Openfire把插件模块加入到容器分为以下步骤: l  ...

  4. (转)OpenFire源码学习之十五:插件开发

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43418493 Plugin接口规范 插件是openfire功能的增强表现,它的主要任务: ...

  5. 【Tomcat源码学习】-4.连接管理

    前面几节主要针对于Tomcat容器以及内容加载进行了讲解,本节主要针对于连接器-Connector进行细化,作为连接器主要的目的是监听外围网络访问请求,而连接器在启动相关监听进程后,是通过NIO方式进 ...

  6. Spring5.0源码学习系列之事务管理概述

    Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...

  7. (转)OpenFire源码学习之二十七:Smack源码解析

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43484199 Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即 ...

  8. (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...

  9. (转)OpenFire源码学习之六:用户注册

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413509 用户注册 注册流程: 1.客户端进行握手给服务端发送连接消息: <s ...

随机推荐

  1. 【Flutter学习】基本组件之TabBar顶部导航

    一,概述 TabBar,是材料设计(Material design)中很常用的一种横向标签页.在Android原生开发中,我们常用ViewPage或者一些常用的标签页开源库,来实现并行界面的横向滑动展 ...

  2. String、StringBuuffer、StringBuilder三者的区别

    string String 字符串常量(final修饰,不可被继承,线程不安全),String是常量,当创建之后即不能更改,可以给多个引用共享,在做大量字符串拼接的时候效率低.(可以通过StringB ...

  3. 2019ccpc秦皇岛/Gym102361 F Forest Program 仙人掌上dfs

    题意: 某地沙漠化严重,沙漠里长了很多仙人掌,现在要让你删掉仙人掌的一些边让它的所有连通分量都是树,就完成了沙漠绿化(什么鬼逻辑?)让你计算删边的方案数. 仙人掌是一种特殊的图,它的每一条边只属于1或 ...

  4. Redis入门很简单之三【常见参数配置】

    Redis入门很简单之三[常见参数配置] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存中间件memcached  Redis的一下常见设置都是通过对redis.conf ...

  5. python selenium自动化测试报告

    先记录一下,后续继续更新. 首先:HTMLTestRunner的下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 选中后单击右键,在弹出 ...

  6. quartz的初步总结及配置优化

    1.scheduler 1. Scheduler就是Quartz的大脑,所有任务都是由它来设施.Scheduler包含一个两个重要组件: JobStore和ThreadPool.JobStore是会来 ...

  7. linux搭建集群

    磁盘分布 /boot 系统启动时需要的内存(200m) / 系统的可用磁盘大小(10240m) swap 交换内存 建议和内存一致(200m) 名字统一设置: 虚拟机名字 计算机名字 网络中的名字 默 ...

  8. document.readyState和document.DOMContentLoaded判断DOM的加载完成

    document.readyState:判断文档是否加载完成.firefox不支持. 这个属性是只读的,传回值有以下的可能: 0-UNINITIALIZED:XML 对象被产生,但没有任何文件被加载. ...

  9. mysql 5.7.20 取得动态sql执行结果

    drop procedure test; delimiter ;; CREATE procedure test() -- 取动态sql的值 begin ); ); set v_sqlcounts = ...

  10. if (user?.Identity?.IsAuthenticated ?? false)这几个问号分别都代表啥意思?

    if (user?.Identity?.IsAuthenticated ?? false)这几个问号分别都代表啥意思? 0 悬赏园豆:5 [已解决问题] 浏览: 229次 解决于 2018-05-16 ...