• Tigase代码框架浅析(十)


    一、组件

    tigase就是一个大组件框,里面所有东西基本都是组件组成的。session manager、message router、c2s connection manager…全部是组件

    ServerComponent接口是一个最小化接口,但是要去写很多代码,tigase提供了许多的现成的代码,减少去从零实现这个接口的过程。

    比如extends AbstractMessageReceiver可以直接生成一个处理消息的组件。 只需要实现一个processPacket方法。实现getDefaults方法,可以对系统变量进行处理。实现setProperties方法,可以去设置一些要用的变量。

    二、多线程

    processPacket方法,可以把逻辑扔到不同的cpu上去运行,以发挥服务器多核的优势。processingThreads方法返回用多少个cpu来处理。

    在重写processingThreads的同时,需要重写hashCodeForPacket方法,确保同一个用户的数据,在同一个cpu上处理,以确保不出现消息乱序。

    三、定时器

    可以重写everySecond everyMinute everyHour的逻辑,以达到定时器的作用。

    还可以重写另外两个方法来指定固定时间完成的任务:

    addTimerTask(TimerTask task, long delay, TimeUnit unit);

    addTimerTask(TimerTask task, long delay);

    重写initializationComplete方法,tigase会在特定的时间里来调用,具体说,就是在所有准备工作做完了后,多半这里用来启动连接之类的。

    四、统计信息

    复写getStatistics,用StatisticsList来保存统计信息。

    五、组件的生命周期

    一个组件按照下面的过程被调用:

    组件被加载,使用无参的public构造函数创建一个实例。

    setName

    start

    getDefaults

    setProperties

    initializationCompleted 最后被调用,一般用来启动socket连接。

    六、ConnectionManager

    ConnectionManager是继承自AbstractMessageReceiver(前面的可以省去代码的组件实现方式)的抽象类,比如c2s组件就是继承了它。

    如果你extend这个类,你需要知道数据来源于哪里:如果来源于MessageRouter,那么abstract void processPacket(Packet packet)方法会被调用; 如果来源于网络连接,那么abstract Queue processSocketData(XMPPIOService serv)方法会被调用

    ##架子 omponentRegistrator:本身是一种组件,专用于注册各种组件。registr –> addComponent

    MessageReceiver:本身是一种组件,专用于收消息。也叫Router,因为消息内容在此类组件中流动。

    XMPPService:本身是一种组件,专用于显示serviceDiscovery时的名称啥的。大作用没有。

    AbstractMessageReceiver:高级一点的组件,基于MessageReceiver、XMPPService,同时实现了很多细节,还搞了多个线程搞收和发。

    七、启动

    messageRouter的setConfig,进入ConfiguratorAbstract-AbstractComponentRegistrator的addComponent。

    再回到ConfiguratorAbstract的componentAdded,然后是setup(component)。

    component.setProperties进入messageRouter的setProperties。

    comp.initializationCompleted()启动了connectionManager的各种socket。

    八、网络

    connectionManager同时协调ConnectionOpenThread与SocketThread。

    ConnectionOpenThread脱离上述组件,属于网络层实现,操作selector。它负责Selector.open。

    IOService提供线程安全的call方法,XMPPIOService继承它,保存了连接信息,每个连接一个IOService。

    SocketThread在实例化时,会启动多个线程,同时盯住selector。负责将每个确定的IOService进行数据处理。

    实现ConnectionOpenListener接口accept方法接收SocketChannel,组装IOService,交由SocketThread处理。

    ConnectionManager用ConcurrentHashMap记录了所有的连接。

    九、零碎

    AbstractMessageReceiver.addPacket 往自己的in_queue里加数据,是阻塞的,如果满了会出事。

    AbstractMessageReceiver.addPacketNB 往自己的in_queue里加数据,非阻塞的,和上一个的区别在于,一个是put一个是offer到queue。

    AbstractMessageReceiver.addPackets 来一堆数据。

    所有in_queue里的数据,会被processPacket方法所处理。

    对应有addOutPacket。

    所有out_queue里的数据,都默认扔给parent的in_queue,没有parent就扔到自己的in_queue。

    所有in_queue的数据,都由processPacket具体的实现来处理。

    学海无涯、何时是岸
  • 相关阅读:
    DBGridEh表尾显示合计 .....
    03004_Web开发
    雷林鹏分享:Flask请求对象
    雷林鹏分享:Flask静态文件
    雷林鹏分享:Flask模板
    雷林鹏分享:Flask HTTP方法
    雷林鹏分享:Flask URL构建
    雷林鹏分享:Flask变量规则
    雷林鹏分享:Flask路由
    雷林鹏分享:Flask应用程序
  • 原文地址:https://www.cnblogs.com/veblen/p/14703736.html
Copyright © 2020-2023  润新知