org.apache.log4j.NDC 类中所有的方法都是静态的。假设 NDC 日志输出功能被打开,每一次的日志请求,Log4J 组件都会把当前线程的整个 NDC 堆栈内容输出在日志条目中。这样的过程不需要开发人员写过多的代码,程序员只需要在代码中合适的地方通过 push 和 pop 方法将正确的信息放到 NDC 的堆栈中,然后通过修改 Log4J 的配置文件,指定用户标志信息输出的位置和格式,而原来 Java 代码中输出日志的代码不需要任何修改,就能够输出带有用户标志信息的日志 MDC 和 NDC 相似,也可以减少多线程的系统为每个客户单独记录日志的系统开销。它同样是为每个线程建立一个独立的存储空间,开发人员可以根据需要把信息存入其中。不同的是 MDC 使用 Map 的机制来存储信息,信息以 key/value 对的形式存储在 Map 中. 通过为 Web 应用的 Servlet 增加一个 filter 的方法,将用户标志信息在 filter 中压入/弹出 NDC 堆栈,而不需要修改任何原来的 Java 程序中的输出日志的代码,使用起来非常简便。
package is.dsw.base.filter; import javax.servlet.Filter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.log4j.NDC; public class Log4jNdcFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 获得客户的网络地址 String address = request.getRemoteAddr(); // 把网络地址放入NDC中. 那么在在layout pattern 中通过使用 %x,就可在每条日之中增加网络地址的信息. NDC.push(address); //继续处理其他的filter链. chain.doFilter(req, res); // 从NDC的堆栈中删除网络地址. NDC.pop(); } } 服务没在管控平台上找到的原因: 1.暴露接口的对应的类没加service注解,service注解使用的是spring框架的 2、sar配置文件中sar.list的包名配错,导致扫描包的时候没找到对应暴露的接口以至于没注册到dubbo的注册中心 3.新框架FcsService注解只能写在继承fcsBaseService类里面,否则服务发布不成功 新建DB版本需首移才可进行脚本移交 less 文件名 shift+j键退到最后 grep -i '判断ok' tm_ff-batchc-008SF16772.out 查找包含某字符的 对于密码防重放,一般重要的是要求密码串一次性有效,对比时间戳是否相同,而不是对比间距。 1.比如我第一个请求带的时间戳是10000000,服务器接收到之后,对比下与当前时间是不是在合理范围内,比如五分钟(这个可以根据业务场景看,一般一个请求从客户端到服务器不超过多少分钟,考虑网络阻塞情况。) 2.如果时间在正常范围内,认为这是一个合法请求,将这次的请求时间录入数据库。 3.当我再次收到请求时,从数据库取出上次请求时间进行对比,如果请求2和请求1的时间是一样的,那说明它是重放的数据包,非法请求。(正常来说,即使用户误点两次,两次请求的时间也是不一样的) 短信发送规则: 一、 触发临时动态密码失败,令牌正处于锁定状态或者临时动态密码认证失败,令牌是锁定状态 一般默认同一个手机号码在同一个策略连续失败5次,令牌锁定30分钟~具体配置和你们申请接入的申请表配置有关~ 用户验证错误次数达到一定(默认是5次),默认是锁定30分钟,30分钟后自动解锁,具体看你们策略配置。 成为项目经理 1.进一步完善自己的管理思维体系 2.丰富自己的知识库,传递知识给更多人 3.能够独挡一面完成整个项目任务 1.熟悉现有工作 2.参加PMP培训 1.熟悉公司现有所有产品业务流程,并整理成文档共享 2.参加PMP培训,项目管理能力达到新层次 3.提高沟通交往能力,记录沟通改进计划 4.经验总结,针对每次项目过程中遇到的问题吸取教训总结经验 5.多与同事沟通学习,持续的学习新技术,丰富自己的知识体系 报备问题时说明背景原因及具体情况 项目安排计划不合理,没考虑充分,不应都按照行方的计划来,开始要做好合理的计划安排 测试测的不充分,需要考虑到所有场景 怎么建立影响力 怎么提升自己的管理能力水平 怎么准确描述自己所要表达的 业务分析能力水平 ESB到BSP调用过程: account调用esb-api,esb-api将消息写到kafa中,esb-consumer从kafa中读取消息并分析去调用esb-proxy哪个请求,然后esb-proxy通过dubbo服务调用bsp Linux命令: 查看内存:free -h 或free -m top:统计实时的运行中的程序的资源使用情况 vmstat:显示实时的和平均的统计 netstat -an :查看当前计算机端口使用情况 ps -ef | grep tomcat:查看进程 ps -aux |grep tomcat:查看tomcat的占用情况 netstat -apn | grep 20882:查看20882端口被哪个程序占用 mstcs:远程桌面命令 ps aux:查看当前执行的进程及执行用户 ps -ef|grep QuorumPeerMain:查看zk进程 高亮显示日志:按“/”+刚刚复制的日志编号,回车,在按shift+”:”,输入set+空格+hlsearch,这个时候所有的日志编号都会高亮显示了 用ctrl+F 向下移动光标,ctrl+B向上移动光标 回车后光标会指向第一条查询数据,点击N键会向下继续查询该数据 sftp服务器登录:sftp -oPort=60022 pinganjinrong@124.74.239.215 sftp文件获取下载:get 【文件名】 用该命令之后文件保存到你登陆前所在的那个目录 Oracle导库相关命令,其中文件名大家可以自行修改 --导出 EXP dba用户/密码@实例名 BUFFER=64000 FILE=你的目录\collection.dmp OWNER=dba用户 rows=y log=你的目录\实例名_exp.log compress=n --创建表空间 --create tablespace whtest_SP datafile '你的目录\test_SP.dbf' size 1024m autoextend on next 1024m maxsize unlimited; ----新建用户 create user test1 identified by test1 default tablespace test_SP temporary tablespace temp profile DEFAULT; grant dba to test1;//管理权限 --导入 imp test1/test1@whtest file=你的目录\whtest.dmp log=C:\Users\pactera-db\Desktop\新建文件夹\DMP\metadata_IMP.log ignore=y full=y; spring定时任务 startdelay----------调度工厂实例化后经过几秒开始执行调度 repeatInterval------每几秒调度一次 cronExpression------cron表达式,标识每天几点运行一次,支持到指定时间运行一次 指定时刻的日志输出: cat *.log | grep 18:18:50 | sort 修改字符编码 vi /etc/sysconfig/i18n LANG="en_US" SYSFONT="latarcyrheb-sun16" 通过跳板机登录远程电脑: 远程登录密令:mstsc 输入ts选择85那台机器用UM账号登录 开发环境调用esb接口从本地127.0.0.1地址进行查找导致返回没有提供者,解决方法:进入对应的组件的tomcat的Bin目录下面的catalina.sh文件中加入如下-Dff.env=dev -Dff.esb.url=172.25.244.64:20882到该文件中去然后重启 JAVA_OPTS="-Xms512m -Xmx512m -Xss1024K -XX:PermSize=64m -XX:MaxPermSize=128m -Dff.env=dev -Dff.esb.url=172.25.244.64:20882" 开发环境编码问题: 修改tomcat bin目录中catalina.sh 的jvm配置 添加如下配置: -Ddefault.client.encoding=GBK -Dfile.encoding=GBK -Duser.language=Zh 打印GC信息: 在eclipse.ini中加入如下配置 -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -verbose:gc -Xloggc:gc.log GC日志说明: GC打印时间: [垃圾回收类型回收时间: [收集器名称: 年轻代回收前占用大小->年轻代回收后占用大小(年轻代当前容量), 年轻代局部GC时JVM暂停处理的时间] 堆空间GC前占用的空间->堆空间GC后占用的空间(堆空间当前容量) ,GC过程中JVM暂停处理的时间]。 垃圾回收类型:分为GC和Full GC. GC一般为堆空间某个区发生了垃圾回收, Full GC基本都是整个堆空间及持久代发生了垃圾回收,通常优化的目标之一是尽量减少GC和Full GC的频率。 收集器名称:一般都为收集器的简称或别名,通过收集器名称基本都能判断出那个区发生了GC。 DefNew:年轻代(新生代)发生了GC (若为DefNew可知当前JVM年轻代使用的串行收集器) ParNew:年轻代(新生代)发生了GC (若为ParNew可知当前JVM年轻代使用了并行收集器) Tenured:老年代发生了GC Perm:持久代发生了GC 在eclipse根目录下的eclipse.ini配置文件中添加以下参数: -verbose:gc (开启打印垃圾回收日志) -Xloggc:eclipse_gc.log (设置垃圾回收日志打印的文件,文件名称可以自定义) -XX:+PrintGCTimeStamps (打印垃圾回收时间信息时的时间格式) -XX:+PrintGCDetails (打印垃圾回收详情) 添加完以上参数后当启动Eclipse后就能在Eclipse根目录看到一个eclipse_gc.log的gc日志文件 2、设置eclipse初始堆、非堆内存大小以及年轻代 -Xms50m –Xmx200m -XX:PermSize=30m -XX:MaxPermSize=60m 3、添加JVM监控参数 -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=6688 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 转义符: 也可以将 & 替换成 & amp; 或者 \u0026 或者 \0026 (未测试,可以自己测试下,至少编译不会出错,呵呵) 这里写图片描述 这里写图片描述 4.再出个题: select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate,1) from dual; --加1月 select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual; --加1星期 select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual; --加1天 select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual; --加1小时 select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual; --加1分钟 select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --加1秒 pafa学习笔记 解决条数限制问题方法:sar/ff-xxxx.properties 添加配置 sar.ibatis.enable=false 添加sqlMap配置:sar/xxxx.spring.xml 添加配置: <bean id="_sar_sqlmap_client" class="com.pingan.pafa.pizza.ibatis.PizzaSqlMapClientFactoryBean" lazy-init="true"> <property name="maxRowCount" value="20000"/> <property name="unresolvedConfigLocations" > <list> <value>sar:*.ibatis.xml</value> <value>pizza:/sar/xxxx.ibatis.xml</value> </list> </property> </bean> pafa5-core-5.1.9-beta-20160608183021.jar maxUploadSize 文件上传太大,修改上传文件的大小,在pizza-pafa5-admin.properties中修改admin.upload.file.maxByte字段值 exp system/manager@TEST file=d:\d.dmp full=y zookeeper启动,停止命令: zkServer.sh start:启动 zkServer.sh stop:停止 jps:查看进程 zkServer.sh status:查看状态 tail -500f zookeeper.out :查看输出 unzip dubbo-admin-2.5.3.war -d ROOT:解压并把文件命名为root zookeeper集群安装注意点: 1.先创建3个节点:创建3个节点目录,将包每个目录复制一份 2、编辑节点配置文件conf/zoo.cfg,修改下面配置项: dataDir=/home/wusc/ dataLogDir=/home/wusc/zookeeper/nodezookeeper/node-03/logs03/logs clientPort=2183-------客户端连接zookeeper服务端的端口号,zookeeper会通过这个端口来监听客户端的请求 3.在data目录下创建myid文件,里面存放每个节点的编号值 private static final Pattern ADDRESS_PATTERN = Pattern.compile("^\\d{1,3}(\\.\\d{1,3}){3}\\:\\d{1,5}$"); private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$"); private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$"); 6210985510001215033 134567 --杀进程,解表锁 select o.owner, o.object_type, o.object_name, s.username,s.status,l.*, 'alter system kill session '''||s.sid||','||s.serial#||''';' kill_session from v$locked_object l, dba_objects o,v$session s where l.object_id = o.object_id and l.session_id=s.sid --and o.owner = upper('&owner') and o.object_name = upper('&object_name'); dubbo文件配置:在com.pingan.pafa.papp.protocol.dubbo下面,对应包pafa5-core-5.1.6-beta-20160420103222.jar #######注册中心配置 dubbo.registry.address=${pizzaManager} ##服务注册开关,是否向此注册中心注册服务,如果设为false,将只订阅,不注册 #dubbo.registry.register=true ##服务订阅开关,是否向此注册中心订阅服务,如果设为false,将只注册,不订阅 #dubbo.registry.subscribe=true ###使用文件缓存注册中心地址列表及服务提供者列表,应用重启时将基于此文件恢复,注意:两个注册中心不能使用同一文件存储 #dubbo.registry.file=${r"$"}{pafa.log.home}/${pappName}/dubbo/registry-cache.txt #######监控中心配置 #dubbo.monitor.protocol=registry #######协议配置 #默认使用dubbo,不建议使用RMI/http/Hessian等其它协议,dubbo最高效 dubbo.protocol.name=dubbo #指定暴露服务的端口号,不能使用weblogic的端口,是个新开端口 dubbo.protocol.port=50880 #instanceIp dubbo.protocol.host=${instanceIp} #为保证最大的兼容性serialization设为java dubbo.protocol.serialization=java #用户线程池大小,默认指定为50 dubbo.protocol.threads=50 #######服务公共默认配置,具体参见dubbo相关文档 ##默认消费者调用集群策略:随机 dubbo.service.loadbalance=roundrobin ##默认消费者调用超时时间(10秒) dubbo.service.timeout=10000 ##远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 ##为防止重复请求,建议设为0,此属性与超时时间密切相关 dubbo.service.retries=0 #启动时检查提供者是否有提供者,true报错,false忽略 dubbo.reference.check=false papp文件的属性: papp.sar.list"; papp.protocols"; papp.esa.http.export.enable"; papp.lib.list"; papp.def.charset"; papp.local.home.dir"; papp.web.enable"; papp.common.filter.enable"; papp.jetty.enable"; papp.dubbo.enable"; papp.web.dispatcher"; papp.resources.suffix"; papp.listen.alteration.enable"; fling.monitor.enable"; papp.status"; sar下的文件的属性 sar.base.package"; //是否支持web请求 sar.web.enable"; //处理web请求的优先级 sar.order"; //是否启用ibatis sar.ibatis.enable"; //是否启用quartz sar.quartz.enable"; //是否启用IVY仓库 sar.ivy.enable"; //引用数据源KEY sar.datasource.key"; //组件包 "sar.lib"; //是否启用DB事务支持 sar.transaction.enable"; sar.name"; sar.def.charset"; sar.def.pafa.ac"; sar.aop.enable"; sar.def.datasource"; sar.ex-lib.list"; sar.dispatcher"; sar.local.priority"; dataSource"; sar.esa.def.dispatcher.enable"; sar.esa.annotation.dispatcher.enable"; _sar_dubbo_pafa_ac"; sar.organisation"; sar.version"; 目前框架已支持对返回给前端的错误码及错误信息进行配置转换(抛出异常的方式也可以转换)。 使用方式: 1、升级框架包ff-standard-core到1.5.6或以上 2、在btoam的组件配置文件中进行配置 a.对组件内某个接口生效的配置方式: 接口名.原code=新code,新的错误信息 例如:/work/account/insertReferrer.666666=888888,我的配置信息 b.对整个组件生效的配置方式: 原code=新code,新的错误信息 例如:666666=888888,我的配置信息 补充:需要在ff-btoam.properties配置文件中增加配置项打开开关,默认是关闭的。 ff.msg.transf.enable=true spring提供了一些标志接口,用来改变BeanFactory中的bean的行为。它们包括InitializingBean和DisposableBean。实现这些接口将会导致BeanFactory调用前一个接口的afterPropertiesSet()方法,调用后一个接口destroy()方法,从而使得bean可以在初始化和析构后做一些特定的动作。 在内部,Spring使用BeanPostProcessors 来处理它能找到的标志接口以及调用适当的方法。如果你需要自定义的特性或者其他的Spring没有提供的生命周期行为,你可以实现自己的 BeanPostProcessor。关于这方面更多的内容可以看这里:第 3.7 节“使用BeanPostprocessors定制bean”。 所有的生命周期的标志接口都在下面叙述。在附录的一节中,你可以找到相应的图,展示了Spring如何管理bean;那些生命周期的特性如何改变你的bean的本质特征以及它们如何被管理。 1. InitializingBean / init-method 实现org.springframework.beans.factory.InitializingBean 接口允许一个bean在它的所有必须的属性被BeanFactory设置后,来执行初始化的工作。InitializingBean接口仅仅制定了一个方法: * Invoked by a BeanFactory after it has set all bean properties supplied * (and satisfied BeanFactoryAware and ApplicationContextAware). * <p>This method allows the bean instance to perform initialization only * possible when all bean properties have been set and to throw an * exception in the event of misconfiguration. * @throws Exception in the event of misconfiguration (such * as failure to set an essential property) or if initialization fails. */ void afterPropertiesSet() throws Exception; 注意:通常InitializingBean接口的使用是能够避免的(而且不鼓励,因为没有必要把代码同Spring耦合起来)。Bean的定义支持指定一个普通的初始化方法。在使用XmlBeanFactory的情况下,可以通过指定init-method属性来完成。举例来说,下面的定义: <bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>public class ExampleBean { public void init() { // do some initialization work }} 同下面的完全一样: <bean id="exampleInitBean" class="examples.AnotherExampleBean"/>public class AnotherExampleBean implements InitializingBean { public void afterPropertiesSet() { // do some initialization work }} 但却不把代码耦合于Spring。 2. DisposableBean / destroy-method 实现org.springframework.beans.factory.DisposableBean接口允许一个bean,可以在包含它的BeanFactory销毁的时候得到一个回调。DisposableBean也只指定了一个方法: /** * Invoked by a BeanFactory on destruction of a singleton. * @throws Exception in case of shutdown errors. * Exceptions will get logged but not rethrown to allow * other beans to release their resources too. */ void destroy() throws Exception; 注意:通常DisposableBean接口的使用能够避免的(而且是不鼓励的,因为它不必要地将代码耦合于Spring)。 Bean的定义支持指定一个普通的析构方法。在使用XmlBeanFactory使用的情况下,它是通过 destroy-method属性完成。举例来说,下面的定义: <bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="destroy"/>public class ExampleBean { public void cleanup() { // do some destruction work (like closing connection) }} 同下面的完全一样: <bean id="exampleInitBean" class="examples.AnotherExampleBean"/>public class AnotherExampleBean implements DisposableBean { public void destroy() { // do some destruction work }} 但却不把代码耦合于Spring。