- 博客(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
原创 使用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<
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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人