You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 4
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();
保存信息
通过下面的方式,就可以把内存中信息保存到xml文件下了:
ExpirationConfigManagerProvider configManager = ExpirationConfigManager.getProviderInstance();
configManager.setWarningDayCount(warningCount);
configManager.setValidMonthCount(month);
FRContext.getCurrentEnv().writeResource(configManager);
注册到插件中
<extra-core>
<XMLFileManagerProvider class="com.fr.plugin.demo.ExpirationConfigManager">
</extra-core>