当前位置 : 首页 » 文章分类 :  开发  »  接下来要学习的

接下来要学习的

待深入学习整理的to do list,工作中遇到不懂的想接下来慢慢研究的,会先放到这里。


Java8中lambda表达式无法抛出受检异常

Java中的异常分为两类,受检查异常(Checked Exception)跟非受检异常(UnChecked Exception)。

受检异常表示代码中必须显示的处理该异常,比如try-catch或者在方法声明上加入throws关键字把异常向上抛出。
如果方法中抛出受检异常,则方法上必须加 thorows 异常类型 声明;如果方法中抛出非受检异常,则不必加throows声明。
非受检异常也被称作运行时异常,就像我们常用的RuntimeException,表示代码中可以不进行处理,直白点说就是Java认为这是人为导致的问题,也是可以人为的在编写代码阶段就避免掉的问题。

由Error跟RuntimeException派生出来的类都是非受检异常,也就是运行时异常。其他的异常则问受检异常,主要就是IOException及其子类。

// 抛出非受检异常,编译通过
Stream.of("a", "b", "c").forEach(str -> {
    throw new RuntimeException();
});

// 抛出受检异常,编译失败
Stream.of("a", "b", "c").forEach(str -> {
    throw new IOException();
});

第一个之所以编译通过就是因为它抛出的是非受检异常,只有运行中才会处理,而编译器在编译阶段并不关心,因此没有问题。
第二段代码抛出的是IOException,它是一个受检异常,也就是说编译器强制要求开发人员在编译阶段就要显示的处理该异常,不能留给运行阶段,因此编译不通过。

Java8中lambda表达式无法抛出受检异常的问题
https://www.jianshu.com/p/a3855f880ff2


jvm-sandbox

alibaba/jvm-sandbox
https://github.com/alibaba/jvm-sandbox

JVM-SANDBOX用户手册
https://github.com/alibaba/jvm-sandbox/wiki/USER-GUIDE

JVM-SANDBOX能做什么?
在JVM沙箱(以下简称沙箱)的世界观中,任何一个Java方法的调用都可以分解为BEFORE、RETURN和THROWS三个环节,由此在三个环节上引申出对应环节的事件探测和流程控制机制。

// BEFORE
try {

   /*
    * do something...
    */

    // RETURN
    return;

} catch (Throwable cause) {
    // THROWS
}

基于BEFORE、RETURN和THROWS三个环节事件,可以完成很多类AOP的操作。

  1. 可以感知和改变方法调用的入参
  2. 可以感知和改变方法调用返回值和抛出的异常
  3. 可以改变方法执行的流程
    • 在方法体执行之前直接返回自定义结果对象,原有方法代码将不会被执行
    • 在方法体返回之前重新构造新的结果对象,甚至可以改变为抛出异常
    • 在方法体抛出异常之后重新抛出新的异常,甚至可以改变为正常返回

mybatis获取插入数据的主键selectkey用法

