java-ee
java-ee 标签描述

一当我们谈领域驱动设计的时候,到底在谈论什么? 当我们接触到一块未知的业务时,要想搞清楚它,首先需要把问题的边界定义好,针对一个没有边界的问题去找解决方案时无从下手的。这里问题的边界对应到DDD就是领域的边界。 对于某些业务场景的时候,需要不同的角色、不同的事件和命令一起配合才能完成,这里就需要在领域内找到所有的角色(领域实体)、所有的事件(领域事件)、所有的命令(领域服务); 还需要做更进一步的子问题的拆分,这样可以将问题具体化、更聚焦,对需要找的解决方案也可以更有落地实施的可能性。这里拆分...

  qbian   2021年01月20日   309   3   1 java-eedubbojava领域驱动设计

一背景 软件开发初期,需求相对简单和明确,开发出来的应用只需要满足需求能够快速上线就好,这个时候的应用在代码和业务逻辑上都比较清晰。 随着业务的不断增长,各种各样的需求也接踵而至。有倒排需求(时间紧,项目周期根据上线时间点往前推)、紧急需求(可能是某个业务逻辑漏洞需要立刻修复上线)、定制化需求(为了某种特殊场景提出的定制化功能),当这些需求不断在应用上实现,应用内会存在大量ifelse的代码,就算引入了良好的设计模式,也会使应用越来越臃肿,最后难以维护。 随着时间的推移,公司人员的变动也是...

  qbian   2020年12月09日   356   3   5 java-eejavaspring

