自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

二祥的工作历程

在工作中遇到的问题,以及解决方法

  • 博客(57)
  • 资源 (8)
  • 收藏
  • 关注

原创 Java系统记一次排查生产环境邮件突然就发不出来的问题

Java系统,用的Office365。系统生产环境在运行过程中,邮件突然无法发送了。排查原因的过程。

2022-07-07 16:03:46 857

原创 通过docker compose配合shell脚本自动发布Java项目

1. 环境准备docker环境docker composelinux(mac)系统mavengitJava项目我这边准备的环境是Mac系统,使用的docker compose版本如下Java项目我们自己的项目即可,配置好git以及ssh我这里用一个示例(renren-generator)项目2. docker compose相关文件2.1 Dockerfile文件ps . 我这个项目暴露出来的端口是7000FROM java:8EXPOSE 7000VOLUME /

2022-04-17 11:13:46 1864

原创 将Html字符串导出成excel的方法和遇到的坑

由于业务场景较复杂,导出内容需要和邮件内容同步。最终选择了将邮件table导成excel的形式。差不多是通过dom4j这个工具把excel画出来。

2021-12-10 21:43:55 1161

原创 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 6713 6

原创 通过nginx用域名来访问http和websocket

公司升级了https,导致前端访问一个三方应用的一个websocket接口被拦截了报错信息如下:Mixed Content: The page at ‘https://xxx.com/xxxxxxxxx?aaa=111&bbb=222’ was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ‘ws://10.xxxx:8080/websocket’. This request has.

2021-07-18 12:19:22 1727

原创 升级到https, websocket失效的解决方法

公司升级了https,导致前端访问一个三方应用的一个websocket接口被拦截了报错信息如下:Mixed Content: The page at ‘https://xxx.com/xxxxxxxxx?aaa=111&bbb=222’ was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ‘ws://10.xxxx:8080/websocket’. This request has.

2021-07-18 12:00:10 6884 1

原创 线程池newFixedThreadPool父子任务导致的线程死锁问题