MyBatis获取插入数据主键
https://www.jianshu.com/p/5e7ee487dd78

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
   insert into user(userName,password,comment)
   values(#{userName},#{password},#{comment})
</insert>

Mybatis获取插入记录的自增长ID
https://my.oschina.net/wangrikui/blog/510189

@Insert("insert into Demo(name,password) values(#{name},#{password})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")

71.mybatis 如何获取插入的id【从零开始学Spring Boot】
http://412887952-qq-com.iteye.com/blog/2314219

@insert 注解返回主键

步骤有三:

  1. 写 SQL,但不要自己插入主键值
  2. 配置@Options(useGeneratedKeys=true, keyProperty=”对象.属性”) 这个的作用是设置是否使用 JDBC 的getGenereatedKeys()方法获取主键并赋值到 keyProperty 设置的对象的属性中,说白了就是把自增长的主键值赋值给对象相应的属性
  3. 在插入后,使用对象.主键属性的getXXId()方法 获取主键值

示例:

@Insert("INSERT INTO api(component, clientApi, scribeDescribe, clientApiVersion, invokeTimeout, authType, sessionRequire, openType) VALUES(#{api.component}, #{api.clientApi}, #{api.scribeDescribe}, #{api.clientApiVersion}, #{api.invokeTimeout}, #{api.authType}, #{api.sessionRequire}, #{api.openType})")
@Options(useGeneratedKeys = true, keyProperty = "api.apiId")
void add(@Param("api") Api api);

然后调用 api.getApiId()即可

mybatis 注解 insert 返回主键
http://bbs.itmayiedu.com/article/1492234758902?p=1&m=0

selectKey子元素 详解                            

作用:在insert元素和update元素中插入查询语句。

其属性如下:
keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中
resultType ,keyPropety所指向的属性类全限定类名或类型别名
order属性 ,取值范围BEFORE|AFTER,指定是在insert语句前还是后执行selectKey操作
statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE

注意:selectKey操作会将操作查询结果赋值到insert元素的parameterType的入参实例下对应的属性中。并提供给insert语句使用

MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
https://www.cnblogs.com/fsjohnhuang/p/4078659.html


spring/boot/cloud

springcloud配置中心允许本地覆盖

# 允许本地配置覆盖远程配置
spring.cloud.config.allowOverride=true
# 允许本地配置文件或环境变量覆盖远程配置项
spring.cloud.config.overrideNone=true

spring boot 配置中心

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

spring cloud consul安装

http://www.cnblogs.com/xishuai/p/macos-ubuntu-install-consul.html

切面中获取HttpServletRequest

Spring-boot 配置Aop获取controller里的request中的参数以及其返回值
https://blog.csdn.net/jiaobuchong/article/details/50420379

Spring Aspect获取request和response
https://blog.csdn.net/kid_2412/article/details/52180657

知哥说RequestContextHolder是跨线程的,但我在新开的线程池中无法获取request,在新开线程之前就可以成功获取request,就靠下面两条语句:
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
然后在新开的线程中直接从request中取值即可:
String requestId = (String) request.getAttribute(HttpConstants.REQUEST_ID);

spring隔离级别Isolation枚举

package org.springframework.transaction.annotation;

public enum Isolation {
    DEFAULT(-1),
    READ_UNCOMMITTED(1),
    READ_COMMITTED(2),
    REPEATABLE_READ(4),
    SERIALIZABLE(8);

    private final int value;

    private Isolation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }
}

Spring/事务/AOP/自调用

@Transactional不起作用

配置正确的前提下,出现事务不起作用的原因:
1、同一个类中, 一个非transactional的方法去调用transactional的方法, 事务会失效
当本类的使用@Transactional的方法被本类的其它没有开启事务的方法调用时,不会开启事务。使用@Transactional的方法被其它类调用时,按照正常的事务传播行为规则开启事务
If you use (default) Spring Proxy AOP, then all AOP functionality provided by Spring (like @Transational) will only be taken into account if the call goes through the proxy. – This is normally the case if the annotated method is invoked from another bean.

2、异常被try{}catch(){}捕捉到了,有异常就不会回滚。

3、在private方法上标注transactional, 事务无效
When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.

Spring 下默认事务机制中@Transactional 无效的原因
https://www.cnblogs.com/milton/p/6046699.html

@transactional自调用问题

在 Spring 的 AOP 代理下,只有目标方法由外部调用,目标方法才由 Spring 生成的代理对象来管理,这会造成自调用问题。若同一类中的其他没有@Transactional 注解的方法内部调用有@Transactional 注解的方法,有@Transactional 注解的方法的事务被忽略,不会发生回滚。

如果同一个类中有方法:methodA(); methodB()。methodA()没有开启事务,methodB()开启了事务
且methodA()会调用methodB()。
那么,methodA()调用methodB()时,不会开启事务!!!
即:同一个类中,无事务的方法调用有事务的方法,结果就是没有事务!!!

spring事务@Transactional在同一个类中的方法调用不生效
https://www.jianshu.com/p/2e4e1007edf2

spring声明式事务 同一类内方法调用事务失效
https://blog.csdn.net/aya19880214/article/details/50640596

透彻的掌握 Spring 中@transactional 的使用
https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html

spring 同类内调用不触发aop

