lambda用法整理
使用 lambda 表达式建立子线程任务并阻塞主线程// 阻塞主线程的计数器 CountDownLatch countDownLanch = new CountDownLatch(cycleNum); // 局部的线程池 ExecutorService executor = Executors.newFixedThreadPool(cycleNum > 4 ? 4 : cycleNum); // cycleNum是要执行子线程的次数 for (int i = 0; i < cycleNum; i++) { int start = i * 10000; int num = 10000; executor.execute(new Runnable() { @Override public void run() { try ...
关于消费的同步异步问题,以及多个方法监听同一个topic
@KafkaListener(topics = "test")public void consumerTest1(String msg) throws InterruptedException { log.info("收到消息1:" + msg); TimeUnit.MILLISECONDS.sleep(10);}@KafkaListener(topics = "test")public void consumerTest2(String msg) throws InterruptedException { log.info("收到消息2:" + msg); TimeUnit.MILLISECONDS.sleep(10);}
如上所示多个方法消费同一个 topic那么,只会在一个方法中消费,不会两个方法都消费消息,即不会重复消费
同时当只有consumerTest1()方法时,如果手动阻塞线程,那么消息的消费也会变慢即如果向 test 发送 5 ...
word转pdf
poi(慢,格式回出问题)
openOffice(单线程,不支持并发)
jacob(效果好,但是不支持 linux)
docx4j(没试过)
asposeword(效果好,块,但是付费)
以特定的编码读取文件,以特定的编码写入文件
以下代码是针对 BufferedReader 和 BufferedWriter 的
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(inF),"GB2312"));// 以GB2312的编码读文件BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));// 以utf-8写文件
判断访问设备的方法
java 版// \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔),// 字符串在编译时会被转码一次,所以是 "\\b"// \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔)private static final String PHONE_REG = "\\b(ip(hone|od)|android|opera m(ob|in)i" + "|windows (phone|ce)|blackberry" + "|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp" + "|laystation portable)|nokia|fennec|htc[-_]" + "|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";// 手记的正则表达式private stat ...
告别非空判断
1 Objects 工具类既然要解决空指针,自然就是提前对对象进行判空校验;通常情况下,会使用if( null != obj )进行对象校验;在 Java 7 中,专门提供工具类java.util.Objects,让对象的判空校验更加简单;
特点
Java 7 自带,不需要额外的依赖
静态方法,使用简单
仅支持对象判空
示例
Objects.isNull
判断对象是否为空,为null返回true,否则返回false
Object obj = null; System.out.println(Objects.isNull(obj)); // true obj = new Object(); System.out.println(Objects.isNull(obj)); // false
Objects.nonNull
和Objects.isNull相反;判断对象不为空,为null返回false,否则返回true
Object obj = null; System.out.println(Objects.nonNull(obj)); // false ...
业务开发时,接口不能对外暴露的解决办法
业务开发时,接口不能对外暴露怎么办?内外网接口微服务隔离
网关 + redis 实现白名单机制
方案三 网关 + AOP
具体实操
在业务开发的时候,经常会遇到某一个接口不能对外暴露,只能内网服务间调用的实际需求。面对这样的情况,我们该如何实现呢?今天,我们就来理一理这个问题,从几个可行的方案中,挑选一个来实现。
1. 内外网接口微服务隔离将对外暴露的接口和对内暴露的接口分别放到两个微服务上,一个服务里所有的接口均对外暴露,另一个服务的接口只能内网服务间调用。
该方案需要额外编写一个只对内部暴露接口的微服务,将所有只能对内暴露的业务接口聚合到这个微服务里,通过这个聚合的微服务,分别去各个业务侧获取资源。
该方案,新增一个微服务做请求转发,增加了系统的复杂性,增大了调用耗时以及后期的维护成本。
2. 网关 + redis 实现白名单机制在 redis 里维护一套接口白名单列表,外部请求到达网关时,从 redis 获取接口白名单,在白名单内的接口放行,反之拒绝掉。
该方案的好处是,对业务代码零侵入,只需要维护好白名单列表即可;
不足之处在于,白名单的维护是一个持续性投入的工作,在很多 ...
常用的工具包
预览 word 或者 pdf 的内容:TiKa
数学运算:joinery
常用的返回体封装工具类
/** * 返回体工具 */public class DtoResult<T> implements Serializable { public static final int STATUS_CODE_SUCCESS = 0; public static final int STATUS_CODE_ERROR = 500; private int code; private String message; private T data; public DtoResult() { this.setCode(0); } public DtoResult(T data) { this(); this.data = data; } public DtoResult(Integer code, String message, T data) { this.setCode(code); this. ...
执行简单的定时任务之ScheduledExecutorService
ScheduledExecutorService有线程池的特性,也可以实现任务循环执行,可以看作是一个简单地定时任务组件,因为有线程池特性,所以任务之间可以多线程并发执行,互不影响,当任务来的时候,才会真正创建线程去执行我们在做一些普通定时循环任务时可以用它,比如定时刷新字典常量,只需要不断重复执行即可,这篇文章讲解一下它的用法以及注意事项,不涉及底层原理
注意:我们都知道,在使用线程池的时候,如果我们的任务出现异常没有捕获,那么线程会销毁被回收,不会影响其他任务继续提交并执行,但是在这里,如果你的任务出现异常没有捕获,会导致后续的任务不再执行,所以一定要try...catch
1. 延迟不循环任务schedule方法schedule(Runnable command, long delay, TimeUnit unit)参数 1:任务参数 2:方法第一次执行的延迟时间参数 3:延迟单位说明:延迟任务,只执行一次(不会再次执行),参数 2 为延迟时间
案例说明:
@Component@Slf4jpublic class MineExecutors { private f ...
时间日期整理
Java 中的 Timestamp 对应 mysql 中的 dateTime 类型比如:java 的 bean 类型是 Timestamp插入的时候这么写,这样插入完成后。mysql 数据库里就是 datatime 类型的数据了。
setUpdateTime(new Timestamp(new Date().getTime()));
也可以分开写如下:
java.util.Date date = new java.util.Date(); // 获取一个Date对象Timestamp timeStamp = new Timestamp(date.getTime()); // 给对象赋值该值插入就行了
Java:String 和 Date、Timestamp 之间的转换
String 与 Date(java.util.Date)互转String -> Date
String dateStr = "2010/05/04 12:34:23";Date date = new Date();//注意format的格式要与日期String的格式相匹配DateForm ...
数字处理
1.double 的向上,向下,四舍五入,以及转为 int1.向输出上取整public static void mathCeil() { Double number = 5.3; // Double 向上取整 double ceil = Math.ceil(number); System.out.println("number:" + number); System.out.println("ceil:" + ceil); int ceilRes = new Double(ceil).intValue(); System.out.println("ceilRes:" + ceilRes);}
输出:
number:5.3ceil:6.0ceilRes:6
2.向下取整public static void mathFloor () { Double number = 5.9; // Double 向下取整 double floor = Ma ...
获取当前系统的文件分隔符
String outPath = parentFile.getCanonicalPath() + File.separator + "temp-" + fileName;// File.separator会根据当前的系统自动获得'/'或者'\\'
获得文件路径三种方法以及区别
File file = new File(".\\test.txt");// 返回构造File对象时的路径// 因此,如果File对象是使用相对路径创建的,则返回的值也将是相对路径。如果是绝对路径就返回绝对路径。System.out.println(file.getPath());// 该方法返回文件的绝对路径。请注意!这里是有大坑的。如果你的文件在Java工程内,路径是按照编译后的路径计算的。// 该方法只解析当前目录(代码所在的目录)的相对路径,如果初始化中的路径包含了速记符,速记符将不会被解析。System.out.println(file.getAbsolutePath());// 速记符不被解析有时候是很痛苦的事,我们可能需要知道具体的路径。getCanonicalPath()方法解决了这个问题。由于getCanonicalPath()读取的是文件系统,因此会降低性能。// 如果我们确定没有使用速记符,并且驱动器号大小写已标准化(如果使用Windows OS),我们应该首选使用getAbsoultePath(),除非你的项目中必须使用getCanonica ...
解决cookie跨域问题
业务需求:当前网站想要访问第三方网站的页面,第三方网站的页面接口都需要使用 cookie 认证授权遇到的问题:当前网站和第三方网站不同域。在当前网站使用 iframe。跳转到第三方时。后台通过接口得到的 cookie 无法传递
解决方式 1:nginx 反向代理,用当前网站的域代理第三方网站,然后用当前网站的域+第三方网站的接口 url 就能获取第三方网站的页面或数据示例:nginx.conf
server { listen 19100; #server_name localhost; location / { proxy_pass http://47.95.34.252:8084; } }
js
const url = 'http://127.0.0.1:19100/JcjcGl/Dcztjctky/Dcztbx'function initPage() { $.ajax({ url: Hussar.ctxPat ...
stream用法整理
stream 流处理将用,拼接的字符串转为 Double 集合// 将用','拼接的字符串转为Double集合List<Double> singlePoint = Arrays.asList(pointStr.split(",")) .stream() .map(str -> Double.parseDouble(str.trim())) .collect(Collectors.toList());
过滤枚举
枚举类
/** * 用户角色的枚举类 * */public enum RoleEnum { // 仓储角色 LABORATORY_PERSON("LABORATORY_PERSON", "实验室人员", "365ef7b96870d8acdd4a016866193278", "laboratoryPersonIndex.html", "goods"), EQUIPMENT_MANAGEMENT_PERSON("EQUIPMENT_MANAGEMENT_PERSON", "设备管理员", "34ea46 ...
unzip解压
无论压缩文件下有多少层级,所有解压后的文件都统一放在 outFileDir 文件夹下,且只保留压缩的文件,压缩的文件夹不保留import java.io.*;import java.nio.charset.Charset;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipInputStream;public class A { public static void main(String[] args) { System.out.println(unzip("C:\\Users\\13551\\Desktop\\a\\a.zip", "C:\\Users\\13551\\Desktop\\a")); } public static boolean unzip(String inFilePath, String outDirPath) { // 先对 ...
删除文件
删除单个文件/** * 删除单个文件 * * @param fileName 被删除文件的文件名 * @return 单个文件删除成功返回true, 否则返回false */ public static boolean deleteFile(String fileName) { File file = new File(fileName); if (file.isFile() && file.exists()) { file.delete(); System.out.println("删除单个文件" + fileName + "成功!"); return true; } else { System.out.println("删除单个文件" + fileName + "失败!"); return false; } } ...
java.lang.UnsupportedOperationException:null 使用List.Add()或List.addALL() 报错
还原现场:
List<Integer> agentTeamIdsList =Arrays.asList(agentIdArray);agentTeamIdsList.add(123011);
将一个 Integer 类型数组转成 List, 上面的 Arrays.asList 是可以转成功的;
然后往转成功的 list 里面继续添加 值;
IDEA 里面并没有检测出错误,实则报错:
java.lang.UnsupportedOperationException: null
原因:
Arrays.asList 转成的 ArrayList 实际上跟往常我们创建的 new ArrayList 是不同的。
这个是 Arrays 的内部类 ArrayList:
而我们往常使用的
解决方案:
List<Integer> agentTeamIdsList =new ArrayList<>(Arrays.asList(agentIdArray));