代码先来看这么一段代码判断一下是否有问题?public class ThreadPoolLock { /** * 固定大小为2的线程池 */ private static ExecutorService pool = Executors.newFixedThreadPool(2); /** * 测试 * 开了十个父任务 */ public static void main(String[] args) {

2021-07-04 23:19:47 1501 2

原创 代码打镜像推送到Docker Hub,并由k8s拉取镜像部署小案例

打镜像这里以部署一个renren-generator代码生成器应用为例,上传到DockerHub上。Maven打包,生成jar包编写DockerfileFROM java:8EXPOSE 7000VOLUME /tmpADD /target/renren-generator-1.0.0.jar /app.jarRUN bash -c 'touch /app.jar'ENTRYPOINT ["java","-jar","/app.jar"]执行docker buil

2021-05-21 22:17:04 1149

原创 Mac下,通过minikube实现简单的发布和访问

k8s架构Master节点构成master节点相当于大脑。etcd:数据库Worker节点container runtime:k8s不直接和容器对接,而是通过container runtime来做处理,当镜像没有的时候会去拉取,然后缓存在本地。kube-proxy:管理service网络,pod的ip是瞬息万变的,为了屏蔽pod ip的变化,所以引入了service的概念,并且在调用的时候进行负载均衡发布流程发布命令,创建一个副本,通知ControllerManage

2021-05-15 16:28:51 722 7

原创 Mac使用minikube发布,本地访问Service失败问题解决

利用Minikube发布发布rabbitmq,一直访问不上。具体的配置文件如下。rabbitmq-pod.yamlapiVersion: v1kind: Podmetadata: name: rabbitmq-pod labels: # 打标签 app: rabbitmq #用于service路由到这里spec: containers: - name: rabbitmq-container image: rabbitmq:managementr

2021-05-15 12:26:05 2786 3

原创 缓存伪共享的概念以及解决方法

缓存结构各个缓存,内存到CPU的时间比较由于从CPU到内存比较耗时,所以现在的数据都会尽量的存在缓存中。但是存在缓存中,就需要保证数据一致性。缓存行缓存以缓存行为基本单位,对应着一个内存中的数据。伪共享当内存中有一个数组Cell[2] = {6000, 6001},由于数组在内存是连续存储的,而一个Cell对象 = 24字节(16字节头 + 8字节的value)而 24+24 = 48 < 64, 所以会占用在一个缓存行中。那么问题来了。Cpu1对Cell[0]做修改C

2021-05-01 10:37:57 383

原创 PostgreSQL 类似于Mysql的replace into的功能

最近搞报表统计数据是从另一个平台通过定时器拉取的。新的数据批量新增,同时旧的数据还要进行更新的操作。mysql 有类似的功能 replace into但是现在用的是PostgreSQL查了一下, 发现可以用INSERT INTO ...ON conflict(x) DO xxx建一张测试表select * from table_testDO nothing测试-- 一旦发现主键冲突,不做任何操作,查询和之前一样INSERT INTO table_test(name, age)V.

2021-04-26 16:33:35 6234

原创 SpringBoot 的ApplicationListener接口以及自定义ApplicationEvent发布事件

ApplicationListener接口监听容器刷新完成, 做一些初始化的操作/** * 1. 定义一个自己应用的启动类监听,用于监听spring容器刷新完成, * 2. 可以初始化自己的应用 */@Componentpublic class MyApplicationBootStrapListenr implements ApplicationListener<ContextRefreshedEvent> { public void onApplicationEv

2021-04-03 12:51:58 945

原创 布隆过滤器原理和基于BloomFilter的误判率展示

布隆过滤器布隆过滤器原理布隆过滤器是由n个Hash函数和一个二进制数组组成。如图所示(参考,hash函数可以多个)1.保存操作发来一个请求数据hello对数据hello经过三次hash运算,分别得到三个值(假设1,3,5)。在对应的二进制数组里,将下标为1,3,5的值置为1。这样hello数据就保存了。2.查询操作发来一个请求数据hello对数据hello经过三次hash运算,分别得到三个值(假设1,3,5)。在二进制数组里,将下标为1,3,5的值取出来,如果都为1,则表示该

2021-03-21 19:55:39 2446

原创 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 333 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 954

原创 java通过websocket调用python脚本实时输出信息

我们这边的系统有自动化发布和调用jenkins集成(调用python脚本)等等依托于调用python脚本的功能。但是脚本调用又是一个比较耗时的操作,前端又怎么实时看到脚本的进度是一个比较难以解决的麻烦事。环境描述:后端是java,springboot项目,前端请求java代码,java代码触发python脚本工作。实现方式:客户端想要实时看到服务端python进度的功能,无非两种解决方法。一是客户端主动拉取进度。二是服务端主动推送进度。针对以上两种,我们这里用到了两种具体的实现方式。实现.

2021-02-03 19:51:11 1123 1

原创 Nginx结合tomcat反向代理和多个项目的路径转发

正向代理直接访问不到,通过一个中转,来访问。反向代理暴露的代理服务器,隐藏的真实的服务器。客户端把请求发给反向代理服务器,反向代理服务器进行转发。负载均衡将请求分发到不同的服务器上。动静分离案例nginx代理访问到tomcat启动tomcat,地址为http://192.168.2.103:8080。修改redis的配置文件,将访问redis的路径转发到tomcat上。server { listen 80; # 对localhost:80监听,对地址

2020-12-21 19:38:20 2399

原创 mysql创建用户并授权用户的权限

# 创建用户create user 'user'@'%' identified by 'pwd';# 为用户授权db_name数据库的table1表的select权限grant SELECT on `db_name`.table1 to 'user'@'%';# 为用户授权db_name数据库的table2表的select权限grant SELECT on `db_name`.table2 to 'user'@'%';# 刷新生效flush privileges;# 显示用户权限

2020-12-21 19:33:12 349

原创 mysql拆分用逗号拼接的字段做关联

有两张表A,B,主表诡异的设计, 将用户表的id用逗号分隔做字段保存。而现在想要看每个用户的信息,就得把id逗号拼接做拆分。模拟了一张order表模拟了一张order_user表把逗号拼接的id做拆分做一张临时表出来 select a.ID, substring_index(substring_index(a.users, ',', b.help_topic_id + 1), ',', -1) users from `order` a join mysql.he.

2020-12-19 14:54:36 2267 1

原创 java -jar命令传参启动和切换不同环境的springboot jar包

java -jar springboot jar --server.port=8181java -jar springboot jar --spring.profiles.active=dev > logs/xxxlog.log 2>&1 &在idea里,也可以模拟启动

2020-12-04 23:34:09 1794

原创 如何在Linux服务器上以指定的jdk版本启动springboot jar包

最近做了一个Java服务,想要部署在Linux服务器上,发现这台Linux服务器上的默认java版本是1.7,上面正跑着其他的项目。而我这个Java服务是SpringBoot2.2.11.RELEASE,在jdk1.8的环境下跑。两种方法:1、降低你的SpringBoot版本,适配到jdk1.7。2、在服务器上安装一个1.8,用指定的jdk去启动项目。我选择2。下载安装jdk1.8下载压缩包后,我放在/usr/local 下,使用tar -zxvf xxxxxx.tar.gz解压。如下所.

2020-12-01 19:45:36 4865

原创 CompletableFuture类优雅异步编排的方法介绍

CompletableFuture是什么?他可以优雅的做线程异步编排。先干嘛,后干嘛。 CompletableFuture.runAsync(() -> { System.out.println("开始异步任务"); int i = 10 / 2; System.out.println("结束异步任务"); }, executor);whenComplete当完成时,异常处理exc.

2020-11-27 23:48:44 352

原创 BeanFactory和FactoryBean的区别?通过源码来了解一下

场景引入BeanFactory和FactoryBean有什么区别呢?代码引入代码一我们先跑一跑这么一段代码,查看打印结果。public class HelloService { public String hello() { return "hello spring~~~"; }}public class HelloServiceFactoryBean implements FactoryBean<HelloService> { @Ov

2020-09-12 14:53:45 149

原创 JVM学习笔记——PC寄存器,堆,栈等简介

运行时数据区红色表示数据共享空间,灰色是每个线程独有的。PC寄存器两个面试常见的问题如果共享一个PC寄存器,几条线程来回切换,把地址都给覆盖了,那就乱套了。栈栈是运行时单位,堆是存储的单位。1、局部变量表局部变量表最基本的存储单位是slot槽slot重复利用2、操作数栈3、动态链接堆堆空间(年轻代+养老代)大小设置-X 表示JVM的运行参数。-Xms:设置初始内存 memory start-Xmx:设置最大的内存 max注意:开发中

2020-09-02 19:03:20 626

原创 redis几种数据类型以及使用场景

连接Redis$ redis-cli -h host -p port -a password[root@CentOS src]# ./redis-cli -p 6383Redis的数据类型String 字符串String是最基础的,一个key对应的一个value。127.0.0.1:6379> set quota helloOK127.0.0.1:6379> get quota"hello"127.0.0.1:6379>Hash 哈希Hash是键值对的集合12

2020-09-02 18:57:28 196

原创 Spring容器初始化以及Bean对象的创建

Bean容器的加载main测试类 public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Bean bean = applicationContext.getBean(Bean.class); System.out.println(bean); }

2020-08-31 20:06:45 378

原创 记录一下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 332

原创 redis 主从复制读写分离

开启主从模式复制一份配置文件(可以叫redis6380.conf)出来作为从机的配置文件。修改配置文件。一个是端口,一个是作为哪台机子的从机。port 6380replicaof 127.0.0.1 6379启动两台机子。redis-server /usr/local/redis/redis6379.confredis-server /usr/local/redis/redis6380.conf查看一下(可以跳过)。appledeMacBook-Pro:~ apple$

2020-08-22 19:39:04 168

原创 mysql列转行合并字段

今天有一个需求,

2020-07-31 16:22:31 214

原创 使用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 2147

原创 来个好玩的~ SpringBoot 启动Banner自定义设置

每次启动SpringBoot项目的时候,是不是总能看到眼熟的大logo打在控制台上。比如这样哈哈哈!我们也可以根据需求定制造型神奇的banner。在resources文件夹下放一个banner.txt的文件就好了。启动的时候会自动打印里面的内容。比如,以下banner.txt${AnsiColor.BRIGHT_BLUE} _____ _ ____ _ / ____| (_)

2020-07-31 14:51:37 310

原创 mybatis中$查询和#查询的区别

#:参数的位置都是用?来替换,参数都是预编译后设置进去的,安全,防止sql注入。$: 不是参数预编译,而是直接sql拼接。那么$就没有使用场景了吗?如果我们要动态的从一个表明里获取数据。#{tableName},报错!得要用${tableName}...

2020-07-30 20:59:39 422

原创 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 609

原创 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 1450

原创 用Netty搭建一个简单的Http服务器

用Netty搭建一个简单的Http服务器,实现客户端发起http请求时,服务端作出响应返回一串数据。准备工作搭建maven项目,引入netty的依赖。我这里用的是4.0.20版本。 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.0.20.Final&lt

2020-07-26 19:29:15 480

原创 java出现\ufeff的解决方法

今天遇到一个比较诡异的问题,客户端发起请求传来一个id,从客户端接收传到服务端执行就会报错,用postman手动带上这个参数发起请求又是正常的…明明是同一个值…很神奇。后来在服务端将两个值都打印出来,再把两次请求的值分别用String str = “复制过来的值”查看,然后发现,两个值看着一样,还真不一样,一个多了一部分应该是编码出现了点问题,解决方法就是把它去除掉。replace方法。id.replace("\ufeff","");...

2020-07-23 18:45:52 3644

原创 JVM学习笔记(一)——内存模型,类加载过程

JVM整体架构字节码文件编译到Class loader system。其中方法区和堆(黄颜色)是线程共享的,其他三个是每个线程独有一份的。Java代码执行过程因为操作系统不识别高级语言,只识别机器指令,所以需要从高级语言=》汇编语言=》机器指令。Java文件从编译器到字节码文件,字节码文件从类加载器到校验器最后到编译执行。JIT编译器可以将多次执行的热点代码缓存起来,下次可以直接使用,提高了效率。JVM的生命周期JVM发展历程Sun Classic VM:世界上第一款商用Java虚

2020-07-15 10:38:41 352

原创 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 695

原创 字节码在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 457

idea2020mybatis log插件.rar

idea2020mybatis sql log的插件

2021-03-14

MySQL5_Training

MySQL知识详解,适合刚接触的人,也适合计算机的学生。

2017-12-30

jQuery权威指南和配套代码

本书由国内资深web技术专家亲自执笔,4大web开发社区一致鼎力推荐。(含源代码)

2017-12-30

Apache POI教程以及jar包

Apache POI的相关使用方法,教程,Jar包等等。可以通过java生成各种office文件等。

2017-12-30

从单片机初学者迈向单片机工程师

从单片机初学者迈向单片机工程师,单片机的进阶过程。

2017-12-30

java生成验证码代码

通过servlet生成一个验证码图片,加载在页面的img标签中,通过js方法点击事件来控制。

2017-12-30

Apache Shiro教程

Apache Shiro 是一个框架,可用于身份验证和授权。Apache Shiro的教程(PDF),相关jar包,源码等。

2017-12-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除