spring aop 嵌套调用的问题 (同一方法内调用切面切不到)
http://blog.51cto.com/huqilong/732088

解决方法:自注入

spring Aop嵌套调用的解决办法:
方法1,将自身注入到自身
方法2,使用AopContext.currentProxy())来操作

弄懂了上面的分析, 那么解决这个问题就十分简单了. 既然 test() 方法调用没有触发 AOP 逻辑的原因是因为我们以目标对象的身份(target object) 来调用的, 那么解决的关键自然就是以代理对象(proxied object)的身份来调用 test() 方法.
因此针对于上面的例子, 我们进行如下修改即可:

@Service
public class SomeService {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private SomeService self;

    public void hello(String someParam) {
        logger.info("---SomeService: hello invoked, param: {}---", someParam);
        self.test();
    }

    @CatMonitor
    public void test() {
        logger.info("---SomeService: test invoked---");
    }
}

上面展示的代码中, 我们使用了一种很 subtle 的方式, 即将 SomeService bean 注入到 self 字段中(这里再次强调的是, SomeService bean 实际上是一个代理对象, 它和 this 引用所指向的对象并不是同一个对象), 因此我们在 hello 方法调用中, 使用 self.test() 的方式来调用 test() 方法, 这样就会触发 AOP 逻辑了.

在同一个类中调用另一个方法没有触发 Spring AOP 的问题
https://segmentfault.com/a/1190000008379179

spring Aop嵌套调用的解决办法
https://blog.csdn.net/hl_java/article/details/79445799

spring aop类内部调用不拦截原因及解决方案
https://blog.csdn.net/dream_broken/article/details/72911148


Java

java保留double两位小数BigDecimal

double d = 1.000;
BigDecimal bd=new BigDecimal(d);
double d1=bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d1);
输入结果:1.0

若double d=0,输出结果为0.0;
若double d=1.999,输出结果为2.0;
若double d=1.89,输出结果为1.89;

总结:使用这种写法若小数点后均为零,则保留一位小数,并且有四舍五入的规则。

Java小数点位数保留
https://www.jianshu.com/p/00fff555986b

Java保留两位小数的几种写法总结
https://www.jb51.net/article/98049.htm

Unix时间戳转Java Date

Java中的Date保存的是毫秒时间戳

long batch_date = 1532697328;
Date dt = new Date (batch_date * 1000L);

SimpleDateFormat sfd = new SimpleDateFormat(“dd-MM-yyyy HH:mm:ss”);
System.out.println(sfd.format(dt));

遍历的同时修改hashmap

Java HashMap 如何正确遍历并删除元素
https://www.cnblogs.com/zhangnf/p/HashMap.html

Java 8新特性终极指南

Java 8新特性终极指南
https://wizardforcel.gitbooks.io/java8-tutorials/content/Java%208%20%E6%96%B0%E7%89%B9%E6%80%A7%E7%BB%88%E6%9E%81%E6%8C%87%E5%8D%97.html

Java 8 习惯用语,第 1 部分 Java 中的一种更轻松的函数式编程途径(IBM developerworks)
https://www.ibm.com/developerworks/cn/java/j-java8idioms1/index.html

java正则表达式匹配手机号

匹配 86-11位手机号

package com.nio.uds.common.aspect;
import java.util.regex.Pattern;
public class test {
    public static void main(String[] args){
        String mobileRegExp = "^([0-9][0-9])-[0-9]{11}";
        Pattern p = Pattern.compile(mobileRegExp);
        System.out.println(p.matcher("68-1367151121").matches());
    }
}

Java 正则表达式
http://www.runoob.com/java/java-regular-expressions.html

java正则表达式匹配邮箱地址

public static boolean isEmail(String string) {
        if (string == null)
            return false;
        String regEx1 = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
        Pattern p;
        Matcher m;
        p = Pattern.compile(regEx1);
        m = p.matcher(string);
        if (m.matches())
            return true;
        else
            return false;
    }

java判断邮箱是否合法
https://blog.csdn.net/u012934325/article/details/73558084
Java邮箱正则表达式
http://stevenjohn.iteye.com/blog/1058739

