0%

10.9

  1. 余杭中医院微信查看检验报告返回不显示条码号问题(华为、小米手机兼容性问题)
  2. 兰溪预约挂号排班未同步(同步服务为开启)

10.10

  1. 需求统计分析维度
    • 2.3、2.5
    • 模块
    • 是否个性化
  2. bug统计分析维度
    • 类型(bug、环境问题、操作问题…..)
    • 处理时间
    • 是否解决
  3. log4j迁移到logback
  4. 接口清单(删除接口详情)、接口方案(接口目的)
  5. 接口预计完成时间,延期原因,完成情况

10.12

  1. 季会 – 数字疗法、人找知识 知识找人、fda

10.13

  1. 上海红房子售前调研、工作量评估
  2. 制度重申
    • 加班 周一、周二、周四 晚7点到9点
    • 请假 提前两天,说明原因
    • 现场问题处理:研发当天要反馈,24H内要处理,处理耗时,备注:预计完成时间/处理中/补丁发布待现场验证/已修复
    • 日报 修改抄送人,每天写,内容要详细(明日计划、需协调内容),一次没写-5分,考勤迟到一次扣5分
    • 接口PMO:完成时间、需协调事项及未完成原因、完成/延期申请

10.14

  1. 绍兴人民医院询价

10.15

  1. 邵逸夫新冠数据导出超时
  2. ibd二期计划
内容 开始时间 结束时间
档案导出 10.15 10.17
高级筛选 10.19 10.23
全景视图 10.26 10.31
ibd随访 11.2 11.6

10.19

  1. 智随访规章制度宣讲
  2. 301会议
  3. 需求讨论
  4. ibd高级筛选前端技术方案讨论

10.20

  1. 用elasticsearch实现统计
  2. 陈潇转正面谈
  3. nacos-dubbo 测试
  4. 省妇保10点左右发送失败

10.21

  1. 省妇保现场问题处理

    • CPU 100%

    • 在院宣教、院级随访手动发送 ( 线程嵌套,发布定保)

    • 在院宣教–历史记录查看优化(添加empi_id索引) 已处理

10.22

  1. word版表结构

  2. 自治区方案评估

  3. 省妇保问题处理

    • 在院宣教发送未收到
    • 满意度回收未达到回收份数
  4. 济南妇幼手机号加密

    • 方案

      接口手机号加密,页面显示密文,数据库也已密文方式存储。业务模块使用的时候后台进行解密,例如短信发送、拨打电话等。随访系统有号码维护功能,需要his提供加密算法/接口,方能将加密后的手机号存储到数据库中。

      如果解密是his提供接口,每次使用需要调用解密接口,接口需要支持高并发,否则会影响随访业务。

    • 工作量评估

      • 号码维护 4人/日
      • 发送短信/短信记录 5人/日
      • 拨打电话 4人/日
      • 科室专病 3人/日
      • 加密、解密接口对接 3人/日

10.26

  1. 省妇保日间手术必填项未填任然能保存问题(AI那道必填题目未识别)
  2. 宿迁第一获取数据库连接超时
  3. 安装es、kibana

10.27

  1. 32网络问题处理(蒋成龙)
  2. 安装logstash
  3. logstash抽取数据到mysql
  4. es学习

10.28

  1. 省妇保问题处理
  2. 省妇保遗留问题处理

10.29

  1. 安装logstash
  2. logstash抽取数据到mysql(抽了一张表t_hospital_followup_record,广妇儿数据已备份,待拿回公司验证)

10.30

  1. es学习

Log4j切换成logback

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<slf4j-version>1.7.5</slf4j-version>
<log4j-over-slf4j-version>1.7.5</log4j-over-slf4j-version>
<logback-version>1.1.7</logback-version>


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${log4j-over-slf4j-version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback-version}</version>
</dependency>



<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${catalina.home}/logs" />

<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [%thread] %cyan(%logger{26}) - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 业务日志 -->
<appender name="business_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/business.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 按照每天生成日志文件 业务日志 -->
<appender name="run_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/run.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 按照每天生成日志文件 错误日志 -->
<appender name="error_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/ex/hug-interview-exception.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>

