`
buerkai
  • 浏览: 169297 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

openfire(2)数据库脚本执行

 
阅读更多

当XMPPServer启动的时候,会调用其start()方法,

    public void start() {
        try {
            initialize();

            startDate = new Date();
            // Store server info
            xmppServerInfo = new XMPPServerInfoImpl(name, host, version, startDate, getConnectionManager());

            // Create PluginManager now (but don't start it) so that modules may use it
            File pluginDir = new File(openfireHome, "plugins");
            pluginManager = new PluginManager(pluginDir);

            // If the server has already been setup then we can start all the server's modules
            if (!setupMode) {
                verifyDataSource();
                // First load all the modules so that modules may access other modules while
                // being initialized
                loadModules();
                // Initize all the modules
                initModules();
                // Start all the modules
                startModules();
            }
            // Initialize statistics
            ServerTrafficCounter.initStatistics();

            // Load plugins (when in setup mode only the admin console will be loaded)
            pluginManager.start();

            // Log that the server has been started
            String startupBanner = LocaleUtils.getLocalizedString("short.title") + " " + version.getVersionString() +
                    " [" + JiveGlobals.formatDateTime(new Date()) + "]";
            Log.info(startupBanner);
            System.out.println(startupBanner);

            started = true;
           
            // Notify server listeners that the server has been started
            for (XMPPServerListener listener : listeners) {
                listener.serverStarted();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            Log.error(e.getMessage(), e);
            System.out.println(LocaleUtils.getLocalizedString("startup.error"));
            shutdownServer();
        }
    }

 

start方法中干的事情太多了,这里主要介绍数据库方面,其他的暂时不做介绍。

initialize();会读取openfire.xml中的setup的值,如果为true,就不会做数据的验证操作。

openfire所有的自动化执行简表脚本都在此方法中verifyDataSource();

 

private void verifyDataSource() {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            con = DbConnectionManager.getConnection();在此做了很多的操作。
            pstmt = con.prepareStatement("SELECT count(*) FROM ofID");
            rs = pstmt.executeQuery();
            rs.next();
        }
        catch (Exception e) {
            System.err.println("Database setup or configuration error: " +
                    "Please verify your database settings and check the " +
                    "logs/error.log file for detailed error messages.");
            Log.error("Database could not be accessed", e);
            throw new IllegalArgumentException(e);
        }
        finally {
            DbConnectionManager.closeConnection(rs, pstmt, con);
        }
    }

 

DbConnectionManager.getConnection();:

在获取数据库链接的时候会做如下操作:

public static Connection getConnection() throws SQLException {
        if (connectionProvider == null) {
            synchronized (providerLock) {
                if (connectionProvider == null) {
                    // Attempt to load the connection provider classname as
                    // a Jive property.
                    String className = JiveGlobals.getXMLProperty("connectionProvider.className");
                    if (className != null) {
                        // Attempt to load the class.
                        try {
                            Class conClass = ClassUtils.forName(className);
                            setConnectionProvider((ConnectionProvider)conClass.newInstance());
                        }
                        catch (Exception e) {
                            Log.warn("Failed to create the " +
                                    "connection provider specified by connection" +
                                    "Provider.className. Using the default pool.", e);
                            setConnectionProvider(new DefaultConnectionProvider());
                        }
                    }
                    else {
                        setConnectionProvider(new DefaultConnectionProvider());
                    }
                }
            }
        }

        // TODO: May want to make these settings configurable
        Integer retryCnt = 0;
        Integer retryMax = 10;
        Integer retryWait = 250; // milliseconds
        Connection con = null;
        SQLException lastException = null;
        do {
            try {
             con = connectionProvider.getConnection();
                if (con != null) {
                    // Got one, lets hand it off.
                    // Usually profiling is not enabled. So we return a normal
                    // connection unless profiling is enabled. If yes, wrap the
                    // connection with a profiled connection.
                    if (!profilingEnabled) {
                        return con;
                    }
                    else {
                        return new ProfiledConnection(con);
                    }
                }
            } catch (SQLException e) {
             // TODO distinguish recoverable from non-recoverable exceptions.
             lastException = e;
             Log.info("Unable to get a connection from the database pool " +
               "(attempt "+retryCnt+" out of "+retryMax+").", e);
   }
            try {
                Thread.sleep(retryWait);
            }
            catch (Exception e) {
                // Ignored
            }
            retryCnt++;
        } while (retryCnt <= retryMax);
        throw new SQLException("ConnectionManager.getConnection() " +
                "failed to obtain a connection after " + retryCnt +" retries. " +
                "The exception from the last attempt is as follows: "+lastException);
    }

 

会在数据库配置文件中读取connectionProvider的配置,如果没有,就采用默认的DefaultConnectionProvider,

 

 

public static void setConnectionProvider(ConnectionProvider provider) {
        synchronized (providerLock) {
            if (connectionProvider != null) {
                connectionProvider.destroy();
                connectionProvider = null;
            }
            connectionProvider = provider;
            connectionProvider.start();
            // Now, get a connection to determine meta data.
            Connection con = null;
            try {
                con = connectionProvider.getConnection();
                setMetaData(con);

                // Check to see if the database schema needs to be upgraded.
                schemaManager.checkOpenfireSchema(con);
            }
            catch (Exception e) {
                Log.error(e.getMessage(), e);
            }
            finally {
                closeConnection(con);
            }
        }

 

 

 

   schemaManager.checkOpenfireSchema(con);是模板管理器,这个才是真的自动建表的管理器。
checkOpenfireSchema方法调用 private boolean checkSchema(Connection con, String schemaKey, int requiredVersion,
            ResourceLoader resourceLoader) throws Exception;方法,根据版本号来确定是否需要建表,会读取相关的sql脚本。

 

 public boolean checkPluginSchema(final Plugin plugin) ,这个方法也是根据版本号来执行插件中database中sql脚本,其有一定的命名规则,插件名_数据库类型.sql。这个地方的版本号是从插件的配置文件中读取

<databaseKey>clientcontrol</databaseKey>
    <databaseVersion>0</databaseVersion>,

这个配置的作用已在另外一篇文章中做说明了。

 

此篇文章就到此,稍后会有更多关于openfire的个人解读。

联系方式(qq):851392159

出处:http://buerkai.iteye.com

 

分享到:
评论

相关推荐

    openfire聊天记录插件(含有数据库脚本)

    描述中提到的`chatlogs_mysql.sql`文件是一个MySQL数据库脚本。在安装和使用聊天记录插件之前,你需要先运行这个脚本来创建所需的数据库结构。脚本会定义表,用于存储聊天记录的数据,比如发送者、接收者、消息内容...

    Openfire配置

    具体来说,需要在MySQL数据库中创建一个名为openfire的数据库,并导入Openfire提供的数据库脚本。虽然官方文档建议导入自带的数据库脚本,但经过实践证明,仅需要在MySQL中创建一个新数据库即可,因为Openfire会在...

    openfire 聊天历史纪录插件1

    3. **SQL文件**:`ofmessagelog.sql`是一个数据库脚本文件,用于在openfire的数据库中创建必要的表结构,以支持聊天记录的存取。安装插件时,通常需要执行这个SQL脚本来初始化数据表。 4. **兼容性**:作为openfire...

    Openfire安装部署

    这个压缩包可能包含了一些额外的文件,如示例配置文件、数据库脚本等。例如,如果你打算使用MySQL,可能会有一个.sql文件用于创建Openfire所需的数据库结构。你需要在数据库管理工具中运行这些脚本来初始化数据库。 ...

    Openfire_spark_安装手册

    - **脚本位置**:数据库脚本位于`C:\Program Files\Openfire\resources\database`目录下。 - **脚本执行**:根据实际需求选择相应的数据库类型(如SQL Server 2005),并使用相应的数据库管理工具(如Management ...

    openfire3.9.1 源码部署及运行

    Openfire支持多种数据库,如MySQL、PostgreSQL或HSQLDB。根据你的需求选择合适的数据库,并创建相应的数据库和用户。然后在Openfire的配置文件中(通常是conf/openfire.xml),更新数据库连接信息,包括URL、用户名...

    openfire 安装包

    - 执行`./install.sh`脚本开始安装过程,按照提示进行配置。 - 安装完成后,启动Openfire服务,可以使用`./bin/startup.sh`命令。 - 配置Openfire服务器,通常通过访问`http://your_server_ip:9090`来完成Web界面...

    openfire服务端实现

    - 设置环境变量,例如添加 `JAVA_HOME` 和 `OPENFIRE_HOME`,并将 Openfire 的启动脚本添加到系统路径。 - 启动 Openfire 服务,通常通过执行 `${OPENFIRE_HOME}/bin/startup.sh`。 - 访问 Openfire 的Web管理...

    openfire 安装文件及详细安装教程

    Openfire支持内置的HSQLDB,也允许连接到外部MySQL、PostgreSQL等数据库。如果你选择外部数据库,需提供数据库URL、用户名、密码等信息。 之后,配置SSL/TLS证书。Openfire提供自签名证书,但为了更好的安全性,...

    文档openfire应用

    - 执行安装脚本并创建JDK目录。 - 配置环境变量,包括`JAVA_HOME`, `CLASSPATH`, `PATH`等。 - 检查JDK版本确认是否安装成功。 #### Ant安装 - 解压Ant安装包至指定目录。 - 配置Ant环境变量,包括`ANT_HOME`和...

    openfire_3_9_3.tar.zip

    2. **配置环境**:在解压后的目录中,找到并编辑`conf/openfire.xml`配置文件,设置服务器地址、端口、数据库连接参数等关键信息。同时,确保你的服务器已经安装了Java运行环境(JRE)。 3. **启动服务**:运行解压...

    Openfire_spark安装手册.pdf

    - 数据库脚本位于`C:\Program Files\Openfire\resources\database`目录下(假设默认安装路径)。如果选择了自定义安装路径,请根据实际情况定位该目录。 - 打开该目录,根据实际使用的数据库类型选择相应的脚本文件...

    openfire webchat源码部署相关jar

    EL是一种轻量级的脚本语言,用于在JSP中简单地访问JavaBeans属性和执行其他基本操作。它简化了JSP中的数据绑定,使得开发者能够更方便地处理动态内容。 4. jasper-jdt.jar:这是一个扩展的Jasper编译器,集成了JDT...

    OpenFire二次开发环境搭建

    - **操作指南**:在部署目录下执行相应的启动脚本。需要注意的是,首次启动时可能需要较长时间,因为服务器需要加载所有插件和服务。 ##### 5. 访问服务器 - **步骤说明**:通过浏览器或其他客户端工具访问已启动...

    openfire_3_9_3.tar.gz

    2. **源码安装**:源码安装意味着你需要从源代码编译和构建Openfire,这通常涉及到下载源代码、配置编译环境(例如Java Development Kit, Apache Ant等)、执行编译脚本、配置服务器参数并进行安装。这样的过程给予...

    Openfire_spark_安装手册.pdf

    - 数据库脚本位于安装目录下的`C:\Program Files\Openfire\resources\database`文件夹中,根据实际使用的数据库类型(如SQL Server 2005),选择相应的脚本(例如`openfire_sqlserver.sql`)进行执行。 - 将数据库...

    高仿qq,服务器为openfire

    3. db.sql:这是一个数据库脚本文件,通常用于创建数据库结构、导入初始数据或者执行更新操作。在这个场景下,它可能包含了创建新表的SQL语句,这个新表可能是为高仿QQ特定的业务逻辑而设计的。 综上所述,这个项目...

    openfire_3_8_1.zip

    8. **数据库脚本**:用于初始化或更新Openfire需要的数据库结构,可能包括SQL文件。 9. **许可文件**:如`LICENSE`和`NOTICE`,分别包含了Openfire的开源许可信息和版权通知。 Openfire基于XMPP(Extensible ...

    openfire3.10.2-源码需要的jar

    2. **寻找JAR**:在Openfire的官方资源、GitHub仓库、Maven中央仓库或其他开源存储库中搜索这些JAR文件,或者从已安装的Openfire二进制包中提取。 3. **添加到类路径**:将找到的JAR文件复制到项目的`lib`目录,并在...

Global site tag (gtag.js) - Google Analytics