杂七杂八笔记

前言

平日积累的一些小笔记,因比较杂且短,先放到本文中。

正则

$0——$9

$0代表完整的模式匹配文本(想index.css的话它全部都变成的斜体),$1代表第一个x小括号的字串

比如 /gai([\w]+?)over([\d]+)/ 匹配 gainover123 $1= 括号里的 n $2= 第2个括号里的 123

jdb命令

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=
jdb -attach 127.0.0.1:
stop in org.zoolu.iax.protocol.peer.Peer.handleRecvFrame(byte[])
clear org.zoolu.iax.protocol.peer.Peer.handleRecvFrame(byte[])

Component和Repository注入两次解决方案

因为一些需要,所以需要加个定时器,并且在InitializingBean中的afterPropertiesSet中启动。完成后,加了一些log,看一下是否成功。

最初的时候是在加了@Repository注解的类里面实现的,当时日志就重复打印了一次,一共打印了两次,但是当时在调试主要功能,也没太注意。后来,为了Dao类的纯粹性,就把定时器移到了加了@Service的类里面。这时候,日志打印次数正常。

后来,功能调试OK后,觉得放在Service中也不太合适,就新建了一个类,把定时器移到了Component中,然后运行,如果无误,就准备提交代码了。这时候,日志又重新打印了两次。

然后首先想到的是去网上搜索,搜到的都是 加上@Scope(“singleton”)改为单例、把类上的@Component改为只加载一次的注解等等。

后来,我就用debug模式,自己去跟踪,后来发现,我的代码中@Component和@Repository被加载了两次,@Controller和@Service被加载了一次。试了很多种方案,都没有用,想加个全局变量类控制一下定时任务,但是第二次注入相当于是重新注入,所以也没有用。后来发现是配置中自动扫描注解的配置有交集。

在很多配置中一般都会把Spring-common.xml和Spring-MVC.xml进行分开配置,这种配置就行各施其职一样,显得特别清晰。

在Spring-MVC.xml中只对@Controller进行扫描就可,作为一个控制器,其他的事情不做。

在Spring-common.xml中只对一些事务逻辑的注解扫描。

现在给定一个项目包的机构:
com.fq.controlller
com.fq.service

正确的是:

<context:component-scan base-package=”com.fq.controller”>
<context:include-filter type=”annotation” expression=”org.springframework.stereotype.Controller” />

我的配置里面Spring-MVC.xml并没有具体到controller,而是com.fq.*

所以我在Spring-MVC.xml中加入了exclude-filter

<context:component-scan base-package=”com.fq.controller”>
<context:include-filter type=”annotation” expression=”org.springframework.stereotype.Controller” />
<context:exclude-filter type=”annotation” expression=”org.springframework.stereotype.Service” />
<context:exclude-filter type=”annotation” expression=”org.springframework.stereotype.Repository” />
<context:exclude-filter type=”annotation” expression=”org.springframework.stereotype.Component” />

这样,确实是加载了一次,但是访问不了Controller。经过排查,发现Controlle并没有被加载,经过测试,发现是
<context:exclude-filter type=”annotation” expression=”org.springframework.stereotype.Component” />
这条语句导致的。

我把改为具体到Controller包,把那些exclude-filter都去掉之后,所有都正常了,但是还是对这个原因有些疑惑,然后我就看了一下include-filter和exclude-filter的区别。比较好的是下面这个文章,虽然短,但是描述的很清晰。

include-filter和exclude-filter的区别 https://www.cnblogs.com/hanguocai/p/7783078.html

需要把context:component-scan的use-default-filters属性设置为false,默认为true,同时需要把那些exclude-filter去掉

线程池

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue)

workQueue 还可能是 SynchronousQueue 队列

当 workQueue 是 LinkedBlockingDeque 时,当需要执行的线程数大于 corePoolSize,则忽略 maximumPoolSize 和 keepAliveTime,在线程池里线程数达到 corePoolSize 后把之后的任务放到队列里,在队列满的时候才创建线程直到线程数达到 maximumPoolSize ,继续有任务时,抛出异常。

当 workQueue 是 SynchronousQueue 时,当需要执行的线程数大于 corePoolSize,在线程池里的线程数达到 corePoolSize 后,继续创建线程执行任务;当线程池里的线程数达到 maximumPoolSize 后,则继续处理之前的任务,其他任务不再处理,且抛出异常。

yaml配置

Yaml文件被解析为Map形式

“:”前是key,后是value

每一行之前加”- “表示是数组或List

字符串用双引号括起来,不会对里面的内容进行转意;
用单引号括起来,会对里面的内容进行转意,特殊字符最终只是一个普通的字符串数据,该是什么还是什么

Java nio 空轮询bug

https://pdai.tech/md/java/io/java-io-nio-select-epoll.html
https://blog.csdn.net/qq_45076180/article/details/113242674

参考资料

  1. 暂无