Tigase代码框架解读

19104406_3ePV.jpg

  • 在java下实现的xmpp开源实现,除了openfire外,tigase是另一个牛逼的项目。

  • 实际的实验室压力下,50万人同时在线的单机,tigase的gc情况要优于openfire,而且openfire的网络层代码借鉴了不少tigase的。

下面的内容,在解剖tigase过程中所写,使用的版本是:5.2.1 (2014年7月份)。

组件

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)方法会被调用。

架子

  • ComponentRegistrator:本身是一种组件,专用于注册各种组件。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具体的实现来处理。

转载于:https://my.oschina.net/wjwei113/blog/357944

来自官网,更新于201704。官网在国外很难下载,现在放到这里方便国内的朋友下载研究。 F:. │ .gitignore │ build.gradle │ gradle.properties │ gradlew │ gradlew.bat │ settings.gradle │ tigase_dir.txt │ ├─.git │ │ config │ │ description │ │ HEAD │ │ index │ │ packed-refs │ │ │ ├─hooks │ │ applypatch-msg.sample │ │ commit-msg.sample │ │ post-update.sample │ │ pre-applypatch.sample │ │ pre-commit.sample │ │ pre-push.sample │ │ pre-rebase.sample │ │ pre-receive.sample │ │ prepare-commit-msg.sample │ │ update.sample │ │ │ ├─info │ │ exclude │ │ │ ├─logs │ │ │ HEAD │ │ │ │ │ └─refs │ │ ├─heads │ │ │ master │ │ │ │ │ └─remotes │ │ └─origin │ │ HEAD │ │ │ ├─objects │ │ ├─info │ │ └─pack │ │ pack-a5985fcf6d3d54c95897e6cf9f133139e5ee10c1.idx │ │ pack-a5985fcf6d3d54c95897e6cf9f133139e5ee10c1.pack │ │ │ └─refs │ ├─heads │ │ master │ │ │ ├─remotes │ │ └─origin │ │ HEAD │ │ │ └─tags ├─app │ │ .gitignore │ │ build.gradle │ │ proguard-rules.pro │ │ │ └─src │ ├─androidTest │ │ └─java │ │ └─org │ │ └─tigase │ │ └─messenger │ │ └─phone │ │ └─pro │ │ ApplicationTest.java │ │ │ ├─main │ │ │ AndroidManifest.xml │ │ │ │ │ ├─java │ │ │ └─org │ │ │ └─tigase │ │ │ └─messenger │ │ │ ├─jaxmpp │ │ │ │ └─android │ │ │ │ ├─caps │ │ │ │ │ CapabilitiesDBCache.java │ │ │ │ │ CapsDbHelper.java │ │ │ │ │ │ │ │ │ ├─chat │ │ │ │ │ AndroidChatManager.java │ │ │ │ │ ChatProvider.java │ │ │ │ │ MarkAsRead.java │ │ │ │ │ OpenChatDbHelper.java │ │ │ │ │ │ │ │ │ ├─muc │ │ │ │ │ AndroidRoomsManager.java │ │ │ │ │ │ │ │ │ └─roster │ │ │ │ AndroidRosterStore.java │ │ │ │ RosterDbHelper.java │ │ │ │ RosterProvider.java │ │ │ │ │ │ │ └─phone │ │ │ └─pro │ │ │ │ AboutActivity.java │ │ │ │ DividerItemDecoration.java │ │ │ │ MainActivity.java │ │ │ │ MessengerApplication.java │ │ │ │ StatusSelectorAdapter.java │ │ │ │ │ │ │ ├─account │ │ │ │ AccountsConstants.java │ │ │ │ Authenticator.java │ │ │ │ AuthenticatorService.java │ │ │ │ ConnectionChecker.java │ │ │ │ LoginActivity.java │ │ │ │ NewAccountActivity.java │ │ │ │ │ │ │ ├─conenctionStatus │ │ │ │ ConnectionStatusesFragment.java │ │ │ │ StatusesRecyclerViewAdapter.java │ │ │ │ ViewHolder.java │ │ │ │ │ │ │ ├─conversations │ │ │ │ │ AbstractConversationActivity.java │ │ │ │ │ │ │ │ │ ├─chat │ │ │ │ │ ChatActivity.java │ │ │ │ │ ChatItemFragment.java │ │ │ │ │ MyChatItemRecyclerViewAdapter.java │ │ │ │ │ ViewHolder.java │ │ │ │ │ │ │ │ │ └─muc │ │ │ │ JoinMucActivity.java │ │ │ │ MucActivity.java │ │ │ │ MucItemFragment.java │ │ │ │ MucItemRecyclerViewAdapter.java │ │ │ │ ViewHolder.java │ │ │ │ │ │ │ ├─db │ │ │ │ CPresence.java │ │ │ │ CursorRecyclerViewAdapter.java │ │ │ │ DatabaseContract.java │ │ │ │ DatabaseHelper.java │ │ │ │ RosterProviderExt.java │ │ │ │ │ │ │ ├─notifications │ │ │ │ MessageNotification.java │ │ │ │ │ │ │ ├─openchats │ │ │ │ MyOpenChatItemRecyclerViewAdapter.java │ │ │ │ OpenChatItemFragment.java │ │ │ │ ViewHolder.java │ │ │ │ │ │ │ ├─providers │ │ │ │ ChatProvider.java │ │ │ │ RosterProvider.java │ │ │ │ │ │ │ ├─roster │ │ │ │ │ MyRosterItemRecyclerViewAdapter.java │ │ │ │ │ PresenceIconMapper.java │ │ │ │ │ RosterItemFragment.java │ │ │ │ │ ViewHolder.java │ │ │ │ │ │ │ │ │ ├─contact │ │ │ │ │ EditContactActivity.java │ │ │ │ │ │ │ │ │ └─request │ │ │ │ SubscriptionRequestActivity.java │ │ │ │ │ │ │ ├─service │ │ │ │ AndroidLoggingHandler.java │ │ │ │ AutopresenceManager.java │ │ │ │ DataRemover.java │ │ │ │ Features.java │ │ │ │ MobileModeFeature.java │ │ │ │ SecureTrustManagerFactory.java │ │ │ │ ServiceRestarter.java │ │ │ │ StanzaExecutor.java │ │ │ │ XMPPService.java │ │ │ │ │ │ │ ├─settings │ │ │ │ AppCompatPreferenceActivity.java │ │ │ │ SettingsActivity.java │ │ │ │ │ │ │ └─utils │ │ │ AsyncDrawable.java │ │ │ AvatarHelper.java │ │ │ BitmapWorkerTask.java │ │ │ DiskLruCache.java │ │ │ ImageHelper.java │ │ │ │ │ └─res │ │ ├─drawable │ │ │ ic_accounts_24dp.xml │ │ │ ic_add.xml │ │ │ ic_add_chat_24dp.xml │ │ │ ic_connection_info_24dp.xml │ │ │ ic_groupchat_24dp.xml │ │ │ ic_menu_about.xml │ │ │ ic_menu_chats.xml │ │ │ ic_menu_roster.xml │ │ │ ic_menu_settings.xml │ │ │ ic_message_delivered_24dp.xml │ │ │ ic_message_not_sent_24dp.xml │ │ │ ic_message_sent_24dp.xml │ │ │ ic_messenger_icon.xml │ │ │ ic_muc_24dp.xml │ │ │ ic_send_24dp.xml │ │ │ message_bubble_error.9.png │ │ │ message_bubble_received.9.png │ │ │ message_bubble_received_4.9.png │ │ │ message_bubble_sent.9.png │ │ │ message_bubble_sent_1.9.png │ │ │ message_bubble_sysmsg.9.png │ │ │ presence_away.xml │ │ │ presence_chat.xml │ │ │ presence_dnd.xml │ │ │ presence_error.xml │ │ │ presence_offline.xml │ │ │ presence_online.xml │ │ │ presence_unknown.xml │ │ │ presence_xa.xml │ │ │ side_nav_bar.xml │ │ │ user_avatar.png │ │ │ │ │ ├─drawable-hdpi │ │ │ ic_info_black_24dp.png │ │ │ ic_launcher.png │ │ │ ic_notifications_black_24dp.png │ │ │ ic_sync_black_24dp.png │ │ │ │ │ ├─drawable-mdpi │ │ │ ic_info_black_24dp.png │ │ │ ic_launcher.png │ │ │ ic_notifications_black_24dp.png │ │ │ ic_sync_black_24dp.png │ │ │ │ │ ├─drawable-v21 │ │ │ ic_info_black_24dp.xml │ │ │ ic_notifications_black_24dp.xml │ │ │ ic_sync_black_24dp.xml │ │ │ │ │ ├─drawable-xhdpi │ │ │ ic_info_black_24dp.png │ │ │ ic_launcher.png │ │ │ ic_notifications_black_24dp.png │ │ │ ic_sync_black_24dp.png │ │ │ │ │ ├─drawable-xxhdpi │ │ │ ic_info_black_24dp.png │ │ │ ic_launcher.png │ │ │ ic_notifications_black_24dp.png │ │ │ ic_sync_black_24dp.png │ │ │ │ │ ├─drawable-xxxhdpi │ │ │ ic_info_black_24dp.png │ │ │ ic_launcher.png │ │ │ ic_notifications_black_24dp.png │ │ │ ic_sync_black_24dp.png │ │ │ │ │ ├─layout │ │ │ account_list_item.xml │ │ │ activity_about.xml │ │ │ activity_chat.xml │ │ │ activity_edit_contact.xml │ │ │ activity_join_muc.xml │ │ │ activity_login.xml │ │ │ activity_main.xml │ │ │ activity_muc.xml │ │ │ activity_new_account.xml │ │ │ activity_subscription_request.xml │ │ │ app_bar_main.xml │ │ │ content_chat.xml │ │ │ content_main.xml │ │ │ content_muc.xml │ │ │ fragment_chatitem_error.xml │ │ │ fragment_chatitem_list.xml │ │ │ fragment_chatitem_received.xml │ │ │ fragment_chatitem_sent.xml │ │ │ fragment_chatitem_sysmsg.xml │ │ │ fragment_connectionstatusitem.xml │ │ │ fragment_connectionstatus_list.xml │ │ │ fragment_groupchatitem_received.xml │ │ │ fragment_groupchatitem_sent.xml │ │ │ fragment_mucitem_list.xml │ │ │ fragment_openchatitem.xml │ │ │ fragment_openchatitem_list.xml │ │ │ fragment_rosteritem.xml │ │ │ fragment_rosteritem_list.xml │ │ │ nav_header_main.xml │ │ │ status_selectoritem.xml │ │ │ │ │ ├─menu │ │ │ activity_main_drawer.xml │ │ │ chatitem_context.xml │ │ │ connection_status_context.xml │ │ │ main.xml │ │ │ menu_chat.xml │ │ │ openchat_chat_context.xml │ │ │ openchat_fragment.xml │ │ │ openchat_groupchat_context.xml │ │ │ roster_context.xml │ │ │ roster_fragment.xml │ │ │ │ │ ├─mipmap-xhdpi │ │ │ ic_launcher.png │ │ │ │ │ ├─mipmap-xxhdpi │ │ │ ic_launcher.png │ │ │ │ │ ├─mipmap-xxxhdpi │ │ │ ic_launcher.png │ │ │ │ │ ├─raw │ │ │ trust_store_bks │ │ │ │ │ ├─values │ │ │ attrs.xml │ │ │ colors.xml │ │ │ dimens.xml │ │ │ strings.xml │ │ │ styles.xml │ │ │ │ │ ├─values-v21 │ │ │ styles.xml │ │ │ │ │ ├─values-w820dp │ │ │ dimens.xml │ │ │ │ │ └─xml │ │ account_preferences.xml │ │ authenticator.xml │ │ pref_accounts_list.xml │ │ pref_data_sync.xml │ │ pref_general.xml │ │ pref_headers.xml │ │ pref_notification.xml │ │ │ └─test │ └─java │ └─org │ └─tigase │ └─messenger │ └─phone │ └─pro │ ExampleUnitTest.java │ ├─documentation │ │ build.gradle │ │ │ └─src │ └─asciidoc │ │ index.asciidoc │ │ │ ├─css │ │ docbook-xsl.css │ │ │ ├─images │ │ Accounts.png │ │ ArchiveChat.png │ │ General.png │ │ JoinChat.png │ │ LeaveRoom.png │ │ Menu.png │ │ MUC.png │ │ Notifications.png │ │ Options.png │ │ Register.png │ │ Roster.png │ │ Screenshot_2015-04-26-13-38-30.png │ │ Screenshot_2015-04-26-13-38-46.png │ │ Screenshot_2015-04-26-13-40-14.png │ │ Screenshot_2015-04-26-13-40-53.png │ │ Screenshot_2015-04-26-13-41-20.png │ │ Screenshot_2015-04-26-13-41-42.png │ │ Screenshot_2015-04-26-13-42-20.png │ │ Screenshot_2015-04-26-13-43-54.png │ │ Screenshot_2015-04-26-14-00-37.png │ │ Screenshot_2015-04-26-14-00-49.png │ │ Screenshot_2015-04-26-14-00-56.png │ │ Screenshot_2015-04-26-14-01-13.png │ │ Screenshot_2015-04-26-14-01-23.png │ │ Screenshot_2015-04-26-14-01-31.png │ │ Screenshot_2015-04-26-14-01-50.png │ │ Screenshot_2015-04-26-14-02-01.png │ │ Screenshot_2015-04-26-14-02-36.png │ │ Screenshot_2015-04-26-14-03-06.png │ │ Screenshot_2015-04-26-14-03-16.png │ │ Screenshot_2015-04-26-14-04-35.png │ │ Screenshot_2015-04-26-14-05-35.png │ │ Screenshot_2015-04-26-14-06-03.png │ │ Screenshot_2015-04-26-14-07-03.png │ │ Screenshot_2015-04-26-14-07-11.png │ │ Screenshot_2015-04-26-14-08-09.png │ │ Screenshot_2015-04-26-14-09-31.png │ │ Screenshot_2015-04-26-14-15-35.png │ │ Screenshot_2015-04-26-14-18-03.png │ │ Status.png │ │ tiger-looking-left-small.png │ │ Welcome.png │ │ │ └─text │ Tigase_Tigase_Android_Messenger-General_overview.asciidoc │ Tigase_Tigase_Android_Messenger-User_guide.asciidoc │ └─gradle └─wrapper gradle-wrapper.jar gradle-wrapper.properties
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值