Java
文章平均质量分 50
f2xiang
停止学习是衰老的唯一标准。在技术上,学无止境。
展开
-
Java系统记一次排查生产环境邮件突然就发不出来的问题
Java系统,用的Office365。系统生产环境在运行过程中,邮件突然无法发送了。排查原因的过程。原创 2022-07-07 16:03:46 · 830 阅读 · 1 评论 -
将Html字符串导出成excel的方法和遇到的坑
由于业务场景较复杂,导出内容需要和邮件内容同步。最终选择了将邮件table导成excel的形式。差不多是通过dom4j这个工具把excel画出来。原创 2021-12-10 21:43:55 · 1080 阅读 · 0 评论 -
mybatis配置失效,如mybatis.configuration.map-underscore-to-camel-case失效问题记录
在项目里加了mybatis的配置,如下:mybatis.configuration.map-underscore-to-camel-case=falsemybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl发现没有生效。排查了一下,发现原因,是因为使用了多数据源的原因。多数据需要自己配置config到SqlSessionFactoryBean中解决方法如下:创建MybatisConfig配置类:原创 2021-09-18 15:09:06 · 6217 阅读 · 6 评论 -
线程池newFixedThreadPool父子任务导致的线程死锁问题
代码先来看这么一段代码判断一下是否有问题?public class ThreadPoolLock { /** * 固定大小为2的线程池 */ private static ExecutorService pool = Executors.newFixedThreadPool(2); /** * 测试 * 开了十个父任务 */ public static void main(String[] args) {原创 2021-07-04 23:19:47 · 1418 阅读 · 1 评论 -
Java spi和Dubbo spi的对比以及应用
Spi测试的基础环境一个Shape的接口,有一个draw方法一个Circle类和Rect类实现Shape,重写draw方法代码如下:// 接口:形状public interface Shape { void draw();}// 圆类,实现形状接口public class Circle implements Shape { public void draw() { System.out.println("画一个圆"); }}// 矩形类,实现原创 2021-03-21 14:09:29 · 312 阅读 · 1 评论 -
通过javamail发送邮件加附件的功能以及附件名称乱码的处理
发送邮件添加附件FileDataSource, 可以发送本地指定路径的文件,比如d:\test.jpg的图片。BodyPart bp = new MimeBodyPart();FileDataSource fileds = new FileDataSource(“d:\\test.jpg”);bp.setDataHandler(new DataHandler(fileds));// setStringCoding 文件名转码 防止乱码String fileNameTmp = setStrin原创 2021-02-04 19:57:55 · 847 阅读 · 0 评论 -
java通过websocket调用python脚本实时输出信息
我们这边的系统有自动化发布和调用jenkins集成(调用python脚本)等等依托于调用python脚本的功能。但是脚本调用又是一个比较耗时的操作,前端又怎么实时看到脚本的进度是一个比较难以解决的麻烦事。环境描述:后端是java,springboot项目,前端请求java代码,java代码触发python脚本工作。实现方式:客户端想要实时看到服务端python进度的功能,无非两种解决方法。一是客户端主动拉取进度。二是服务端主动推送进度。针对以上两种,我们这里用到了两种具体的实现方式。实现.原创 2021-02-03 19:51:11 · 1041 阅读 · 1 评论 -
CompletableFuture类优雅异步编排的方法介绍
CompletableFuture是什么?他可以优雅的做线程异步编排。先干嘛,后干嘛。 CompletableFuture.runAsync(() -> { System.out.println("开始异步任务"); int i = 10 / 2; System.out.println("结束异步任务"); }, executor);whenComplete当完成时,异常处理exc.原创 2020-11-27 23:48:44 · 323 阅读 · 0 评论 -
JVM学习笔记——PC寄存器,堆,栈等简介
运行时数据区红色表示数据共享空间,灰色是每个线程独有的。PC寄存器两个面试常见的问题如果共享一个PC寄存器,几条线程来回切换,把地址都给覆盖了,那就乱套了。栈栈是运行时单位,堆是存储的单位。1、局部变量表局部变量表最基本的存储单位是slot槽slot重复利用2、操作数栈3、动态链接堆堆空间(年轻代+养老代)大小设置-X 表示JVM的运行参数。-Xms:设置初始内存 memory start-Xmx:设置最大的内存 max注意:开发中原创 2020-09-02 19:03:20 · 588 阅读 · 0 评论 -
记录一下spring源码导入到idea踩得一些坑
环境java8gradle5.1idea 2017spring-4.3.28.RELEASEError:No such property: GradleVersion for class: JetGradlePlugin解决方法:原来是我之前忘记配gradle的环境了…groovy cant resolve ,groovy资源加载不进来。解决方法:idea安装一个插件。...原创 2020-08-29 22:23:43 · 308 阅读 · 0 评论 -
使用SpringBoot的RestTemplate发送post请求时参数带不上
项目中遇到一个向三方发起请求的数据,不过量不大,就几个方法而已,所以为了方便,我直接用了RestTemplate。1、配置@Configurationpublic class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory){ return new RestTemplate(factory); } @Bean原创 2020-07-31 15:13:10 · 2046 阅读 · 0 评论 -
mybatis中$查询和#查询的区别
#:参数的位置都是用?来替换,参数都是预编译后设置进去的,安全,防止sql注入。$: 不是参数预编译,而是直接sql拼接。那么$就没有使用场景了吗?如果我们要动态的从一个表明里获取数据。#{tableName},报错!得要用${tableName}...原创 2020-07-30 20:59:39 · 398 阅读 · 0 评论 -
SpringBoot整合Junit测试unable to find a @SpringBootConfiguration, use @ContextConfiguration
SpringBoot整合junit做测试的时候遇到这么一个问题,记录一下。unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest@RunWith(SpringRunner.class)@SpringBootTestpublic class MybatisTest { @Autowired private StudentMapper student原创 2020-07-30 20:29:45 · 584 阅读 · 0 评论 -
Linux服务器上保持SpringBoot jar包项目一直运行
有一个用Springboot写的api接口项目,今天准备部署到环境上试试。先把jar包放到服务器上后执行了这么一句指令java -jar 项目名.jar通过浏览器访问了一下地址,发现可以访问,于是愉快的关闭了ssh窗口…然后发现刚刚还能访问的地址进不去了。这种方式特点是ssh窗口关闭时,程序就中止运行了。用nohup指令,可以不挂断运行命令。当ssh窗口关闭时,程序仍然运行。nohup java -jar 项目名.jar >server.log 2>&1运行日志在serv原创 2020-07-27 17:16:02 · 1410 阅读 · 0 评论 -
用Netty搭建一个简单的Http服务器
用Netty搭建一个简单的Http服务器,实现客户端发起http请求时,服务端作出响应返回一串数据。准备工作搭建maven项目,引入netty的依赖。我这里用的是4.0.20版本。 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.0.20.Final<原创 2020-07-26 19:29:15 · 438 阅读 · 0 评论 -
java出现\ufeff的解决方法
今天遇到一个比较诡异的问题,客户端发起请求传来一个id,从客户端接收传到服务端执行就会报错,用postman手动带上这个参数发起请求又是正常的…明明是同一个值…很神奇。后来在服务端将两个值都打印出来,再把两次请求的值分别用String str = “复制过来的值”查看,然后发现,两个值看着一样,还真不一样,一个多了一部分应该是编码出现了点问题,解决方法就是把它去除掉。replace方法。id.replace("\ufeff","");...原创 2020-07-23 18:45:52 · 3557 阅读 · 0 评论 -
JVM学习笔记(一)——内存模型,类加载过程
JVM整体架构字节码文件编译到Class loader system。其中方法区和堆(黄颜色)是线程共享的,其他三个是每个线程独有一份的。Java代码执行过程因为操作系统不识别高级语言,只识别机器指令,所以需要从高级语言=》汇编语言=》机器指令。Java文件从编译器到字节码文件,字节码文件从类加载器到校验器最后到编译执行。JIT编译器可以将多次执行的热点代码缓存起来,下次可以直接使用,提高了效率。JVM的生命周期JVM发展历程Sun Classic VM:世界上第一款商用Java虚原创 2020-07-15 10:38:41 · 321 阅读 · 0 评论 -
ThreadPoolExecutor的构造方法详解以及应急线程的解释
线程池状态// 线程池的控制状态,用高3位来表示线程池的运行状态,低29位来表示线程池中工作线程的数量 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3; // 29 // 高三位来表示线程的运行状态 private static final int RUNNING = -1原创 2020-07-14 17:38:08 · 630 阅读 · 0 评论 -
字节码在JVM中的执行过程分析
通过简单的代码(暂时不涉及到堆内存 - -),查看相应的指令以及在JVM内存中执行的过程。public static void main(String[] args) { int a = 100; int b = 200; int c = a / b; System.out.println(c); }通过指令javap -c -v SimplePrint.class得到字节码文件Classfile /F:/demos/target/classes/c原创 2020-07-14 15:14:32 · 427 阅读 · 0 评论 -
springboot自适应json和xml的原理以及请求响应过程
正常来说springboot的默认response的返回类型都是以json的形式,这几天主管让我看看能不能兼容一下xml。于是我在pom.xml下加入了对解析成xml的支持。 <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version&原创 2020-07-13 16:29:34 · 1489 阅读 · 1 评论 -
Java自定义注解和AOP的整合
需求背景:在一个login放发的前后增加一些逻辑处理,采用AOP和自定义注解的方式。创建一个注解类,标记login()方法。@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface Login { String value() default "";}public interface LoginService { void login();}在login方法上用上注原创 2020-07-07 15:15:30 · 384 阅读 · 0 评论 -
AOP的原理和动态代理以及和Spring Boot的整合
需求背景在每个方法前后打印日志。我们能想到的最简单的方法,就是在主要业务执行前打印和后打印。如下所示:public class LoggerImpl implements Logger { @Override public int add(int a, int b) { System.out.println("计算开始"); int sum = a+b; System.out.println("计算结束:"+sum);原创 2020-07-07 15:14:51 · 174 阅读 · 0 评论 -
idea导入tomcat8源码阅读环境
1.前期准备jdk 8ideamaventomcat 源码,源码下载地址:https://tomcat.apache.org/download-80.cgi下载源码后,解压。1、在根文件夹里创建一个home文件夹,将webapps文件夹和conf文件夹移动到home文件夹下。2、在根目录下创建一个pom.xml文件,文件内容在下面。pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http:原创 2020-07-06 19:01:04 · 522 阅读 · 0 评论 -
java设计模式——适配器模式(电压适配问题)
1、引入需求背景生活中手机充电需要的是5V 直流电,而电压是20V 交流电。所以中间我们需要一个充电器将220V -> 5V。引申一下,充电器本身相当于 Adapter,220V 交流电相当于 src (即被适配者),我们 的目 dst(即 目标)是 5V 直流电。2、适配器模式的三种模式类适配器模式对象适配器模式接口适配器模式接下来我们通过三种模式来实现上述的需求。2.1 类适配器模式2.1.1 类图分析分析:有一个提供220V电压的Voltage220V类,以及输出5V电原创 2020-07-04 20:56:37 · 781 阅读 · 0 评论 -
Swagger整合SpringBoot报错404以及@EnableWebMvc无法访问静态资源文件
最近在写后台接口,是用springboot搭建的。现在准备配置上Swagger作为接口文档。当加好Swagger的配置项后,访问http://localhost:8080/swagger-ui.htm发现404~尴尬了。后来才发现是@EnableWebMvc注解的问题,加了这个注解以后会导致静态资源路径无法访问。同样404的朋友可以试一试把这个注解给注释了,看能否进入Swagger界面。我这里是重新对静态资源文件做了一个新的路径映射。步骤:1、创建一个配置项实现WebMvcConfigurer原创 2020-07-03 13:35:13 · 2180 阅读 · 0 评论 -
java设计模式——原型模式(克隆羊以及浅拷贝,深拷贝)
引入需求背景有一只羊,名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10只羊。最简单的写法public class Test { public static void main(String[] args) { Sheep sheep = new Sheep("tom",1,"白色"); Sheep sheep2 = new Sheep(sheep.getName(), sheep.getAge(), sheep.原创 2020-06-27 17:36:59 · 524 阅读 · 0 评论 -
UML类图
1、UML 基本介绍UML——Unified modeling language UML (统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果2、六种关系依赖(使用)关联继承实现聚合组合关系的强弱程度:继承 > 实现 > 组合 > 聚合 > 关联 > 依赖2.1 依赖关系(Dependence)只要是在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编绎都通过不了。public cla原创 2020-06-26 22:54:33 · 161 阅读 · 0 评论 -
设计模式之七大原则
设计模式的目的软件的耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 。代码重用性 (即:相同功能的代码,不用多次编写)可读性 (即:编程规范性, 便于其他程序员的阅读和理解)可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)使程序呈现高内聚,低耦合的特性设计模式的七大原则单一职责原则接口隔离原则依赖倒转(倒置)原则里氏替换原则开闭原则迪米特法则合成复用原则1、单一原则对类来说的,即一个类应该只原创 2020-06-26 22:23:16 · 155 阅读 · 0 评论 -
java设计模式——单例设计模式八种方式
绪论设计模式分为三种类型,共 23 种创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、 解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)。单例模式1、介绍所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该原创 2020-06-26 22:16:47 · 288 阅读 · 0 评论 -
微信公众号开发之消息开发(Java)
前提:服务端程序和微信测试平台已经打通。没打通的可以参考我前面的文章。公众号开发新手快速上路(Java版本)公众号开发文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html今天的主题是消息,我们主要完成两个功能。1、用户通过关注测试公众号平台给服务端传递数据。2、服务端对数据作出...原创 2020-03-18 09:52:32 · 527 阅读 · 0 评论 -
公众号开发新手快速上路(Java版本)
最近开始玩公众号了,首先得注册一个公众号公众号后台网址:https://mp.weixin.qq.com进入后可以看到公众号分为两大类(服务号和订阅号),服务号个人注册不太到,个人一般使用订阅号。订阅号也分认证和未认证。未认证的情况下,个人的接口调用有限制。所以这里我们可以申请微信公众平台接口测试帐号,里面啥权限都有了。申请地址:https://mp.weixin.qq.com/de...原创 2020-03-16 12:44:23 · 193 阅读 · 0 评论 -
使用idea快速搭建一个SpringBoot项目
话不多说,赶紧上车。1、打开你的idea,new 一个project。2、选择Spring初始化那一串。然后next。3、修改项目名和包名。next。4、选择你需要的依赖包。(后期在maven的pom加依赖也没问题)这里我选了这几个,web下的spring web,sql里的jdbc,mysql,和mybatis。5、选择存放路径,finish。6、OK,大功告成。(这个项目...原创 2020-03-16 11:01:00 · 349 阅读 · 0 评论 -
Java通过总分数组生成排名数组
遇到这么一个业务,通过一个已知的总分数组,来生成相应的排名数组。public static void main(String[] args) { int [] sum = new int[]{5,10,12,7,8}; //初始化总分数组 int [] order = new int[]{5,5,5,5,5}; //初始化排名数组(初始化数据为总原创 2018-01-04 16:11:48 · 935 阅读 · 1 评论