ConcurrentSkipListMap跳表

【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentSkipListMap
http://cmsblogs.com/?p=2371

java 不同系统下的行分隔符如何获得

据我所知,windows下的文本文件换行符:\r\n
linux/unix下的文本文件换行符:\r
Mac下的文本文件换行符:\n

那么在java中得到换行符要怎么得到呢?我们可以根据该方法(System.lineSeparator())来判断,只是jdk必须在1.7以上;
String line = System.lineSeparator();

java代码获取在不同系统下的换行符
https://blog.csdn.net/ABCDabcdefghijklmn/article/details/53507315

bean Validation发生在进入方法之前

泛型

Java 泛型,你了解类型擦除吗?
https://blog.csdn.net/briblue/article/details/76736356


数据库

外键缺少索引引发的死锁

外键缺少索引引发的死锁(Oracle)
https://blog.csdn.net/hotdust/article/details/51258965

谈谈我对MySQL外键字段必须索引的一些理解
https://blog.csdn.net/sweeper_freedoman/article/details/61426736

查看mysql隔离级别

show variables like ‘%isolation%’

upsert是什么?

UPSERT是INSERT, ON CONFLICT UPDATE的简写,简而言之就是:插入数据,正常时写入,主键冲突时更新。

PostgreSQL 9.5 发布,带来 UPSERT 等新特性
http://www.phperz.com/article/16/0108/181548.html

Hikali数据库连接池

Springboot 2.0选择HikariCP作为默认数据库连接池的五大理由
http://blog.didispace.com/Springboot-2-0-HikariCP-default-reason/

数据库连接池大小设置

【追光者系列】Hikari连接池大小多大合适?(第一弹)
https://juejin.im/post/5ad44c9b6fb9a028d70112e0

【追光者系列】Hikari连接池大小多大合适?(第二弹)
https://juejin.im/post/5ad44d716fb9a028bd4cc8f7

mysql 事务死锁分析

mysql死锁-查询锁表进程-分析锁表原因
https://blog.csdn.net/lin443514407lin/article/details/56489587

【MySQL】mysql死锁以及死锁日志分析
https://segmentfault.com/a/1190000009469556

Deadlock found when trying to get lock; try restarting transaction

org.springframework.dao.DeadlockLoserDataAccessException:
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
### The error may involve com.nio.uds.mariadb.mapper.SpOrderContractMapper.updateByPrimaryKey-Inline
### The error occurred while setting parameters
### SQL: update sp_order_contract     set order_no = ?,       short_url = ?,       contract_template_id = ?,       contract_name = ?,       contract_file_id = ?,       status = ?,       sign_online = ?,       sign_time = ?,       create_time = ?,       update_time = ?     where id = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; SQL []; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:263) ~[spring-jdbc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at com.sun.proxy.$Proxy142.update(Unknown Source) ~[?:?]
    at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:295) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:59) ~[mybatis-3.4.0.jar:3.4.0]
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) ~[mybatis-3.4.0.jar:3.4.0]
    at com.sun.proxy.$Proxy196.updateByPrimaryKey(Unknown Source) ~[?:?]
    at com.nio.uds.sales.service.ServicePackageService.upsertOrderContract(ServicePackageService.java:542) ~[classes/:?]
    at com.nio.uds.sales.service.ServicePackageService.upsertInvoice(ServicePackageService.java:972) ~[classes/:?]
    at com.nio.uds.sales.service.ServicePackageService$$FastClassBySpringCGLIB$$e1bef1b8.invoke(<generated>) ~[classes/:?]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at com.nio.uds.sales.service.ServicePackageService$$EnhancerBySpringCGLIB$$c21783d6.upsertInvoice(<generated>) ~[classes/:?]
    at com.nio.uds.sales.service.SpServiceWrapper.upsertInvoice(SpServiceWrapper.java:40) ~[classes/:?]
    at com.nio.uds.sales.service.SpServiceWrapper$$FastClassBySpringCGLIB$$78a1b747.invoke(<generated>) ~[classes/:?]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:97) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE]

查看mysql死锁日志

