Netsharp配置文件
一、总体说明
netsharp下需要配置的项目一般是需要独立启动的项目,主要有四个
- netsharp-web
- netsharp-test
- netsharp-elephant
- netsharp-donkey
其实每个项目都可能独立启动,一般的项目都会有自己的测试项目,所以这个时候也需要配置文件
配置文件同源代码一起管理,开始的时候配置文件直接放在上面四个项目里,会有以下几个问题
- 多个项目配置文件经常不一致,混乱
- 每个开发人员本地的配置不一样提交代码的时候经常有人把自己的配置提交到服务器,引起代码冲突
- 每个人经常修改配置文件提交之后配置文件被改的乱七八糟
针对上面几个问题,netsharp的配置文件是放在netsharp的顶级文件夹下的conf目录,代码下载之后开发人员把配置文件复制到项目下使用,同时在git的项目设置配置文件目录为ignore即可
对于生产环境、测试环境、部署运维的时候专门把配置文件放在服务器上,部署复制一下即可,这样也保证了配置账号的安全性
二、netsharp的配置文件
netsharp目前一共用到5个配置文件,他们的目录结构如下,一下以netsharp-web项目为例
|--netsharp-web
|--src/main/java
|--src/main/resources
|--log4j.properties
|--conf
|--communication.properties
|--configuration.properties
|--database.properties
|--redis.properties
三、netsharp配置文件读取
配置文件读取比较简单,首先有一个配置文件读取的基类,主要的方法是deserialize,用于读取配置文件
package org.netsharp.application; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List; import org.netsharp.core.NetsharpException;
import org.netsharp.core.convertor.ITypeConvertor;
import org.netsharp.core.convertor.TypeConvertorFactory;
import org.netsharp.util.PropertyConfigurer;
import org.netsharp.util.ReflectManager;
import org.netsharp.util.StringManager; public class ApplicationConfiguration { public void deserialize() { Class<?> type = this.getClass(); Configuration confile = type.getAnnotation(Configuration.class);
if (confile == null) {
throw new NetsharpException("类上必须标注@Configuration:" + type.getName());
} PropertyConfigurer conf = PropertyConfigurer.newInstance(confile.file()); Field[] fields = ReflectManager.getDeclaredFields(type);
for (Field field : fields) {
this.parseField(conf, field);
}
} private void parseField(PropertyConfigurer conf, Field field) { ConfigurationItem item = field.getAnnotation(ConfigurationItem.class);
if (item == null) {
return;
} String value = conf.get(item.key());
if (StringManager.isNullOrEmpty(value)) {
value = item.defaultValue();
} ITypeConvertor convertor = TypeConvertorFactory.create(field.getType());
if (convertor == null) {
throw new NetsharpException("can't read " + item.key());
}
Object propertyValue = convertor.fromString(value); try {
field.setAccessible(true);
field.set(this, propertyValue);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new NetsharpException("can't read " + item.key(), e);
} if (field.getType().isEnum() && propertyValue == null) {
throw new NetsharpException(item.key() + "配置不正确,配置的值为:" + value);
}
} @Override
public String toString() { Class<?> type = this.getClass();
List<String> ss = new ArrayList<String>(); Field[] fields = ReflectManager.getDeclaredFields(type);
for (Field field : fields) {
ConfigurationItem item = field.getAnnotation(ConfigurationItem.class);
if (item == null) {
continue;
} try {
ss.add(field.getName() + " : " + field.get(this).toString());
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
} return StringManager.join(StringManager.NewLine, ss);
}
}
以configuration.properties为例子,看缓存类型(org.netsharp.panda.session.cache)的读取方式,他在PandaConfiguration类中
package org.netsharp.panda.core; import org.netsharp.application.ApplicationConfiguration;
import org.netsharp.application.Configuration;
import org.netsharp.application.ConfigurationItem;
import org.netsharp.cache.base.dict.CacheType; @Configuration(file = "conf/configuration.properties")
public class PandaConfiguration extends ApplicationConfiguration { private static PandaConfiguration instance; /*panda是否启用权限控制*/
@ConfigurationItem(key="org.netsharp.panda.ispermission",defaultValue="true")
private Boolean isPermission; /*panda的session缓存类型*/
@ConfigurationItem(key="org.netsharp.panda.session.cache",defaultValue="none")
private CacheType sessionCacheType; //panda的session时间(分钟)
@ConfigurationItem(key="org.netsharp.panda.session.timeout",defaultValue="30")
private Integer sessionTimtout; public static PandaConfiguration getInstance() { if(instance==null) {
instance = new PandaConfiguration();
instance.deserialize();
} return instance; } public Boolean getIsPermission() {
return isPermission;
} public CacheType getSessionCacheType() {
return sessionCacheType;
} public Integer getSessionTimtout() {
return sessionTimtout;
}
}
一般配置文件读取使用一个Singleton,不同类型的配置对应不同的Singleton,上文中的PandaConfiguration主要是读取关于Panda相关的配置
另外,多个配置类可以读取一个配置文件的内容,这样为了减少配置文件的数量,同时有可以达到配置文件进行分类管理的目的
在netsharp的配置文件中都标注了具体的配置文件的读取类
四、日志配置
日志文件是log4j自己读取的,不是netsharp读取的内容
文件:log4j.properties
netsharp.log.dir=/home/netsharp/logs
#=======================================================================
log4j.rootLogger=DEBUG,stdout,D,E # appender stdout
log4j.appender.stdout.Threshold=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %-5p [%t] %l - %m%n
log4j.appender.stdout.Encoding=UTF-8 # appender D
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.File=${netsharp.log.dir}/log.txt
log4j.appender.D=org.apache.log4j.RollingFileAppender
log4j.appender.D.MaxFileSize=10MB
log4j.appender.D.ImmediateFlush=true
log4j.appender.D.Append=true
log4j.appender.D.MaxBackupIndex=10
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %-5p %l - %m%n
log4j.appender.D.Encoding=UTF-8 # appender E
log4j.appender.E.Threshold=ERROR
log4j.appender.E.File=${netsharp.log.dir}/error.txt
log4j.appender.E=org.apache.log4j.RollingFileAppender
log4j.appender.E.MaxFileSize=10MB
log4j.appender.E.ImmediateFlush=true
log4j.appender.E.Append=true
log4j.appender.E.MaxBackupIndex=10
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %-5p %l - %m%n
log4j.appender.E.Encoding=UTF-8
五、应用程序配置
文件:configuration.properties
#-----------------------------------------------------------------
#see : org.netsharp.application.Application
org.netsharp.name=Netsharp
org.netsharp.packages.scan= #-----------------------------------------------------------------
#see : org.netsharp.organization.entity.AuthorizationConfiguration
#员工重置密码
org.netsharp.authorization.defaultpassword=123456
#用户密码加密盐
org.netsharp.authorization.salt=xxxxxx #-----------------------------------------------------------------
#see : org.netsharp.panda.core.PandaConfiguration
#netsharp是否启用权限控制
org.netsharp.panda.ispermission=true
#panda的session缓存类型
org.netsharp.panda.session.cache=redis
#panda的session时间(分钟)
org.netsharp.panda.session.timeout=30 #-----------------------------------------------------------------
#see : org.netsharp.application.Application
#分布式id配置
org.netsharp.id.datacenterid=1
org.netsharp.id.workid=1
六、数据库配置
文件:database.properties
#see : org.netsharp.cache.service.redis.RedisConnection
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/netsharp?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true
jdbc.username=root
jdbc.database=netsharp
jdbc.password=123456
jdbc.idleConnectionTestPeriod=60
jdbc.connectionTestStatement=select 1
jdbc.idleMaxAge=240
jdbc.maxConnectionsPerPartition=30
jdbc.minConnectionsPerPartition=10
jdbc.partitionCount=2
jdbc.acquireIncrement=5
jdbc.statementsCacheSize=100
jdbc.releaseHelperThreads=3
jdbc.lazyInit =false
七、RPC配置
文件:communication.properties
#base
#see : org.netsharp.communication.core.ConfigurationBase
org.netsharp.communication.host=127.0.0.1
org.netsharp.communication.port=8888
#consumer
#see : org.netsharp.communication.core.CommunicationConfiguration
org.netsharp.communication.protocol=local
#server
#see : org.netsharp.communication.protocol.tcp.container.server.TcpServerConfiguration
org.netsharp.communication.pool.coreSize=200
org.netsharp.communication.pool.maxinumSize=1000
org.netsharp.communication.pool.keepAliveTime=100
八、redis配置
文件:redis.properties
#see : org.netsharp.cache.service.redis.RedisConnection
redis.pool.maxActive=200
redis.pool.maxIdle=100
redis.pool.maxWait=3000
redis.ip=127.0.0.1
redis.port=6379
redis.password=123456
redis.timeout=5000
redis.database=1
redis.disabled=false
redis.cache.first.key=netsharp
Netsharp配置文件的更多相关文章
- Netsharp总体设计
阅读本文请先阅读如下两篇文章 什么是企业软件 Netsharp什么 Netsharp总体设计 1.1 Netsharp终端形式 Netsharp基于.NET平台,支持的产品形态有三种: 北极熊 ...
- NETSHARP的JAVA开发环境配置
一:JAVA配置 1. netsharp使用java1.8/1.7版本,本文使用1.8版本 2.jdk下载地址:http://www.oracle.com/technetwork/java/javas ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- Spring配置文件标签报错:The prefix "XXX" for element "XXX:XXX" is not bound. .
例如:The prefix "context" for element "context:annotation-config" is not bound. 这种 ...
- nginx服务器安装及配置文件详解
nginx在工作中已经有好几个环境在使用了,每次都是重新去网上扒博客,各种编译配置,今天自己也整理一份安装文档和nginx.conf配置选项的说明,留作以后参考.像负载均衡配置(包括健康检查).缓存( ...
- C#开发中使用配置文件对象简化配置的本地保存
C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...
- 使用T4模板生成不同部署环境下的配置文件
在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据目标环境不同而不同.比如在开发环境中,数据 ...
- 配置文件Java读写
今天把配置文件的Bug修复了,总结一下Java配置文件如何读写 配置文件的格式 以.properties后缀结尾,内容不出现空格和双引号 //config.properties Driver=com. ...
随机推荐
- 解决python3.5无法导入cv2.so的问题
问题描述: 在python3.5环境中导入cv2报错,在python2.7中正常.注:命令行的前缀RL_2018HW是python3.5的环境. (RL_2018HW) gordon@gordon-: ...
- cookie.js插件的案例
cookie.js插件的案例: https://github.com/jaywcjlove/cookie.js/blob/master/README.md 文档 api 在这里即可查看用法 ...
- .net mvc 分页
1.分页实体类 public class PageDto { public int PageIndex { get; set; } public int PageSize { get; set; } ...
- BasicConverter 基本数据类型转换器
package cn.ubibi.jettyboot.framework.commons; import com.alibaba.fastjson.JSON; import com.alibaba.f ...
- SAS 评分卡开发模型变量统计及输出
以下代码实现功能: 1.获取10个模型分别使用哪些变量 2.变量所模型使用的次数 3.把上表格输出到EXCEL中 %INCLUDE '00@HEADER.SAS'; %let dir=..\04@Mo ...
- day39数据库之基本数据类型
数据库之数据类型1.数据存储引擎 一个功能的核心部分,回到mysql 核心功能是存储数据 涉及到存储数据的代码 就称之为存储引擎 根据不同的需求 也有着不同的引擎分类 不 ...
- 用python探索和分析网络数据
Edited by Markdown Refered from: John Ladd, Jessica Otis, Christopher N. Warren, and Scott Weingart, ...
- RMI(远程方法调用)入门
这两篇可以入门 http://www.cnblogs.com/ninahan0419/archive/2009/06/25/javarmi.html http://www.cnblogs.com/wx ...
- leetcode98
class Solution { public: vector<int> V; void postTree(TreeNode* node) { if (node != NULL) { if ...
- vuejs如何在服务器部署
title: vuejs如何在服务器部署 date: 2017-10-31 20:41:03 tags: [vue] --- 上传到网站服务器 Vue 是一个 javascript 的前端框架,它是运 ...