Java
文章平均质量分 57
lijie_cq
It's never too old to learn
展开
-
使用websocket遇到的一个小问题 The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is an invalid stat
当使用websocket,向前端实时推送消息的时候,遇到如下异常:2018-06-29 13:42:55 ERROR 988 --- [container-699] org.springframework.data.redis.listener.adapter.MessageListenerAdapter : [TxId : , SpanId : ] Listener execution...原创 2018-06-29 15:23:14 · 30890 阅读 · 4 评论 -
Aspectj的使用demo
aop编程就是使用了动态代理,但是spring的aop来做面向切面编程会比较麻烦,Aspectj这个包也提供了类似于spring的aop编程,通过注解来配置以及表达式的配置实现并且可以动态给对象添加方法(但是要做类型转换),用起来十分方便介绍下下面5个注解:1.@Before 前置通知,在方法执行前调用2.@AfterReturning 返回通知,在方法返回结果之后调用3.@AfterThr原创 2017-11-25 22:34:21 · 1532 阅读 · 0 评论 -
java注解结合aspectj AOP进行日志打印
在很多系统开发中,我们希望在指定的方法调用之前或者之后能打印出该方法的调用时间以及方法的出参和入参,就可以使用spring的AOP,还可以结合自定义的注解进行进行一些指定参数的打印例如:一个分层的架构系统,每层都有自己的指定系统名字,并且每个方法都有自己指定的作用(通过注解指定,在切面的时候取出该参数),而且可以根据注解的指定日志类型(在注解中指定,在切面的时候取出参数进行判断,然后打印相对应的日志原创 2017-11-24 17:40:18 · 2843 阅读 · 1 评论 -
spring的自定义属性编辑器CustomEditorConfigurer
可能很多人跟我遇到同样一个问题,在老版本的spring下用CustomEditorConfigurer自定义编辑器的时候没问题,当升级spring版本之后,就会报错,错误:Failed to convert property value of type 'java.util.LinkedHashMap' to required type 'java.util.Map' for property 'c原创 2017-11-25 17:32:00 · 1683 阅读 · 1 评论 -
Dubbo分布式日志追踪
很多互联网公司都用的dubbo分布式框架进行微服务的开发,一个大系统往往会被拆分成很多不同的子系统,并且子系统还会部署多台机器,当其中一个系统出问题了,查看日志十分麻烦所以我们需要一个固定的流程ID和机器ip地址等来把所有的日志穿起来,当然可以通过调用其他接口时参数进行传递,但是这样子对代码的耦合性太强,对代码有侵入性。我们可以通过dubbo的filter 结合slf4j的MDC或者log4j2的原创 2017-11-24 18:22:50 · 8530 阅读 · 2 评论 -
Dubbo分布式日志追踪,多线程不能获取窜ID和IP问题
接着上一篇日志,当用MDC或者ThreadContext来put或者get数据的时候,不同线程是获取不到的,他们都是ThreadLocal维护,所以线程独立。如果需要子线程获取则将参数传入,在Thread的run方法执行的时候将传入的ID和IP都put到MDC或者ThreadContext中。这里使用ThreadContext:<context:component-scan base-packa原创 2017-11-24 20:39:38 · 3990 阅读 · 0 评论 -
java虚拟机钩子关闭函数addShutdownHook
当jvm虚拟机被关闭的时候,可能我们需要做一些处理,比如对连接的关闭,或者对一些必要信息的存储等等操作,这里就可以借助于虚拟机提供的钩子函数,当jvm虚拟机关闭之前会去调用addShutdownHook注册的线程钩子。这里做一个小实验,项目结构如下:1.自定义的ApplicationContext的上下文package cn.lijie;public class ApplicationConte原创 2017-11-24 14:49:49 · 3639 阅读 · 0 评论 -
口水话spring bean注入的执行过程
首先说下这几个接口:1.BeanNameAware bean实现这个接口可以获取该bean的id2.BeanFactoryAware bean实现这个接口可以获得bean工厂3.InitializingBean (耦合性高)(注解 @PostConstruct) 类似于init-method 但是在init-method之前执行4.DisposableBean (耦合性高)(注解原创 2017-11-24 13:01:58 · 3980 阅读 · 0 评论 -
spring+springmvc+mybatis+shiro+ehcache集成demo
实际使用shiro的时候大部分都是和spring等框架结合使用,主要就是配置web.xml将shiro的filter和spring容器bean的filter关联起来,生命周期由servlet容器来控制,然后配置shiro的spring的xml文件,其中主要配置shiro过滤器securityManager、认证成功失败的跳转页面、过滤链、凭证匹配器(hash 还是 sha1等)、自定义的realm、原创 2017-12-12 14:19:33 · 3447 阅读 · 0 评论 -
shiro权限框架简单入门demo
shiro和spring security都是开源的权限框架,shiro相对于spring security来说更简单学习成本更低,并且提供的API也明了,下面是shiro官方的一个图:其中把上面的东西抽象出来主要分为几个块(网上找的文档抠出来的):1.SubjectSubject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是原创 2017-12-11 15:42:38 · 6273 阅读 · 0 评论 -
java反射之包装类和基础数据类型的坑(分享个反射工具方法)
在java项目中我们会经常用它的反射机制做一些工具类或者代码层面的架构比如:一些路由的场景,需要根据一个反射的工具类(参数需要反射的对象,调用的方法名,以及参数),取出路由的消息并且根据消息带的方法名字和一些参数来调用对应的业务处理的方法。这个工具类大体如下:public static <T> T methodInvoker(Object target, String methodName, Obj原创 2017-12-13 23:16:25 · 7060 阅读 · 2 评论 -
InheritableThreadLocal和ThreadLocal
之前在Dubbo分布式日志中,当在子线程中使用ThreadContext或者MDC时候发现根本取不到值,是因为这两个都是ThreadLocal变量。其中ThreadLocal类有个子类InheritableThreadLocal它对ThreadLocal进了增强,当主线程变量用InheritableThreadLocal去包裹,后面子线程再通过get()方法获取主线程之前set的值发现能获取到,因为原创 2017-12-14 14:53:49 · 615 阅读 · 0 评论 -
Lock、synchronized和ReadWriteLock的区别和联系以及Condition
在java多线程编程中,可能我们经常会遇到线程同步的问题,可以使用synchronized或者Lock去控制同步锁,他们都能实现线程的同步,下面来分析下这两种方式的区别:1.synchronized可以锁住一个方法或者一段代码块,伪代码如下://锁住方法public synchronized void test(){ doSomething...} //锁住代码块public sync原创 2016-11-18 00:20:03 · 6308 阅读 · 3 评论 -
JDK7与JDK8中HashMap的实现
转载自: Hosee 的博客 - JDK7与JDK8中HashMap的实现JDK7中的HashMapHashMap底层维护一个数组,数组中的每一项都是一个Entrytransient Entry<K,V>[] table;我们向 HashMap 中所放置的对象实际上是存储在该数组当中; 而Map中的key,value则以Entry的形式存放在数组中sta...转载 2017-12-22 23:37:35 · 368 阅读 · 0 评论 -
JVM的堆和栈以及GC算法的介绍
JVM就是java虚拟机,我们可以把它理解成一个操作系统,每个不同的平台都有不同的JVM,比如linux系统和windows系统,就是因为这个原因所以java程序就有了一个很突出的特性就是 跨平台性其中JVM中的堆和栈这两个东西以及它的垃圾回收机制是我们平时遇到得最多的,那么下面就介绍一下JVM的堆栈以及GC。1.JVM的堆栈栈:在jvm中栈用来存储一些对象的引用、局部变量以及计算...原创 2017-03-04 17:17:11 · 10522 阅读 · 4 评论 -
volatile关键字和synchronize关键字
在java多线程中估计会经常见到volatile和synchronize这两个关键字,今天做个笔记记录下两个关键字的区别:synchronize:synchronize关键字我们遇到的概率很大(虽然现在基本上都用重用锁ReentrantLock),它可以去修饰方法或者代码块,可以用一个对象去做锁或者用类class做锁,也就是对象锁和类锁,最好不要使用常量做锁的关键字例如字符串,这样很可能会原创 2018-02-01 18:52:46 · 1453 阅读 · 0 评论 -
spring事务传播属性和隔离级别
转载自:https://www.cnblogs.com/jimmy-muyuan/p/5722708.html1 事务的传播属性(Propagation)1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if none exists. 如果存在一个事务,则支持当前事务。如果没有事务则开启一转载 2018-01-31 17:16:13 · 1320 阅读 · 0 评论 -
java自定义ClassLoader加载指定的class文件
继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo首先定义一个类,比如MyTest,并且将其编译成class文件,然后放到一个指定的文件夹下面,其中文件夹的最后几层就是它的包名,这里我将这个编译好的类放到 : /Users/allen/Desktop/cn/lijie/MyTest.cla原创 2017-12-07 18:56:17 · 23366 阅读 · 2 评论 -
dom4j对多个xml进行合并
当我们开发一些程序的时候,可能会自定义xml来对程序进行配置,但是只使用单个xml来配置可能会遇到一个问题,到后期有可能xml配置文件越来越大越来越长,比较难以维护,那就可以将单个xml文件按照情况进行拆分,启动的时候再将其合并。比如,有个配置的xml:<?xml version="1.0" encoding="UTF-8"?><tube-router> <other>xxx</other原创 2017-12-06 19:34:04 · 3912 阅读 · 0 评论 -
逆波兰表达式
之前风控变量的计算引擎用的国内一个开源的IKExpression(为了让变量的计算可配置化),IKExpression的架构如下:其中表达式编译和执行模块就是利用的逆波兰表达式计算,逆波兰表达式是在大学的编译原理中学习的。举个例子:如果计算机计算如下表达式:1+(2*3-4)/2如果不按照逆波兰式,计算机可以先对上面表达式进行解析生成一个符号树:如果对这个求值的话就需要从叶子节点往根节点递归求值,原创 2017-12-15 17:15:12 · 1751 阅读 · 0 评论 -
java多线程中的CompletionService
在java编程的时候,可能我们会经常遇到多线程的处理问题有些时候只需要创建子线程让其执行一些逻辑,但是不需要返回数据,那就可以用Thread或者Runnable来实现就行而有些时候需要创建多个子线程去执行逻辑,并且执行完成后需要拿到返回数据,就可以使用Callable当我们使用线程池去提交Callable线程任务就可以拿到线程执行的应用Future对象,如果不使用CompletionService原创 2017-11-28 00:49:03 · 632 阅读 · 0 评论 -
concurrent包下的CyclicBarrier和CountDownLatch以及Semaphore
CyclicBarrier:它可以让多个线程中执行得快的线程在某一个时间点阻塞,然后等待最后一个线程执行到该点的时候,同时往下执行。示例代码:public class CyclicBarrierDemo { static class Runner implements Runnable { private CyclicBarrier barrier; priv原创 2017-12-23 20:13:15 · 309 阅读 · 0 评论 -
在多线程中注入spring对象
以前一般很少用多线程处理些问题,今天遇到一个问题,在kafka的消费端,我是启的多线程去消费kafka的数据,其中在多线程的业务代码中注入了server层的对象,但是在实际执行的时候却发现注入不了,然后检查spring的xml 包扫描的配置,发现配置没有问题,后面才发现在多线程的线程内部不能注入spring容器所管理的对象,细想一下: 应该是因为在web容器启动的时候,spring并不能感知还未执...原创 2017-06-23 01:16:05 · 9231 阅读 · 2 评论 -
setting.xml配置文件详解
转载自:Maven之(六)setting.xml配置文件详解maven整体详解<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"转载 2017-12-19 18:57:29 · 827 阅读 · 0 评论 -
java处理线程阻塞的小技巧
在java中我们使用多线程去处理一些业务,如果业务比较复杂且当并发量有挺大的时候,很有可能出现线程阻塞的问题。案例: 有一个触发接口,根据触发的信息内部开启多个线程去执行业务,每个线程都会去执行两种业务:私有业务(比如调用不同的接口)、公共业务(比如执行存储、mq发送等等),当私有业务处理时间很快而公共业务处理时间比较长,这样的情景下就可以把私有业务和公共业务分到不同线程执行。例如: 当触发了原创 2017-11-29 14:27:04 · 16424 阅读 · 0 评论 -
aes、base64转码、Json转换、md5工具类demo
demo包含如下几个类:1.AesUtils:package com.lijie.utils;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import ja原创 2017-02-21 10:57:39 · 1898 阅读 · 0 评论 -
maven项目 -Dmaven.multiModuleProjectDirectory system propery is not set错误
当使用maven工程报如下错误:-Dmaven.multiModuleProjectDirectory system propery is not set解决方法如下:在eclipse里面选择window,然后选择Preference,在输入框中输入installed,然后按照如下图设置即可: 前提是环境变量设置了M2_HOME,指向的是maven的目录,我这里如下设置:搞定!原创 2017-02-21 10:47:59 · 1244 阅读 · 0 评论 -
java多线程中CountDownLatch的介绍
今天在看使用zookeeper实现简单分布式锁的文章中看到了CountDownLatch这个类,但是以前没有用过就自己学习了下。CountDownLatch类是一个同步工具类,它允许一个或者多个线程一直等待直到其他线程执行完成之后然后再执行。其中countDown()方法是当一个被等待的执行线程数执行完成了之后减1,await()是让调用函数被阻塞,直到被等待的线程执行完成countDown()减为原创 2016-11-16 16:31:21 · 911 阅读 · 0 评论 -
java的反射基础笔记
反射reflect 1.1 Class(描述类的类) 获得类对象的三种方式1.1.1 通过字符串的类名获取 Class c = Class.forName(“com.direct.Person”); 1.1.2 通过类.class来获取 Class c = Person.class; 1.1.3 通过对象.getClass()来获取 Pe原创 2016-10-12 20:30:47 · 363 阅读 · 0 评论 -
java生产者与消费者经典案例小demo
经典生产者消费者问题: 场景: 1.模拟生产者生产电脑放到仓库里面,但是仓库只能存放100台电脑,仓库满了生产者等待消费者消费再生产。 2.消费者从仓库里面取出电脑,但是仓库中没电脑时等待生产者生产再取。 3.模拟3个生产者和3个消费者线程同时运行。程序结构如下: 1.仓库类package com.lijie.bean;/** * 仓库 * @author lijie * */p原创 2016-10-12 19:51:43 · 1195 阅读 · 0 评论 -
generatorSqlmapCustom逆向工程mybatis
maimport java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.config.Configuration原创 2016-06-28 15:04:50 · 4398 阅读 · 0 评论 -
mybatis简单测试增删改查
mybatis入门测试程序1.SqlMapConfig.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>原创 2016-06-20 10:34:41 · 1294 阅读 · 0 评论 -
jdbc连接数据库
jdbc连接数据库package com.lijie.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class JdbcTe原创 2016-06-17 15:12:18 · 464 阅读 · 0 评论 -
springmvc和spring的父子容器关系
–spring (Service dao) 父容器 | springmvc (controller) 子容器子容器可以访问父容器对象,但是父容器不能访问子容器对象。applicationContext-service.xml中:context:component-scan base-package="com.lijie原创 2016-06-29 09:58:05 · 1113 阅读 · 2 评论 -
HttpClient get和post请求的示例代码以及防乱码处理
请求别人发布的服务我们可能就会使用到HttpClient这个包,HttpClient就是一个支持 HTTP 协议的客户端编程工具包,用来模拟浏览器请求。乱码解决方法:就是给HttpGet对象或者HttpPost对象添加头部,如下所示://设置请求的报文头部的编码obj.setHeader(new BasicHeader("Content-Type", "application/x-www-fo原创 2017-02-22 22:39:20 · 26537 阅读 · 2 评论 -
RestFul接口的安全验证事例
这次要写一些restful的接口,在访问安全这一块最开始我想到用redis存储模拟session,客户端访问会带token过来模拟jsessionid,然后比对,但是这样会让token暴露在网络中,很不安全而且没有意义。其实可以用签名的方法来解决这个问题:首先:client开通服务的时候,server会给它创建authKey和一个token,authKey相当于是公钥可以暴露在网络中,token是私原创 2017-02-23 23:25:17 · 13544 阅读 · 12 评论 -
java的System.getProperty()方法可以获取的值
转自:http://blog.csdn.net/kongqz/article/details/3987198Java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚转载 2017-04-01 18:54:40 · 491 阅读 · 0 评论 -
ThreadLocal简单测试
ThreadLocal包装变量可以让每个执行的线程都拥有一份独立的引用,其中ThreadLocal使用键值对方式进行记录,key就是对象的名字。详细介绍可以看:http://blog.csdn.net/lufeng20/article/details/24314381下面写个小案例:创建一个测试类,注入spring容器:@Componentpublic class Work implements原创 2017-11-28 19:48:20 · 858 阅读 · 1 评论 -
assembly将properties打到外面并用spring加载 (以dubbo为例)
估计很多朋友用assembly打包的时候可能会遇到一个问题,就是将包打成lib (放jar包),conf(放properties配置文件)和bin(启动bash)三个目录的时候,将工程中的properties配置文件打包到conf目录下,然后lib中的jar包就将那些properties排除掉,当启动方法的时候会发现找不到配置文件了,这是因为配置文件的目录之前在开发的时候用的是classpath,当原创 2017-09-04 23:04:42 · 3629 阅读 · 1 评论 -
使用ReentrantLock两个方法的互斥访问
场景现在有多个线程需要对两个方法都进行访问(一个方法名为test1,一个方法名为test2),但是有个要求:同一个时间只能两个方法互斥访问,而且两个方法可能在不同的类里面。就是多个线程只要有一个线程访问test1方法,那么其他线程test1和test2方法都不能访问,相反一样。可能有人会想到synchronized关键字,但是如果两个方法是在同一个类中,这种办法能行得通,万一不在同一个类中,那用s原创 2017-09-25 13:08:55 · 1160 阅读 · 0 评论