openfire connectionmanager源码分析

本文详细解析了XMPP服务器的工作流程,包括服务器启动过程、客户端数据接收与处理机制、业务服务器数据交互等内容,并阐述了如何确保连接稳定及数据正确传输。

服务器启动:
ConnectionManager
start()
startModules():
ServerSurrogate:可创建多个连接到业务服务器,把连接信息保存到map中
start():遍历map,测试到业务服务器的连接是否正常
SocketSendingTracker:
start():从SocketConnection中获取连接,检查连接状态
startClientListeners(),初始化mino的监听,设置filter:XMPPCodecFactory、StalledSessionsFilter(如果写的包大于5M就关闭连接)
绑定连接处理器:ClientConnectionHandler(extends ConnectionHandler)
startClientSSLListeners()
startHttpBindServlet()

服务器每次接收客户端发过来的数据可能不是一个完整的xml,XMPPCodecFactory中会进行处理,再到下面的处理就是正确的xml了

接收客户端发过来的协议:

ConnectionHandler
messageReceived():
StanzaHandler.process() 处理stream协议
ServerRouter.route()
ServerSurrogate.send()
在线程池中执行线程:RouteTask.run。
将当前线程转换为ConnectionWorkerThread,执行ConnectionWorkerThread.deliver()
上一步中的线程池是通过ConnectionsWorkerFactory创建的,所以才可以讲RouteTask转换为ConnectionWorkerThread
并且在创建线程的时候,将ConnectionWorkerThread保存到map中了。
创建ConnectionWorkerThread的时候,会创建到业务服务器的连接
这里每个线程对应一个到业务服务器的连接,由于线程是保存在线程池中的,所以线程不会销毁,到业务服务器的连接也不会中断
当线程不够用的时候,线程池自动创建新的线程,新的线程会再创建一个到业务服务器的连接,这样即使其中一个连接阻塞了也没关系。
ConnectionWorkerThread.deliver():这里将协议包装为route协议
SocketConnection.deliver()
接收业务服务器的数据:
ConnectionWorkerThread中连接到也业务服务器时,会设置XMPPPacketReader,然后构造一个ServerPacketReader,在ServerPacketReader中开线程处理来自业务服务器的数据
ProcessSessionQueueTask.run()或ProcessStanzaTask.run()
ServerPacketHandler.handle()
ServerPacketHandler.processRoute():根据streamid取出ClientSession
ClientSession.deliver()


