【JAVA】
文章平均质量分 70
后端沉思录
不断学习的小学生。
展开
-
生产-消费模型组件实现 Producer Consumer Solution using BlockingQueue
原来各个应用某些业务节点的日志通过filebeat+elk收集,供各个业务方使用,线上发现filebeat消耗非常大的硬件资源,而且应用集群较大,每次新增日志类型时需要新增filebeat配置并启动新的应用进程,较为繁琐和耗服务器资源;优化成通过kafka收集日志,consumer消费并写入es,考虑到频繁的写入es会造成应用资源、网络开销的浪费,设计上为批量写入es。该应用场景比较通用,考虑把该生产-消费模型抽成组件放入公共模块。组件设计细节使用方自定义业务属性;使用方自定义写入阈值业务方实原创 2021-06-09 16:07:05 · 207 阅读 · 0 评论 -
Metaspace内存不足导致FGC问题排查
事件回顾清楚的记得是2020/7/25 14:34分左右,周六的下午,我还在公司苦逼的加班中,突然钉钉告警群里出现大量应用OP的dubbo超时调用、空指针异常,异常中间还有Metaspace元空间不足等异常:o.a.c.f.l.ListenerContainer 98 [ERROR] Listener \(org.apache.curator.framework.recipes.cache.PathChildrenCache$3@7edb7fd5) threw an exceptionjava..原创 2020-08-31 00:13:44 · 1460 阅读 · 1 评论 -
简单使用线程池
Executors工厂类中有很多静态方法用于创建线程池。下面简单的介绍其中几种使用:newFixedThreadPool:创建指定线程数的线程池,通常设定的线程数根据系统资源设置。newCachedThreadPool:创建一个可缓存的线程池,若线程数超过处理需要,可以回收空闲的线程,若线程数不够处理需要,则创建新的线程。newScheduledThreadPool:创建定长线程池,可原创 2016-11-11 10:03:41 · 809 阅读 · 0 评论 -
初识IntelliJ IDEA下JUnit单元测试
由于之前进行单元测试时,没有用JUnit测试框架,逐步接触到其后,它的功能实在是太强大了。本文主要初步介绍如何在IntelliJ IDEA上简单使用JUnit。在Android Studio上创建module时,会自动帮助我们创建测试类: 下面也按照此在IntelliJ IDEA上创建测试类,首先在IntelliJ IDEA中安装插件JUnit Generator,JUnit已经被默认...原创 2016-11-27 19:36:55 · 30174 阅读 · 0 评论 -
参数校验
最近开发中遇到一个问题,需要对请求的参数进行校验,包括身份证号、手机号、是否是数字、是否是整型数字、年龄、性别的校验,由于Controller层接受参数类型是JSONObject,所以需要考虑使用其他方法解决这个问题,前提排除解析后再通过条件语句去判断,这样不但使代码冗余而且使未来的字段扩充或校验变的麻烦。首先考虑的方法就是通过AOP+注解的方式解决,大致的步骤如下: 1. 定义注解类 ...原创 2018-04-07 21:46:09 · 470 阅读 · 0 评论 -
hashCode、equals的使用
hash code、equals是Java用来比较对象是否相等,下面介绍一下自己在工作中对hash code、equals的使用. 首先介绍下String类中的hashCode、equals方法:public int hashCode() { int h = hash; if (h == 0 && value.length > 0) ...原创 2018-06-11 22:21:23 · 214 阅读 · 0 评论 -
动态代理(一)
代理模式是Java的一种设计模式,开发中可能会有一种场景,某个类的方法需要补充,但是由于不想在原有的类基础上改动,该如何做呢,如下:接口:public interface ProxyUserService{ String getUserMobile(String name);}public class ProxyUserServiceImpl implements Proxy...原创 2018-06-11 23:39:12 · 189 阅读 · 0 评论 -
自定义钉钉机器人报警
为了埋点实时监控业务,简单的实现了钉钉机器人报警,钉钉开发官方文档点击public interface AlarmService { Response<Boolean> orderSuccessAlarm(CompanyAppIdEnum companyAppIdEnum, String orderNo, OrderStatusEnum orderStatusEnum...原创 2018-06-12 00:13:43 · 4144 阅读 · 1 评论 -
Java clone
简介实现Cloneable接口的类才可以被克隆,如果不实现该接口,调用Object clone方法会报CloneNotSupportedException: <p> * Invoking Object's clone method on an instance that does not implement the * <code>Clonea...原创 2018-06-30 01:02:25 · 260 阅读 · 0 评论 -
并行执行任务
需求在app列表首页,展示多个item,并有分页;而每个item里后台都会调用一个http请求,判断当前item的状态 分析 为了更好的用体验,无疑需要使用多线程并行处理http请求,而且还需要拿到每个线程的执行结果. 上面的分析,有两个问题需要解决: 1. 如何创建线程池 2. 如何拿到所有线程的执行结果 对于第一个问题,还是...原创 2018-07-02 00:09:36 · 871 阅读 · 0 评论 -
浅析ThreadLocal
ThreadLocal是什么* This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} m...原创 2018-09-02 23:43:43 · 185 阅读 · 0 评论 -
SPI概念及使用方法
简介SPI全称Service Provider Interfaces,用于发现接口的实现。在jdbc、日志、dubbo的设计中都使用SPI用于服务的发现。简单的以jdbc为例:jdbc Driver实现了java.sql.Driver接口,实现具体的功能,也就是Java SQL framework定义了用于数据库连接接口规范,不同的数据库厂商要想使用Java连接数据库必须实现该接口才可以,当...原创 2018-10-13 21:47:09 · 2547 阅读 · 0 评论 -
JWT
上图文字来自https://jwt.io/introduction/现项目中的JWT来解析如下:左边是生成的token,左边是其三部分的解析。项目中的使用,public class JWTSignerUtil { private static final String JWT_SECRET = "密钥字符串"; private static JWTSigner sign...原创 2018-10-07 19:22:38 · 624 阅读 · 0 评论 -
并行执行任务思考
问题这篇文章由之前的并行执行任务发展而来,如何生成task,在之前的文章中,生成task方式如下:Abstract Task: public abstract class BasicUserFilter implements Callable<UserFilterDto> {private static final Log logger = LogFactory.getLog(...原创 2018-10-28 05:56:57 · 313 阅读 · 0 评论 -
CountDownLatch
CountDownLatch是java.util.concurrent包下的线程同步类,并发环境下线程对计数值减1操作,当计数值为0时,被wait阻塞的线程将被唤醒,达到线程同步.该类涉及到的主要方法:// 当前线程在计数值减到0之前一直等待,除非当前线程被中断void await()// 当前线程在计数值减到0之前一直等待,除非当前线程被中断或者超过了指定的等待时间boolean aw...原创 2019-08-12 20:01:21 · 178 阅读 · 0 评论 -
获取properties自定义资源文件
之前在项目中使用properties资源文件,主要是客户端根据服务器端抛出的异常代码,然后客户端进行处理,正好可以把这些异常代码放入properties文件中。public class Main { public static void main(String[] args) throws ClassNotFoundException { Main main = new原创 2016-11-07 23:33:21 · 857 阅读 · 0 评论 -
生产者与消费者(一)
首先谈下wait(),notify(),notifyAll(),这个三个方法都是Object里的方法,具体详细作用可以查看API文档:wait():/** * Causes the current thread to wait until another thread invokes the * {@link java.lang.Object#notify()} met原创 2016-11-06 23:40:05 · 712 阅读 · 0 评论 -
注解
Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是原创 2016-11-06 01:26:28 · 861 阅读 · 0 评论 -
流
在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行,jdk提供了各式各样的“流”类,用来获取不同种类的数据;程序中通过标准的方法输入或输出数据java.io包定义了多个流类型(类或抽象类)来实现输入/输出功能;可以从不同的角度对其进行分类:1.按数据流的方向可以分为输入流和输出流;2.按照处理数据单位不同可以分为字节流和字符流;3.按照功能不同可以分为节原创 2015-11-07 02:39:33 · 640 阅读 · 0 评论 -
多线程
并发通常是提高运行在单处理器上程序的性能,在单处理器上运行的并发程序开销确实应该比该程序的所有部分顺序执行的开销大,因为其中增加了所谓上下文切换的代价(从一个任务切换到另一个任务)。如果程序中的某个任务因为该程序控制之外的某些条件(通常是I/O)而导致不能继续执行,即阻塞,但是使用并发来编程,当其中一个任务阻塞时,程序中的其他任务还可以继续执行因此这个程序可以保持继续向前执行。但是从性能角度看,如原创 2015-11-10 17:35:18 · 1179 阅读 · 1 评论 -
dos下编译执行java程序遇到的问题
平时都是用IDE来编写运行java程序,最近需要在dos用比较传统的方式来编译运行程序,总是遇到这样的问题:网上查了很多该问题,大都是说因为环境没有配好,立马否定了,因为程序可以通过编译,已经生成了.class文件通过网上朋友的提醒,原来我是在IDE上写的程序,带上了包名路径,导致了该问题!其中比较简单的就是把包路径去掉就行了:然后再编译(javac),执行(j原创 2015-11-11 14:06:41 · 759 阅读 · 0 评论 -
Java网络编程
对于网络方面的知识在这里不作详细的介绍,读者可以参考《TCP/IP详解 I II III》等网络书籍。下面简单的谈下网络通信协议和网络通信协议接口。网络通信协议:计算机网络中实现通信必须有一些约定即通信协议,对速率,传输代码,代码结构,传输控制步骤,出错控制等制定标准。网络通信接口:为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使得彼此之间能进行信息交换。接口原创 2015-11-12 02:05:53 · 567 阅读 · 0 评论 -
java中this关键字的用法
对于this关键字,都不陌生,只要在java程序代码中都可见,下面是android中绑定按钮监听一段代码:点击(此处)折叠或打开button1.setOnClickListener(new OnClickListener() { @Override public原创 2015-11-15 04:53:28 · 1002 阅读 · 0 评论 -
Exception
异常的概念: 1.是java提供的同于处理程序中错误的一种机制2.所谓的错误是程序运行过程中发生的一些异常事件(如:除0,数组下标越界,所要读取的文件不存在3.设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为这些异常发生阻断或者产生不可预知的结果4.java程序执行的过程中如出现异常事件,可以产生一个异常类对象,该异常对象封装了异常事件的信息并将该信息提交原创 2015-10-29 23:37:36 · 395 阅读 · 0 评论 -
容器
数组是保存一组对象的最有效的方式,如果你想保存一组基本类型数据,也推荐这样方式,但是数据具有固定的尺寸,而在更一般的情况中,你在程序时并不知道将需要多少个对象,或者是否需要更复杂的方式来存储对象,因此数组尺寸固定显得过于受限了。java实用类库提供了一套想当完整的容器类来解决这个问题,其中基本的类型是List,Set,Queue和Map。下图是简单的容器分类图:(下图来自《thinking i原创 2015-10-30 22:43:59 · 470 阅读 · 0 评论 -
Object
Java中的Object是所有类的父类,是“万类之源”Class Objectjava.lang.Objectpublic class ObjectClass Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arra原创 2015-10-31 00:35:36 · 450 阅读 · 0 评论 -
Java内存分析一
如果了解java内存的使用情况,对于程序的执行情况会更加清晰。关于java内存深度解析,请读者自行参考JVM有关书籍文档,会得到更多更完善的信息。下面通过一段简单的代码来分析。首先简单介绍下JVM运行时内存数据区:第一块:PC寄存器PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。第二块:JVM栈JVM栈是线程原创 2015-10-26 02:25:10 · 466 阅读 · 0 评论 -
动态绑定一
动态绑定是java面向对象中非常重要的思想,很多java程序员不太清楚多态机制, 无疑会导致对多态理解程度不够,下面通过代码以及在内存中的执行过程来分析动态绑定,如有错误不当之处,请读者指正!点击(此处)折叠或打开public class Animal { private String name;原创 2015-10-27 13:29:04 · 477 阅读 · 0 评论 -
内部类一
关于java的内部类,尤其匿名类,会感到无法理解,下文简单实验总结一下。由于内部类涉及很多知识,其中很多没有涉及到。如有表述代码错误,欢迎读者指正!那为什么使用内部类呢?《thinking in java》第十章中,指出:一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象,所以可以认为内部类提供了某些进入其外围类的窗口。其最吸引之处,每个内部类都能独立的继承自一个原创 2015-10-24 20:03:05 · 484 阅读 · 0 评论 -
多态一
前面的文章简单的分析了动态绑定机制,http://blog.itpub.net/29876893/viewspace-1816523/,但是也许有很多疑问,下面介绍下子类如何调用自己的方法或我们阻止多态。修改的代码如下:点击(此处)折叠或打开public class Animal { public String name;原创 2015-10-27 18:48:43 · 497 阅读 · 0 评论 -
synchronized与volatile
对于关键字synchronized,volatile并不是太陌生,在多线程中会处理同步(数据争用)问题,下面简单的介绍下这两种关键字的用法。该内容摘自慕课网上MartonZhang老师课程,http://www.imooc.com/learn/352。synchronized:可以实现共享变量可见性,并且是原子性操作(同步),是同步锁volatile:可以实现共享变量可见性,但原创 2016-11-05 01:27:42 · 798 阅读 · 0 评论 -
反射
关于反射的基本知识点这里不多介绍,记得自己开始学习Java的时候,是在dos下执行命令来运行程序。下面来重温下:在记事本中写一个简单的类,然后在dos下执行,我想基本的命令使用过得都很清楚:文件夹中会看到a.class文件,编译后生成的Java字节码文件,那么里面到底是啥呢?用Java提供的一个反编译工具javap命令查看:上面生成的Java字节码,可以被JVM读取原创 2016-11-05 18:12:45 · 630 阅读 · 0 评论 -
String对象的equals()与 = =
最近看了网上有人说,String对象的equals()与==的区别,不知道两者到底有什么区别,如果真的要彻底搞清楚,我们还是从“万类之源”说起,点击打开链接这是之前写关于Object的一篇文章,现在我们还是从源码入手(当然结合API更好)。下面还是分析Object类中的equals()方法,关于源码如何获取上篇文章已经说的很清楚。下面是Object类中的equals():原创 2015-11-06 00:51:16 · 523 阅读 · 0 评论