<!-- 慢sql -->
<appender name="slow_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/ex/hug-interview-slowlog.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>

<logger name="cn.joinhealth.interview.web.root.aspect.ServiceAspect" level="error">
<appender-ref ref="error_log"/>
</logger>
<logger name="com.alibaba.druid.filter.stat.StatFilter" level="ERROR">
<appender-ref ref="slow_log" />
</logger>
<logger name="business" level="INFO">
<appender-ref ref="business_log"/>
</logger>
<logger name="cn.joinhealth.interview" level="INFO">
<appender-ref ref="run_log"/>
</logger>
<logger name="cn.joinhealth.interview.*.*.dao" level="DEBUG">
<appender-ref ref="run_log"/>
</logger>
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>

日期 项目 注意事项
9.11 NT、早糖

下次产检日期:

挂号科室:妇科/产科?

产检内容:

注意事项:是否空腹

VisualVM在Java 8中是JDK自带的一个图形化工具,项目主页 VisualVM,在后续版本中可能会从JDK移除。

VisualVM可以监控Java进程的CPU与内存占用情况,可以监控Java进程内的各个线程的执行情况,还可以与MAT工具一样用来分析堆转储快照。

Mac VisualVM路径

/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands

监控远程Tomcat进程

监控远程主机上的Tomcat进程,需要在Tomcat的catalina.sh文件中加入参数:

1
JAVA_OPTS="$JAVA_OPTS -Dcom.sum.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPV4Stack=true -Djava.rmi.server.hostname=x.x.x.x"
  • -Dcom.sum.management.jmxremote: 启用JMX远程连接
  • -Dcom.sun.management.jmxremote.port=9004: 设置JMX连接端口
  • -Dcom.sun.management.jmxremote.authenticate: 是否开启用户名密码认证
  • -Dcom.sun.management.jmxremote.ssl: 是否使用SSL连接
  • -Djava.net.preferIPV4Stack: 优先使用IPV4
  • -Djava.rmi.server.hostname: 设置JMX主机IP

打开VisualVM,文件 -> 添加JMX连接,输入刚才设置的IP和端口号:

image-20200908162617992

通过jstatd启动RMI服务

  1. 文件路径**$JAVA_HOME/jre/lib/security/java.policy**,在文件末位的 }; 前添加
1
permission java.security.AllPermission;
  1. 在被监控机器启动
1
2
cd $JAVA_HOME/bin
./jstatd -J-Djava.security.policy=all.policy &

​ 启动后会开启注册端口1099和一个随机的连接端口,注册端口也可通过-p参数指定,如

1
./jstatd -J-Djava.security.policy=all.policy -p 10003 &
  1. 设置防火墙

    除了把1099添加到防火墙规则外,还需要找到另外一个随机端口,也加入到规则中
    执行
    netstat -anp | grep *jstatd

  2. 测试

    启动VisualVM,因为在配置JMX时已经添加过服务器节点,如果配置正确,通常VisualVM会自动检测到jstatd连接并添加节点

    如果没有自动添加,可以检查端口是否能连通并尝试手动添加连接

image-20200908163214196

大概新年新气象吧,大家复工之后都追求一个“新”,不少用户升级到了Chrome 80,然后发现登入成功之后总是重定向回单点登录的统一登录页,然后头秃的我感觉头上更凉了。

定位问题

生产环境出了问题,肯定得赶紧寻找问题根源啊。(三步走路子)

  • 第一步,最先以为cookie失效的问题,于是远程用户,发现浏览器cookie设置正常,域名下cookie也有值,但就是带不过去后台,于是开始怀疑跨域出了问题。
  • 第二步,遂检查Nignx配置,CORS配置正常,那就不是后台的问题,应该是浏览器的锅。
  • 第三步,顺着这条路子,最后发现是Chrome 80版本的一个新特性搞的鬼。

在Chrome 80版本中,Chrome会将没有声明SameSite值的cookie默认设置为SameSite=Lax。只有采用SameSite=None; Secure设置的cookie可以从外部访问,前提是通过安全连接(即HTTPS)访问。

SameSite又是个啥?(T︵T,为啥那么多我不知道的东西),哎,慢慢道来。

阅读全文 »