【仅供内部供应商使用,不提供对外解答和培训】

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

前言

在插件开发中,我们经常需要把一些配置信息保存到服务器中,以便重启服务器的时候能够记录上一次保存的信息,这一点和设计器配置信息的保存和读取差不多。

实现方式

要保存信息到服务器上,一般来说,我们可以把数据存储到数据库或者xml文件中,这里介绍的是把数据保存到xml文件中。

实现过程

考虑到FineReport是支持本地设计和远程设计的,所以配置文件在读写的时候也需要考虑是否是远程环境,此外,还需要考虑集群环境中,配置文件的读取。

首先,需要继承类

com.fr.file.XMLFileManager

这个类用于读取WEB-INF/resources下的xml文件,继承了这个类,我们就不用去考虑是远程设计还是本地设计了,FineReport的读写资源的API已经为我们处理好了这一切。

其次,为了在集群环境中也能正确的读取配置文件,需要给实现类抽象出来一个接口,假设我们的配置文件类的名字叫ExpirationConfigManager,那么我们需要抽象出来一个接口叫ExpirationConfigManagerProvider

public interface ExpirationConfigManagerProvider extends RemoteXMLFileManagerProvider, java.io.Serializable, FCloneable {

    int getValidMonthCount();

    void setValidMonthCount(int validMonthCount);

    int getWarningDayCount();

    void setWarningDayCount(int count);
}

 

在ExpirationConfigManagerProvider接口中,我们需要提供对外调用的所有方法接口。

一般来说,配置信息类都以一个单例的形式存在。下面来看一看这个实现示例:

配置文件管理示例类
public class ExpirationConfigManager extends XMLFileManager implements ExpirationConfigManagerProvider {

    private static final String XML_TAG = "ExpirationConfigManager";

    private static ExpirationConfigManagerProvider manager = null;


    public synchronized static ExpirationConfigManager getInstance() {
        return (ExpirationConfigManager) getProviderInstance();
    }

    public synchronized static ExpirationConfigManagerProvider getProviderInstance() {
        if (manager == null) {
            if (isClusterMember()) {
                return manager;
            }
            manager.readXMLFile();
        }
        return manager;
    }

    private synchronized static boolean isClusterMember() {
        switch (BaseClusterHelper.getClusterState()) {
            case LEADER:
                manager = new ExpirationConfigManager();
                RPC.registerSkeleton(manager);
                return false;
            case MEMBER:
                String ip = BaseClusterHelper.getMainServiceIP();
                manager = (ExpirationConfigManagerProvider) RPC.getProxy(ExpirationConfigManager.class, ip);
                return true;
            default:
                manager = new ExpirationConfigManager();
                break;
        }

        return false;
    }

    static {
        GeneralContext.addEnvChangedListener(new EnvChangedListener() {
            public void envChanged() {
                ExpirationConfigManager.envChanged();
            }
        });
    }

    private synchronized static void envChanged() {
        manager = null;
    }


    private int validMonthCount = 1;
    private int warningDayCount = 6;


    public int getValidMonthCount() {
        return validMonthCount;
    }

    public void setValidMonthCount(int validMonthCount) {
        this.validMonthCount = validMonthCount;
    }

    @Override
    public int getWarningDayCount() {
        return warningDayCount;
    }

    @Override
    public void setWarningDayCount(int count) {
        warningDayCount = count;
    }

    @Override
    public String fileName() {
        return "expiration.xml";
    }


    @Override
    public void readXML(XMLableReader reader) {
        if (reader.isAttr()) {
            validMonthCount = reader.getAttrAsInt("validMonthCount", 1);
            warningDayCount = reader.getAttrAsInt("warningDayCount", 6);
        }
    }

    @Override
    public void writeXML(XMLPrintWriter writer) {
        writer.startTAG(XML_TAG);
        writer.attr("validMonthCount", validMonthCount);
        writer.attr("warningDayCount", warningDayCount);
        writer.end();
    }

    @Override
    public boolean writeResource() throws Exception {
        return GeneralContext.getEnvProvider().writeResource(ExpirationConfigManager.getProviderInstance());
    }

    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

调用方式

int count = ExpirationConfigManager.getProviderInstance().getWarningDayCount();
  • No labels