一测试demo 我们先来写一个测试demo java publicclassSimpleDateFormatTest{ privatestaticfinalSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); staticclassParseDateimplementsRunnable{ inti=0; ParseDate(inti){ this.i=i; } @Override publicvoidrun(){ try{ Datedate=sdf.parse("2018-08-2810:10:"+i%60); ...

  qbian   2019年11月12日   121   1   0 java-eejava

RabbitMQ是AMQP(高级消息队列协议)协议的一种实现,RabbitMQ的基本讲解也就是围绕着AMQP协议的讲解。 一角色讲解 1.1消息代理(messagebrokers):大家可以理解为RabbitMQ服务器,起到了消息接收,持久化和转发等作用。 1.2发布者(publishers)或生产者(producers):消息的产生来源,具有生产消息的角色。 1.3消费者(consumers):消息的接收者,消费消息的角色。 1.4交换机(exchange):用于接收生产者生产的消息...

  qbian   2019年11月12日   69   1   0 rabbitmqjava-eejava

一消息为什么丢失 RabbitMQ默认情况下的交换机和队列以及消息是非持久化的,也就是说在服务器重启或者宕机恢复后,之前创建的交换机和队列都将不复存在,之前未消费的消息也就消失不见了。原因在于每个队列和交换机的durable属性。该属性默认情况是false,它决定了RabbitMQ是否需要在崩溃或者重启之后重新创建队列(或者交换机)。 二持久化交换机和队列 将交换机和队列的durable属性设置为true,这样你就不需要在服务器断电后重新创建队列和交换机了。你也许会认为把队列和交换机的durable属性设置为true就足够可以让消息幸免于重启后丢失了,真的是这样吗?队列和交换机当然必须被...

  qbian   2019年11月12日   66   1   0 rabbitmqjava-eejava

一消息代理(RabbitMQserver)配置 代码示例: js finalstaticStringBINDING_KEY="binding_key";//bindingkey publicfinalstaticStringROUTING_KEY="binding_key";//routingkey publicfinalstaticStringEXCHANGE_NAME="exchange_a";//交换机名 finalstaticStringQUEUE_NAME="queue_a";/...

  qbian   2019年11月12日   95   1   0 rabbitmqjava-eejava

一为什么用单例模式 单例模式是设计模式中使用最为普便的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。在java中,这样的行为能带来量大好处: 1.对于频繁使用的对象,可以省略new操作花费的时间; 2.由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻gc压力,缩短gc停顿时间; 二单例模式的实现方式 2.1饿汉模式 java publicclassSingleton{ privateSingleton(){ System.out.println("Singletoniscreate."); } private...

  qbian   2019年11月12日   73   1   0 java-eejava

记录一次大版本上线后回滚的案例 一问题 一个大版本的迭代,保存到Redis中的缓存数据实体类增加了一些属性,就用了一个子类继承旧实体类。获取缓存数据时可以通过Redis的class类型判断是新数据,如果不是,就用旧实体类序列化,代码如下: 旧的实体类 java classOldEntity{ //旧的属性 privateIntegerage; } 新的实体类 java classNewEntityextendsOldEntity{ //新增属性 privateStringname; } 从Redis获取数据,适配旧数据 java Map<byte[],byte[]loadedHa...

  qbian   2019年11月12日   73   1   0 tomcatjava-eeredis

一问题 我们的待序列化对象上有getXxx或setXxx等方法时,fastjson的JSONObject.toJSONString()方法默认会认为我们存在xxx这个属性,在序列化的时候就会帮我们序列化出xxx这个属性来。 例子 java publicclassUser{ privateStringname; privateIntegerage; publicStringgetDesc(){ returnname+":"+age; } } 序列化结果 json { "name":"xxx", "age":20, "desc":"xxx:20" } 二解决方法 JSONOb...

  qbian   2019年11月12日   169   1   0 jsonjava-eejava

一PDF转图片 1.1maven配置 js <dependency <groupIdorg.apache.pdfbox</groupId <artifactIdpdfbox-app</artifactId <version2.0.2</version </dependency 1.2具体代码 java packagecom.qbian.util; importorg.apache.pdfbox.pdmodel.PDDocument; importorg.apache.pdfbox.rendering.PDFRenderer; importorg.slf4j.Logger; impo...

  qbian   2019年11月12日   77   1   0 java-eejava

一背景 在构建网关应用时,为了快速响应客户端,一般我们会将业务中台接口响应内容压缩后返回给客户端调用者。 二方案 2.1判断客户端是否支持压缩流 根据客户端请求头的accept-encoding是否包含gzip来判断客户端是否支持压缩流的读取。 java publicBooleanisGzipRequested(){ Collection<Stringvalues=headers.get("accept-encoding"); if(ObjectUtils.isEmpty(values)){ returnBoolean.FALSE; } for(Stringvalue:values)...

  qbian   2020年01月07日   130   2   0 tomcatjava-eejava

一问题 向redis中保存hash数据类型时,保存的对象中有Map类型的属性,切Map的key是Integer类型,在从redis中将数据取出反序列化的时候,Map的key会变为String类型。 例子 java publicclassTest{ privateStringname; privateIntegerage; privateMap<Integer,Stringmaps; } 将以上对象保存到redis的hash数据类型中。 取出结果 json { "name":"xxx", "age":20, "maps":{ "1":"aaa",//这里的key变为了String类...

  qbian   2019年11月12日   93   1   0 java-eeredis

一概念 作为一名javaEE开发者,我们最常用到的可能就是http协议了,但是我们对http协议及其之下的各层协议真的清楚嘛。现在我们就来大概的了解一下。 1.1应用层-HTTP 1.2传输层-TCP 1.3网络层-IP 二应用层-HTTP 一个http请求包含三个组成部分: 1.方法-统一资源标识符(uri)-协议/版本 2.请求的头部 3.主体内容 以下是一个http请求的例子: js POST/test/index.jspHTTP/1.1 Accept:text/plain,text/html Accept-Language:zh-CN,zh;q=0.8,en;q=0.6...

  qbian   2019年11月12日   74   1   0 tomcatnettyjava-eeajax

一背景 好多情况下我们会将高质量的网页分享给微信好友或分享到朋友圈供更多的朋友看到。这里就需要用到微信提供的jssdk的分享接口了。今天刚好做了这功能,期间也遇到了一些坑,在这里纪录一下。 在开始之前你的准备工作有哪些 微信公众号平台 有域名的服务器 二在公众号平台绑定域名 登录微信公众号,在左侧的菜单栏:公众号设置功能设置js接口安全域名(如下图所示)。在这里绑定你的域名,需要注意的是,微信分享的网页仅支持80(http)端口和443(https)端口,所以你分享的访问页面需要部署在这...

  qbian   2019年11月12日   94   1   0 html5java-eejavascript微信微信开放平台

一一次执行定时器 定时器的实现原理就是新开一个子线程执行定时任务。 一次执行定时器的时间如果在当前时间以前会立即执行任务,如果在未来时间,则会到指定的未来时间再执行任务。 示例代码: java publicstaticvoidmain(String[]args){ try{ SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); DatedateRef=sdf.parse("2017-06-0815:00:00"); newTimer().schedule(newTimerTask(){ @Ove...

  qbian   2019年11月12日   56   1   0 java-eejava

线程之间只是简单的等待和唤醒并不能满足我们的需求,如果能让多个线程之间实现数据传输的话就更容易满足多变的需求了。 java中提供了各种各样的输入/输出流stream,是我们能够很方便的对数据进行操作,其中管道流pipeStream是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而无需借助于类型临时文件之类的东西。 在java的jdk中提供了4个类来使线程间可以进行通信: 1.PipedInputStream和PipedOutputStream(用于传输字节流) 2.PipedReader和Pipe...

  qbian   2019年11月12日   64   1   0 java-eejava

关键字synchronized与notify()/notifyAll()方法相结合可以实现等待/通知模式,类ReentrantLock也可以实现同样的功能,但需要借助于Condition对象。 在使用notify()/notifyAll()方法进行通知时,被通知的线程却是由JVM随机选择的。但使用ReentrantLock结合Condition类是可以实现“选择性通知”,这个功能是非常重要的,而且在Condition类中是默认提供的。 synchronized就相当于整个Lock对象中只有一个单一的Condition对象,所有的线程都注册在它一个对象的身上。线程开始notifyAll()时...

  qbian   2019年11月12日   65   1   0 java-eejava

Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存和回收分配给对象的内存。 一分配内存 1.1新生代和老龄代 对象的内存分配主要就是在堆上进行分配。所以我们先来看一下堆内部布局,堆可以划分为两大块内存:新生代和老龄代,如下图所示: ![堆内存布局](https://static.developers.pub/堆内存布局-新生代-老龄代.png) 堆内存大小=新生代+老龄代 针对新生代和老龄代的垃圾回收分别称为MinorGC和MajorGC/Fu...

  qbian   2019年11月10日   1086   2   0 java-eejvmjava

一对象的创建 Java语言是一门面向对象语言,在程序运行过程中无时无刻都有新的对象被创建出来。在Java程序中,创建对象的方式有多种,除了最常用的new关键字外,我们还可以通过反射机制、Object.clone方法、反序列化以及Unsafe.allocateInstance方法来新建对象。 其中,Object.clone方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段。Unsafe.allocateInstance方法则没有初始化实例对象字段。而new语句和反射机制则是通过调...

  qbian   2019年11月10日   1108   2   0 java-eejvmjava

一运行时数据区域 ![JVM内存模型](https://static.developers.pub/JVM内存模型.png) 类加载器加载的class字节码保存到JVM内存的方法区,实例化类对象时在堆内存中生成对象信息,调用对象的方法时会在栈内存将方法进行压栈,如果发生线程切换,会将当前线程栈内存中调用信息保存到程序计数器中,当前线程获得CPU执行权时,将程序计数器中上次调用信息获取到,继续上次的位置接着执行。 二详解 2.1方法区 方法区是线程共享的一块内存区域,它用于存储已被虚拟机...

  qbian   2019年11月10日   1055   2   0 java-eejvmjava