@Override
    public void start() {
        XMPPServer.getInstance().addServerListener( this );

        // Remove unused rooms from memory
        Duration cleanupFreq = Duration.ofMinutes(JiveGlobals.getLongProperty("xmpp.muc.cleanupFrequency.inMinutes", CLEANUP_FREQUENCY));
        TaskEngine.getInstance().schedule(new CleanupTask(), cleanupFreq, cleanupFreq);

        // Set us up to answer disco item requests
        XMPPServer.getInstance().getIQDiscoItemsHandler().addServerItemsProvider(this);
        XMPPServer.getInstance().getIQDiscoInfoHandler().setServerNodeInfoProvider(this.getServiceDomain(), this);

        Log.info(LocaleUtils.getLocalizedString("startup.starting.muc", Collections.singletonList(getServiceDomain())));

        final int preloadDays = MUCPersistenceManager.getIntProperty(chatServiceName, "preload.days", 30);
        if (preloadDays > 0) {
            if (ClusterManager.isClusteringEnabled()) {
                Log.warn("Preloading MUC rooms when clustering is enabled can lead to a lot of duplicated database overhead. Consider disabling MUC room preloading.");
            }
            // Load all the persistent rooms to memory
            final Instant cutoff = Instant.now().minus(Duration.ofDays(preloadDays));
            for (final MUCRoom room : MUCPersistenceManager.loadRoomsFromDB(this, Date.from(cutoff))) {
                localMUCRoomManager.add(room);

                // Start FMUC, if desired.
                room.getFmucHandler().applyConfigurationChanges();
            }
        }
    }
Accessor uses the "double-check idiom" for proper lazy instantiation.
@return An Archiver instance, never null.
xmppserver/src/main/java/org/jivesoftware/openfire/muc/spi/MultiUserChatServiceImpl.java