客户端的连接是什么时候保存的呢?
StanzaHandler.process()
Stanzahandler.createSession
ClientStanzaHandler.createSession()
ClientSession.createSession()
Session.addSession()
streamid是创建客户端session时生成的,组装route协议时将streamid加上了,业务服务器返回协议中也有streamid,根据streamid找到Session,就可以将协议返回给客户端
[root@yfw ~]# cd /etc/systemd/system [root@yfw system]# sudo -u openfire tee /opt/openfire/conf/database.properties > /dev/null << 'EOF' > jdbcProvider.className=org.jivesoftware.database.EmbeddedHsqldbProvider > jdbcProvider.connectionString=jdbc:hsqldb:hsql://localhost:9001 > jdbcProvider.username=sa > jdbcProvider.password= > EOF [root@yfw system]# # 确保目录存在 [root@yfw system]# sudo mkdir -p /opt/openfire/embedded-db [root@yfw system]# [root@yfw system]# # 清空旧内容(防止冲突) [root@yfw system]# sudo rm -f /opt/openfire/embedded-db/* [root@yfw system]# [root@yfw system]# # 赋权 [root@yfw system]# sudo chown -R openfire:openfire /opt/openfire/embedded-db [root@yfw system]# pkill -f openfire [root@yfw system]# /opt/openfire/bin/start.sh Using Java: /usr/lib/jvm/java-17-openjdk/bin/java Java Version: openjdk version "17.0.1" 2021-10-19 LTS OpenJDK Runtime Environment 21.9 (build 17.0.1+12-LTS) OpenJDK 64-Bit Server VM 21.9 (build 17.0.1+12-LTS, mixed mode, sharing) Classpath: /opt/openfire/lib/activation-1.1.jar:/opt/openfire/lib/apache-el-9.0.107.jar:/opt/openfire/lib/apache-jsp-9.0.107.jar:/opt/openfire/lib/asm-9.8.jar:/opt/openfire/lib/asm-commons-9.8.jar:/opt/openfire/lib/asm-tree-9.8.jar:/opt/openfire/lib/bcpg-jdk18on-1.78.1.jar:/opt/openfire/lib/bcpkix-jdk18on-1.78.1.jar:/opt/openfire/lib/bcprov-jdk18on-1.78.1.jar:/opt/openfire/lib/bcutil-jdk18on-1.78.1.jar:/opt/openfire/lib/caffeine-3.2.0.jar:/opt/openfire/lib/checker-qual-3.33.0.jar:/opt/openfire/lib/common-image-3.9.4.jar:/opt/openfire/lib/common-io-3.9.4.jar:/opt/openfire/lib/common-lang-3.9.4.jar:/opt/openfire/lib/commons-codec-1.15.jar:/opt/openfire/lib/commons-dbcp2-2.9.0.jar:/opt/openfire/lib/commons-ip-math-1.32.jar:/opt/openfire/lib/commons-lang3-3.18.0.jar:/opt/openfire/lib/commons-logging-1.2.jar:/opt/openfire/lib/commons-pool2-2.9.0.jar:/opt/openfire/lib/commons-text-1.10.0.jar:/opt/openfire/lib/dom4j-2.1.4.jar:/opt/openfire/lib/dwr-3.0.2-RELEASE.jar:/opt/openfire/lib/ecj-3.33.0.jar:/opt/openfire/lib/error_prone_annotations-2.18.0.jar:/opt/openfire/lib/failureaccess-1.0.1.jar:/opt/openfire/lib/guava-32.0.1-jre.jar:/opt/openfire/lib/hsqldb-2.7.1.jar:/opt/openfire/lib/httpclient-4.5.13.jar:/opt/openfire/lib/httpcore-4.4.13.jar:/opt/openfire/lib/i18n-5.0.2.jar:/opt/openfire/lib/imageio-bmp-3.9.4.jar:/opt/openfire/lib/imageio-core-3.9.4.jar:/opt/openfire/lib/istack-commons-runtime-3.0.11.jar:/opt/openfire/lib/j2objc-annotations-2.8.jar:/opt/openfire/lib/jakarta.activation-1.2.2.jar:/opt/openfire/lib/jakarta.annotation-api-1.3.5.jar:/opt/openfire/lib/jakarta.transaction-api-1.3.3.jar:/opt/openfire/lib/jakarta.xml.bind-api-2.3.3.jar:/opt/openfire/lib/jansi-1.18.jar:/opt/openfire/lib/javax.activation-api-1.2.0.jar:/opt/openfire/lib/javax.mail-1.6.2.jar:/opt/openfire/lib/jaxb-api-2.3.1.jar:/opt/openfire/lib/jaxb-runtime-2.3.3.jar:/opt/openfire/lib/jaxen-1.2.0.jar:/opt/openfire/lib/jcip-annotations-1.0.jar:/opt/openfire/lib/jcl-over-slf4j-2.0.9.jar:/opt/openfire/lib/jetty-ee-12.0.24.jar:/opt/openfire/lib/jetty-ee8-annotations-12.0.24.jar:/opt/openfire/lib/jetty-ee8-apache-jsp-12.0.24.jar:/opt/openfire/lib/jetty-ee8-nested-12.0.24.jar:/opt/openfire/lib/jetty-ee8-plus-12.0.24.jar:/opt/openfire/lib/jetty-ee8-security-12.0.24.jar:/opt/openfire/lib/jetty-ee8-servlet-12.0.24.jar:/opt/openfire/lib/jetty-ee8-webapp-12.0.24.jar:/opt/openfire/lib/jetty-ee8-websocket-jetty-api-12.0.24.jar:/opt/openfire/lib/jetty-ee8-websocket-jetty-common-12.0.24.jar:/opt/openfire/lib/jetty-ee8-websocket-jetty-server-12.0.24.jar:/opt/openfire/lib/jetty-ee8-websocket-servlet-12.0.24.jar:/opt/openfire/lib/jetty-http-12.0.24.jar:/opt/openfire/lib/jetty-io-12.0.24.jar:/opt/openfire/lib/jetty-jmx-12.0.24.jar:/opt/openfire/lib/jetty-jndi-12.0.24.jar:/opt/openfire/lib/jetty-plus-12.0.24.jar:/opt/openfire/lib/jetty-security-12.0.24.jar:/opt/openfire/lib/jetty-server-12.0.24.jar:/opt/openfire/lib/jetty-servlet-api-4.0.6.jar:/opt/openfire/lib/jetty-session-12.0.24.jar:/opt/openfire/lib/jetty-util-12.0.24.jar:/opt/openfire/lib/jetty-websocket-core-common-12.0.24.jar:/opt/openfire/lib/jetty-websocket-core-server-12.0.24.jar:/opt/openfire/lib/jetty-xml-12.0.24.jar:/opt/openfire/lib/jmdns-1.0.jar:/opt/openfire/lib/jsmpp-2.3.10.jar:/opt/openfire/lib/json-20231013.jar:/opt/openfire/lib/jspecify-1.0.0.jar:/opt/openfire/lib/jsr305-3.0.2.jar:/opt/openfire/lib/jtds-1.3.1.jar:/opt/openfire/lib/jzlib-1.1.3.jar:/opt/openfire/lib/libidn-1.35.jar:/opt/openfire/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/opt/openfire/lib/log4j-api-2.20.0.jar:/opt/openfire/lib/log4j-core-2.20.0.jar:/opt/openfire/lib/log4j-slf4j2-impl-2.20.0.jar:/opt/openfire/lib/mssql-jdbc-9.4.1.jre11.jar:/opt/openfire/lib/mysql-connector-j-8.2.0.jar:/opt/openfire/lib/netty-all-4.1.118.Final.jar:/opt/openfire/lib/netty-buffer-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-dns-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-haproxy-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-http2-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-http-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-memcache-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-mqtt-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-redis-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-smtp-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-socks-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-stomp-4.1.118.Final.jar:/opt/openfire/lib/netty-codec-xml-4.1.118.Final.jar:/opt/openfire/lib/netty-common-4.1.118.Final.jar:/opt/openfire/lib/netty-handler-4.1.118.Final.jar:/opt/openfire/lib/netty-handler-proxy-4.1.118.Final.jar:/opt/openfire/lib/netty-handler-ssl-ocsp-4.1.118.Final.jar:/opt/openfire/lib/netty-resolver-4.1.118.Final.jar:/opt/openfire/lib/netty-resolver-dns-4.1.118.Final.jar:/opt/openfire/lib/netty-resolver-dns-classes-macos-4.1.118.Final.jar:/opt/openfire/lib/netty-resolver-dns-native-macos-4.1.118.Final-osx-aarch_64.jar:/opt/openfire/lib/netty-resolver-dns-native-macos-4.1.118.Final-osx-x86_64.jar:/opt/openfire/lib/netty-transport-4.1.118.Final.jar:/opt/openfire/lib/netty-transport-classes-epoll-4.1.118.Final.jar:/opt/openfire/lib/netty-transport-classes-kqueue-4.1.118.Final.jar:/opt/openfire/lib/netty-transport-native-epoll-4.1.118.Final-linux-aarch_64.jar:/opt/openfire/lib/netty-transport-native-epoll-4.1.118.Final-linux-riscv64.jar:/opt/openfire/lib/netty-transport-native-epoll-4.1.118.Final-linux-x86_64.jar:/opt/openfire/lib/netty-transport-native-kqueue-4.1.118.Final-osx-aarch_64.jar:/opt/openfire/lib/netty-transport-native-kqueue-4.1.118.Final-osx-x86_64.jar:/opt/openfire/lib/netty-transport-native-unix-common-4.1.118.Final.jar:/opt/openfire/lib/netty-transport-rxtx-4.1.118.Final.jar:/opt/openfire/lib/netty-transport-sctp-4.1.118.Final.jar:/opt/openfire/lib/netty-transport-udt-4.1.118.Final.jar:/opt/openfire/lib/ojdbc11-23.7.0.25.01.jar:/opt/openfire/lib/ons-23.7.0.25.01.jar:/opt/openfire/lib/oraclepki-23.7.0.25.01.jar:/opt/openfire/lib/orai18n-23.7.0.25.01.jar:/opt/openfire/lib/postgresql-42.7.7.jar:/opt/openfire/lib/rsi-23.7.0.25.01.jar:/opt/openfire/lib/shaj-0.5.jar:/opt/openfire/lib/simplefan-23.7.0.25.01.jar:/opt/openfire/lib/sitemesh-2.5.0.jar:/opt/openfire/lib/slf4j-api-2.0.9.jar:/opt/openfire/lib/startup.jar:/opt/openfire/lib/taglibs-standard-impl-1.2.5.jar:/opt/openfire/lib/taglibs-standard-spec-1.2.5.jar:/opt/openfire/lib/tinder-2.1.0.jar:/opt/openfire/lib/txw2-2.3.3.jar:/opt/openfire/lib/ucp-23.7.0.25.01.jar:/opt/openfire/lib/xdb-23.7.0.25.01.jar:/opt/openfire/lib/xmppserver-5.0.2.jar:/opt/openfire/lib/xpp3-1.1.4c.0.jar Starting OpenFire... OpenFire started (PID 1110116) Check logs: tail -f /opt/openfire/logs/nohup.out [root@yfw system]# tail -f /opt/openfire/logs/nohup.out DEBUG: User = openfire DEBUG: Current dir = /opt/openfire DEBUG: OPENFIRE_HOME = /opt/openfire DEBUG: Java executable = /usr/lib/jvm/java-17-openjdk/bin/java openjdk version "17.0.1" 2021-10-19 LTS OpenJDK Runtime Environment 21.9 (build 17.0.1+12-LTS) OpenJDK 64-Bit Server VM 21.9 (build 17.0.1+12-LTS, mixed mode, sharing) DEBUG: Launching OpenFire... Database setup or configuration error: Please verify your database settings and check the logs/openfire.log file for detailed error messages. java.lang.IllegalArgumentException: java.sql.SQLException: ConnectionManager.getConnection() failed to obtain a connection after 11 attempts. The exception from the last attempt is as follows: java.sql.SQLException: Check JDBC properties; data source was not be initialised at org.jivesoftware.openfire.XMPPServer.verifyDataSource(XMPPServer.java:1020) at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:666) at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:221) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) at java.base/java.lang.Class.newInstance(Class.java:645) at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) Caused by: java.sql.SQLException: ConnectionManager.getConnection() failed to obtain a connection after 11 attempts. The exception from the last attempt is as follows: java.sql.SQLException: Check JDBC properties; data source was not be initialised at org.jivesoftware.database.DbConnectionManager.getConnection(DbConnectionManager.java:204) at org.jivesoftware.openfire.XMPPServer.verifyDataSource(XMPPServer.java:1010) ... 11 more Error starting the server. Please check the log files for more information.
最新发布
11-16
[root@yfw ~]# cd /opt/openfire [root@yfw openfire]# unzip -p /opt/openfire/plugins/restapi-plugin.jar plugin.xml <?xml version="1.0" encoding="UTF-8"?> <plugin> <className>com.example.restapi.RestApiPlugin</className> <name>REST API Plugin</name> <description>A simple plugin to expose REST APIs.</description> <version>1.0.0</version> <author>Your Name</author> </plugin> [root@yfw openfire]# unzip -p /opt/openfire/plugins/restapi-plugin.jar plugin.xml <?xml version="1.0" encoding="UTF-8"?> <plugin> <className>com.example.restapi.RestApiPlugin</className> <name>REST API Plugin</name> <description>A simple plugin to expose REST APIs.</description> <version>1.0.0</version> <author>Your Name</author> </plugin> [root@yfw openfire]# unzip -l /opt/openfire/plugins/restapi-plugin.jar | grep RestApiPlugin.class 933 10-03-2025 02:27 com/example/restapi/RestApiPlugin.class [root@yfw openfire]# ls -l /opt/openfire/plugins/restapi-plugin.jar -rw-r--r-- 1 root root 3374 Oct 3 02:27 /opt/openfire/plugins/restapi-plugin.jar [root@yfw openfire]# chown openfire:openfire /opt/openfire/plugins/restapi-plugin.jar [root@yfw openfire]# rm -rf /opt/openfire/plugins/restapi-plugin/ [root@yfw openfire]# systemctl restart openfire [root@yfw openfire]# tail -f /opt/openfire/logs/openfire.log 2025.10.03 02:38:06.122 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.ConnectionListener[socket_s2s-directTLS] - Started. 2025.10.03 02:38:06.132 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.ConnectionListener[component] - Started. 2025.10.03 02:38:06.147 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.ConnectionListener[component-directTLS] - Started. 2025.10.03 02:38:06.153 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.ConnectionListener[connection_manager] - Started. 2025.10.03 02:38:06.187 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.ConnectionListener[connection_manager-directTLS] - Started. 2025.10.03 02:38:06.199 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.spi.EncryptionArtifactFactory - Creating new SslContextFactory instance 2025.10.03 02:38:06.258 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.http.HttpSessionManager - Starting instance 2025.10.03 02:38:06.482 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.http.HttpBindManager - HTTP bind service started 2025.10.03 02:38:08.130 INFO [socket_c2s-thread-2]: org.jivesoftware.util.cache.CacheFactory - Created cache [org.jivesoftware.util.cache.DefaultLocalCacheStrategy] for Locked Out Accounts 2025.10.03 02:38:08.331 INFO [socket_c2s-thread-2]: org.jivesoftware.util.cache.CacheFactory - Created cache [org.jivesoftware.util.cache.DefaultLocalCacheStrategy] for Sequences 2025.10.03 02:38:26.499 ERROR [PluginMonitorExec-2]: org.jivesoftware.openfire.container.PluginManager - An exception occurred while loading plugin 'restapi-plugin': java.lang.NullPointerException: null at org.jivesoftware.openfire.container.PluginManager.loadPlugin(PluginManager.java:582) [xmppserver-4.9.2.jar:4.9.2] at org.jivesoftware.openfire.container.PluginMonitor$MonitorTask$4.call(PluginMonitor.java:380) [xmppserver-4.9.2.jar:4.9.2] at org.jivesoftware.openfire.container.PluginMonitor$MonitorTask$4.call(PluginMonitor.java:368) [xmppserver-4.9.2.jar:4.9.2] at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?] at java.lang.Thread.run(Thread.java:829) [?:?]
10-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值