Skip to content
Permalink
Browse files

feat: 05025 code

  • Loading branch information...
alterhu2020 committed May 25, 2019
1 parent e979360 commit c7a2686d735122f6533931f400448461c1852c2f
Showing with 394 additions and 0 deletions.
  1. +3 −0 docs/.vuepress/sidebar.js
  2. +87 −0 docs/blog/2019/05-22-what.md
  3. +169 −0 docs/blog/2019/05-24-what.md
  4. +135 −0 docs/blog/2019/05-25-what.md
@@ -12,6 +12,9 @@ module.exports ={
title: '2019年',
collapsable: false,
children: [
'2019/05-25-what',
'2019/05-24-what',
'2019/05-22-what',
'2019/05-20-what',
'2019/05-15-what',
'2019/05-14-what',
@@ -0,0 +1,87 @@
---
title: 5月22日整理
---

## 自定义自己的application.yml中的配置信息


```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
```


## spring security securedEnabled /jsr250Enabled / prePostEnabled


## resttemplate获取的json对象是泛型的会自动转换为map对象,如何转为正确的实体类?
```
// 泛型的数据返回值
ParameterizedTypeReference<WebResponse<WeixinUserInfoResponse>> webResponseParameterizedTypeReference =
new ParameterizedTypeReference<WebResponse<WeixinUserInfoResponse>>() {
};
ResponseEntity<WebResponse<WeixinUserInfoResponse>> responseEntity = restTemplate.
exchange(userInfoRequestUrl, HttpMethod.GET, null, webResponseParameterizedTypeReference);
// 获取正确了token值
WebResponse<WeixinUserInfoResponse> webResponse = responseEntity.getBody();
```

## Data truncation: Truncated incorrect DOUBLE value

> 在网上的主要错误原因是:update语句中的set中出现了and关键字,而应该使用逗号<,>代替之;这里的报错不属于这种情况;
## mysql表名不区分大小写

```
需要改 MySQL 的配置文件,Linux 下 MySQL 的配置文件可能是 /etc/my.cnf,或 /etc/mysql/my.cnf,这依赖于你的安装方式。假如是 /etc/my.cnf,那么执行
sudo vi /etc/my.cnf
在 [mysqld] 节中添加:
lower_case_table_names=1
然后保存,用 sudo /etc/init.d/mysql restart 重启 MySQL 服务便让 Linux 系统对表名大小写不敏感了。
其实准确来说不是说 Linux 对于 MySQL 表名忽略大小写,而是应用上面的配置后,MySQL 服务程序会来自于应用程序里的请求的表名转换为小写,如你查询 select* UNMI_TABLE,MySQL 会认为是查询的 select * from unmi_table,所以在加入
lower_case_table_names=1
之前时你必须把表名都改为小写。也就是在创建表时都用小写名字,如果创建的表名为 UNMI_TABLE,那么程序中无论是执行 select * from UNMI_TABLE 还是执行 select * from unmi_table 都会碰到类似下面的错误:
```
但是mysql8 不能更改

遇到同样问题,翻看MySQL官方文档发现

lower_case_table_names can only be configured when initializing the server. Changing the lower_case_table_names setting after the server is initialized is prohibited.

别指望了改了

经过尝试,只有在安装完成之后,初始化数据库之前,修改my.cnf
然后再初始化数据库才有效


## spring quartz任务调度超时

[参考博客](https://www.cnblogs.com/daxin/p/3919927.html)

```yml
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
# 调度引擎比较忙得时候出现这个问题
# 当前线程有10个,但是现在有12个任务需要在13:00处理,所以有两个任务需要延迟处理,
# 如果延迟到13:60,就是延迟了60分钟, 大于下面的50分钟,所以就是misfire的。
# 如果延迟到13:40 ,触发器发现小于50秒,调度引擎认为这个延迟时间可以忍受,所以不算超时(Misfires)
misfireThreshold: 50000
# 集群配置
isClustered: false
clusterCheckinInterval: 50000
```
@@ -0,0 +1,169 @@
---
title: 5月24日整理
---


## `extends QuartzJobBean``implements Job ` difference

在spring-boot-quartz中使用提供的接口创建job的时候有两种方式:

- 实现接口`Job`

如果采用的是implements job接口的形式创建job,name我们如何获取任务传递过来的外部参数呢?

```java
@Override
public void execute(JobExecutionContext context) {
try {
// 通过访问 JobExecutionContext 获取JobDataMap 对象,从而访问对应的参数
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
Object jobName = jobDataMap.get("name");
}
}
```
有没有一种更方便的形式进行访问获取`JobDataMap`中的参数和值呢?是的,这个就是`QuartzJobBean`类做得

- 继承抽象类`QuartzJobBean`

官方的说明是: 更优雅采用java对象思想来访问传过来的参数。

```java
public class MyJob extends QuartzJobBean {
private String parameter1;
public void setParameter1(String parameter1) {
this.parameter1 = parameter1;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("My job is running with "+parameter1);
}
}
```

## @DisallowConcurrentExecution 配置quartz并发执行

> 可能有多个触发器使用该job,所以避免并发执行这个任务
@DisallowConcurrentExecution
@PersistJobDataAfterExecution



## 常用基本quartz cron表达式

```xml
每隔5秒执行一次:*/5 * * * * ?

每隔1分钟执行一次:0 */1 * * * ?

每天23点执行一次:0 0 23 * * ?

每天凌晨1点执行一次:0 0 1 * * ?

每月1号凌晨1点执行一次:0 0 1 1 * ?

每月最后一天23点执行一次:0 0 23 L * ?

每周星期天凌晨1点实行一次:0 0 1 ? * L

在26分、29分、33分执行一次:0 26,29,33 * * * ?

每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

```

## quartz state

see [org/quartz-scheduler/quartz/2.3.0/quartz-2.3.0-sources.jar!/org/quartz/impl/jdbcjobstore/Constants.java:142](/org/quartz-scheduler/quartz/2.3.0/quartz-2.3.0-sources.jar!/org/quartz/impl/jdbcjobstore/Constants.java:142)

```java
// STATES
String STATE_WAITING = "WAITING";
String STATE_ACQUIRED = "ACQUIRED";
String STATE_EXECUTING = "EXECUTING";
String STATE_COMPLETE = "COMPLETE";
String STATE_BLOCKED = "BLOCKED";
String STATE_ERROR = "ERROR";
String STATE_PAUSED = "PAUSED";
String STATE_PAUSED_BLOCKED = "PAUSED_BLOCKED";
String STATE_DELETED = "DELETED";
```


## mybatis plus自定义分页出错

采用mybatis plus的自定义查询报错如下:

```java
Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: cannot find column's cache for "com.yanzhi.batch.entity.JobListEntity", so you cannot used "class com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper"!
不支持,不可以使用`LambdaQueryWrapper`来构造自定义查询条件
```
那么该如何优雅的使用mybatis提供的QueryWrapper构造子查询条件呢?避免在xml中写大量的`<if test>`进行判断子查询,生成动态的查询条件,如下是操作步骤:
1. 首先确定配置了拦截器如下:
```java
/**
* 分页拦截器
*
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
List<ISqlParser> sqlParserList = new ArrayList<>();
// 攻击 SQL 阻断解析器、加入解析链作用!阻止恶意的全表更新删除
sqlParserList.add(new BlockAttackSqlParser());
paginationInterceptor.setSqlParserList(sqlParserList);
return paginationInterceptor;
}
```
2. 在mapper中定义对应的接口(主要看对应的两个方法参数`IPage`, `@Param(Constants.WRAPPER) Wrapper`,还有返回类型: `IPage`,其他的根据自己的实体调整):
```java
IPage<JobListEntity> getJobs(IPage page, @Param(Constants.WRAPPER) Wrapper entityWrapper);
```
3. 在mapper的xml对应的查询SQL最后定义如下自定义查询:
```java
<where>
${ew.sqlSegment}
</where>
```
4. 在service层调用mapper层的方法代码:
```java
Page<JobListEntity> page = new Page<>(pageNum, PageSize);
// 或者QueryWrapper queryWrapper =Wrappers.query();
QueryWrapper queryWrapper = Wrappers.emptyWrapper();
if(StrUtil.isNotEmpty(name)) {
// 这里填的字段对应查询条件中的数据字段
queryWrapper.like("qjd.JOB_NAME", name);
}
IPage<JobListEntity> jobListEntityIPage = jobMapper.getJobs(page, queryWrapper);
```
关于 `${ew.sqlSegment}` 使用了 `$` 不要误以为就会被 sql 注入,请放心使用 mp 内部对`wrapper` 进行了字符转义处理!

0 comments on commit c7a2686

Please sign in to comment.
You can’t perform that action at this time.