show engine innodb status;

------------------------
LATEST DETECTED DEADLOCK
------------------------
2018-07-17 07:27:40 2b68a2217700
*** (1) TRANSACTION:
TRANSACTION 4436819194, ACTIVE 4 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 6 lock struct(s), heap size 1184, 3 row lock(s), undo log entries 2
MySQL thread id 9236377, OS thread handle 0x2b68a6e48700, query id 6500593038 10.125.23.56 root updating
update sp_order_invoice_enterprise
    set order_no = '818881531461924476',
      name = '蔚来汽车',
      org_code = '123456',
      usc_code = null,
      tax_code = 'dhdhdhdhdhdhdhdh12',
      city_id = 310100,
      city = '上海市',
      address = '还是gegn1',
      vat_type = 1,
      bank_name = '282828289',
      bank_account = '28282828',
      email = '2828@163.com',
      phone_number = '17673637860',
      create_time = '2018-07-13 14:05:25',
      update_time = '2018-07-17 15:27:36'
    where id = 1359
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1011 page no 20 n bits 184 index `PRIMARY` of table `uds`.`sp_order_invoice_enterprise` trx table locks 3 total table locks 2  trx id 4436819194 lock_mode X locks rec but not gap waiting lock hold time 4 wait time before grant 0
*** (2) TRANSACTION:
TRANSACTION 4436816789, ACTIVE 9 sec starting index read
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 1
MySQL thread id 9236819, OS thread handle 0x2b68a2217700, query id 6500594658 10.111.154.206 root updating
update sp_order_contract
    set order_no = '818881531461924476',
      short_url = 'B4xhaz',
      contract_template_id = '2018-07-13-c2f4bfb0a66c46828b2f50e8f10fb465',
      contract_name = '服务套餐协议',
      contract_file_id = null,
      status = 2,
      sign_online = 1,
      sign_time = null,
      create_time = '2018-07-13 14:05:25',
      update_time = '2018-07-17 15:27:36'
    where id = 4576
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1011 page no 20 n bits 184 index `PRIMARY` of table `uds`.`sp_order_invoice_enterprise` trx table locks 2 total table locks 2  trx id 4436816789 lock_mode X locks rec but not gap lock hold time 4 wait time before grant 0
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 909 page no 64 n bits 200 index `PRIMARY` of table `uds`.`sp_order_contract` trx table locks 2 total table locks 2  trx id 4436816789 lock_mode X locks rec but not gap waiting lock hold time 0 wait time before grant 0
*** WE ROLL BACK TRANSACTION (2)

如何查看MySQL数据库的死锁日志
http://825635381.iteye.com/blog/2339503


log4j2

聊一聊log4j2配置文件log4j2.xml
http://www.cnblogs.com/hafiz/p/6170702.html

Log4j2配置文件详解
https://www.cnblogs.com/yudar/p/5113655.html

官方xml配置参考

Configuration Syntax - Strict XML
https://logging.apache.org/log4j/2.x/manual/configuration.html#XML

Log4j2 自动配置刷新

When configured from a File, Log4j has the ability to automatically detect changes to the configuration file and reconfigure itself. If the monitorInterval attribute is specified on the configuration element and is set to a non-zero value then the file will be checked the next time a log event is evaluated and/or logged and the monitorInterval has elapsed since the last check. The example below shows how to configure the attribute so that the configuration file will be checked for changes only after at least 30 seconds have elapsed. The minimum interval is 5 seconds.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
...
</Configuration>

Automatic Reconfiguration
https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticReconfiguration

不同环境设置不同日志级别

修改启动脚本,针对不同环境给变量LOG_LEVEL设置不同的值,然后通过jvm参数传入,log4j2.xml配置文件中读取此jvm参数来设置日志级别

#!/bin/bash

if [ $# != 1 ]; then
    exit 1
fi

BASE_DIR=$(cd "$(dirname "$0")/..";pwd)
cd $BASE_DIR

if [[ -f relation.pid ]]; then
    kill -9 `cat relation.pid`
    rm -f relation.pid
fi

JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
if [ "$1" == "dev" ]; then
    JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
    LOG_LEVEL="info"
elif [ "$1" == "test" ]; then
    JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
    LOG_LEVEL="info"
elif [ "$1" == "staging" ]; then
    JVM_PARAMS="-Xmn2g -Xms5g -Xmx5g"
    LOG_LEVEL="info"
elif [ "$1" == "prod" ]; then
    JVM_PARAMS="-Xmn2g -Xms5g -Xmx5g"
    LOG_LEVEL="info"
fi

[ -f $BASE_DIR/conf/swc-uds-*-log.yml ] &&   ls -l /etc/filebeat.d/ || exit 1
cp $BASE_DIR/conf/swc-uds-*-log.yml /etc/filebeat.d
filebeat.sh -configtest -e
systemctl restart filebeat

nohup java $JVM_PARAMS -jar \
        -Dspring.profiles.active=$1 \
        -Dspring.config.location=classpath:/application-base.yml,classpath:/application.yml \
        -Djava.security.auth.login.config=$BASE_DIR/conf/kafka.conf \
        -Dlog.level=$LOG_LEVEL \
        -XX:+UseConcMarkSweepGC  \
        -XX:+UseParNewGC \
        -XX:+PrintGCDetails \
        $BASE_DIR/bin/relation.jar >/dev/null 2>&1 &

echo $! > relation.pid
python $BASE_DIR/bin/health_check.py $1

然后log4j2.xml中

<configuration>
... ...

<loggers>
  <AsyncRoot level="${sys:log.level}" includeLocation="true">
    <appenderref ref="Console"/>
    <appenderref ref="RollingRandomAccessFile"/>
    <appenderref ref="RollingRandomAccessJsonFormatFile"/>
  </AsyncRoot>
</loggers>
</configuration>

Additivity

《Log4j 2 官方文档》多余性(Additivity)
http://ifeve.com/log4j-2-additivity/

运行中删除日志后无法重新生成

程序运行中将日志文件删除,发现日志文件不能重新生成,导致日志不能记录。
解决方法:
重启服务,就会新生成了
最好不要手动删除,如果是必须的话,那就再原地,新建立一个同名的文件,就行了。
建议,不要直接删除文件,你可以尝试清空文件:
echo “” > x.log

这个和Linux文件系统设计相关,可以这么理解:
log4j open(“log.file”) 之后就取得了一个 file_id这个file_id是和inode关联,你在shell中调用”rm -rf log.file”,只是将 log.file和这个inode的关系断了。但是log4j还是一直在向这个inode写数据,只是没有一个file path和这个inode关联,你再也找不回来了.

类似的问题还有:
进程1: open(“file”) -> write(“xxxx”) -> close();
进程2: open(“file”) -> write(“yyyy”) -> close();

两个进程打开相同的文件 “file”, 同时向文件写不同的内容.

你会发现那个最后close(),就是那个进程的内容.
因为本质上 两个进程在内核层打开了两个inode,各自写各自的. 直到close会重新建立
file path和inode的关系.


其他

git flow工作流

Git工作流指南:Gitflow工作流
https://www.cnblogs.com/jiuyi/p/7690615.html

GitHub ranking

中国区follow排行榜
http://githubrank.com/

GitHub 全球 Developers, Organizations and Repositories 排行榜 - diycode
https://www.diycode.cc/trends

GitHub中国开发者星榜
排名依据为开发者在某种编程语言上的所有项目(repo)所收获的星星(star)总数
对涉及多种编程语言的项目(repo),以GitHub认定的首要编程语言(primary language)为准
排名只针对个人(user)用户,不包括机构(organization)用户
http://githuber.cn/rank

阿里巴巴Java开发手册

alibaba/p3c
https://github.com/alibaba/p3c

阿里规范IDEA插件

IntelliJ IDEA 插件 阿里巴巴Java开发手册(Alibaba Java Coding Guidelines)
https://blog.csdn.net/qq_27093465/article/details/78338932?utm_source=gold_browser_extension

SpringBoot+Mybatis+thymeleaf博客

http://13blog.site/
My Blog是由Docker+SpringBoot+Mybatis+thymeleaf等技术实现的Java博客系统,博客模板是@biezhi大神的开源项目tale,本来是一个docker和springboot的实战练习项目,目前已经开源,功能齐全、部署简单及完善的代码
https://github.com/ZHENFENG13/My-Blog

谈谈服务限流算法的几种实现

令牌桶算法
通过Google开源的guava包,我们可以很轻松的创建一个令牌桶算法的限流器。
通过RateLimiter类的create方法,创建限流器。

RateLimiter rateLimiter = RateLimiter.create(10);

谈谈服务限流算法的几种实现 - 占小狼的博客
https://mp.weixin.qq.com/s/zs6rkSmGeTzS5IgaqULFlA

线程并发级别

并发级别主要分为阻塞、无饥饿、无障碍、无锁、无等待几种。

Java并发编程中很重要的概念以及并发级别解析
https://www.jianshu.com/p/927d638d2544

并发级别
https://blog.csdn.net/Dustin_CDS/article/details/79368978

elasticsearch logstash kibana EKI技术栈

ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
https://my.oschina.net/itblog/blog/547250

ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程
https://blog.csdn.net/qq_36864672/article/details/79238627

美团监控框架CAT

深度剖析开源分布式监控CAT
https://tech.meituan.com/CAT_in_Depth_Java_Application_Monitoring.html

LAMP

LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:

Linux,操作系统
Apache,网页服务器
MariaDB或MySQL,数据库管理系统(或者数据库服务器)
PHP、Perl或Python,脚本语言

mvn install是干啥的

安装
brew install consul
启动
consul agent -dev
访问
http://127.0.0.1:8500/ui/#/dc1/services

Bearer token

OAuth 2.0: Bearer Token Usage
https://www.cnblogs.com/XiongMaoMengNan/p/6785155.html


上一篇 Java-开源库与新技术

下一篇 iTerm2使用笔记

阅读
5,635
阅读预计26分钟
创建日期 2018-07-15
修改日期 2018-10-31
类别
标签
目录
  1. Java8中lambda表达式无法抛出受检异常
  2. jvm-sandbox
  3. mybatis获取插入数据的主键selectkey用法
    1. @insert 注解返回主键
    2. selectKey子元素 详解                            
  4. spring/boot/cloud
    1. springcloud配置中心允许本地覆盖
    2. spring boot 配置中心
    3. spring cloud consul安装
    4. 切面中获取HttpServletRequest
    5. spring隔离级别Isolation枚举
  5. Spring/事务/AOP/自调用
    1. @Transactional不起作用
    2. @transactional自调用问题
    3. spring 同类内调用不触发aop
    4. 解决方法:自注入
  6. Java
    1. java保留double两位小数BigDecimal
    2. Unix时间戳转Java Date
    3. 遍历的同时修改hashmap
    4. Java 8新特性终极指南
    5. java正则表达式匹配手机号
    6. java正则表达式匹配邮箱地址
    7. ConcurrentSkipListMap跳表
    8. java 不同系统下的行分隔符如何获得
    9. bean Validation发生在进入方法之前
    10. 泛型
  7. 数据库
    1. 外键缺少索引引发的死锁
    2. 查看mysql隔离级别
    3. upsert是什么?
    4. Hikali数据库连接池
    5. 数据库连接池大小设置
    6. mysql 事务死锁分析
    7. Deadlock found when trying to get lock; try restarting transaction
    8. 查看mysql死锁日志
  8. log4j2
    1. 官方xml配置参考
    2. Log4j2 自动配置刷新
    3. 不同环境设置不同日志级别
    4. Additivity
    5. 运行中删除日志后无法重新生成
  9. 其他
    1. git flow工作流
    2. GitHub ranking
    3. 阿里巴巴Java开发手册
    4. 阿里规范IDEA插件
    5. SpringBoot+Mybatis+thymeleaf博客
    6. 谈谈服务限流算法的几种实现
    7. 线程并发级别
    8. elasticsearch logstash kibana EKI技术栈
    9. 美团监控框架CAT
    10. LAMP
    11. mvn install是干啥的
    12. Bearer token
百度推荐