- 博客(495)
- 收藏
- 关注
原创 RabbitMQ消息可靠性(二)-- 消费者消息确认
设置false,就是告诉服务器,我已经知道这条消息数据了,因为一些原因拒绝它,而且服务器也把这个消息丢掉就行。下次不想再消费这条消息了。因为很多伙伴之前给我评论反应,他们需要这个消费者项目里面,监听的好几个队列都想变成手动确认模式,而且处理的消息业务逻辑不一样。消费者收到消息后,手动调用basic.ack/basic.nack/basic.reject后,RabbitMQ收到这些消息后,才认为本次投递成功。如果是true,也就是说一次性针对当前通道的消息的tagID小于当前这条消息的,都拒绝确认。
2023-09-15 17:13:13
281
原创 RabbitMQ消息可靠性(一)-- 生产者消息确认
在项目中,引入了RabbitMQ这一中间件,必然也需要在业务中增加对数据安全性的一层考虑,来保证RabbitMQ消息的可靠性,否则一个个消息丢失可能导致整个业务的数据出现不一致等问题,对系统带来巨大的影响,消息的可靠性可以主要在三个方面去考虑:生产者消息确认,消费者消息确认,消息持久化,这篇文件说明生产者消息确认的。
2023-09-15 16:01:47
378
原创 IDEA 设置为护眼的豆沙绿
这个时候,可以看到,只有代码区域别成了护眼色,其他地方还是白的刺眼,我们来一个一个的解决掉。先在上面 RGB 处配置好,然后点 Choose,然后如下图,点击 OK。先打开 IDEA 的设置界面,然后按照下图按顺序店了设置就可以了。然后会发现,左侧的文件栏也变成护眼色了。
2023-08-18 11:14:24
174
原创 windows连接VPN提示参数错误
平时连接VPN都可以连接,VPN服务器也没有修改过任何的配置,但是就是连接不上,一直提示连接参数错误,有些电脑可以但有些又不行,一开始以为自己的路由器问题,后面想想都路由都没有做限制怎么会转发不出去呢,经过一番资料的查找,终于解决!注意,是服务器本身的配置无问题,可以正常连接的情况!卸载完成后,点击网络适配器,选择 扫描检查硬件改动。
2023-08-16 11:14:07
112
原创 powerdesigner各种字体设置;preview字体设置;sql字体设置
Tools------>Display Prefrences------>Table------->Format--------->Modify------->Font-------->根据Symbol选项不同改变字体的大小。tools —> general options —> fonts --> code editor ,选择字体样式及大小即可。tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可,同下图。
2023-08-04 10:21:15
990
原创 PowerDesigner 把name写到Comment 和 把Comment写到name中
在使用PowerDesigner对数据库进行概念模型和物理模型设计时,一般在NAME或Comment中写中文,在Code中写英文。就可以了,是对整个CDM或PDM进行操作。关闭弹窗后,查看是否把name值复制到Comment中。将代码Copy进去,点击弹窗下方的。以下两段代码都是VB脚本,在。
2023-08-04 09:33:57
127
原创 PowerDesigner16.5安装教程
是Sybase的企业建模和设计解决方案,采用模型驱动方法,将业务与IT结合起来,可帮助部署有效的企业体系架构,并为研发生命周期管理提供强大的分析与设计技术。PowerDesigner独具匠心地将多种标准数据建模技术(UML、业务流程建模以及市场领先的数据建模)集成一体,并与 .NET、WorkSpace、PowerBuilder、Java™、Eclipse等主流开发平台集成起来,从而为传统的软件开发周期管理提供业务分析和规范的数据库设计解决方案。
2023-08-02 15:06:38
207
转载 Java实现Excel导入和导出
本次工具类的封装主要依赖于阿里巴巴的JSON包,以及表格处理的POI包,所以我们需要导入这两个库的依赖包,另外,我们还需要文件上传的相关包,毕竟我们在浏览器页面,做Excel导入时,是上传的Excel文件。对于有的枚举数据,通常我们导入的时候,表格中的数据是值,而在数据保存时,往往用的是键,比如:我们用sex=1可以表示为男,sex=2表示为女,那么我们通过配置也可以达到导入时,数据的自动映射。在做页面数据导入的时候,如果某行存在错误,一般我们会将原始的数据拿出来分析,为什么会造成数据错误。
2023-06-25 10:23:48
255
原创 并发——线程池优于new Thread
每次new Thread的时候,都会创建一个单线程,但是,我们在项目中基本都是使用线程池,本文主要整理了线程和线程池的优缺点。
2023-06-12 14:36:26
661
原创 并发——同步访问共享的可变数据
按照这种观点,对象被创建的时候处于一致的状态,当有方法访问它的时候,它就被锁定了。虽然语言规范保证了线程在读取原子数据的时候,不会看到任意的数值,但是它并不保证一个线程写入的值对于另一个线程将是可见的。同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或代码块的每个线程,都看到由一个同步锁保护的之前所有的修改效果。因为 voletile 只可见,不提供互斥,而 count++ 实际上是3个动作,先读取count 值,然后+1 ,最后写回到count 值。以下代码可以做个试验。
2023-06-10 16:44:48
704
原创 通用程序设计——将局部变量的作用域最小化
如果不细心的话,好像真的很难发现“复制-粘贴”引发的这个问题:第二个 while 循环的条件中使用了之前的变量 iterator,而不是它应该使用的 iterator1(粘贴后遗漏了变量的修改)。第二个 for 循环使用了和第一个 for 循环一模一样的代码,连 iterator 这个变量也不需要修改了。(容许我尴尬一下,在写这篇文章之前,我一直用的上面这种 for 循环格式。但这种写法仍有改进的地方,因为从字节码的角度来看,每次循环都要调用一次。否则的话,变量的作用域要么开始的太早,要么结束的太晚。
2023-06-09 14:27:44
476
原创 通用程序设计——当心字符串连接的性能
为连接 n 个字符串而重复使用+操作符,需要n的平方级的时间。这是由于字符串是不可变的,每次操作都是拷贝他们的内容,合并到一个新的 String 实例中。最后,+自动优化是jdk 提供优化的,但并不是标准,所以不存在一定会优化,也不一定会优化到什么程度,所以,把自己代·码写好才是最根本的。+ 除了表示基本数据的加法计算之外,也可用作字符串连接操作符,任何类型都可以和字符串使用+来合并为一个新的字符串。但自动优化能做的毕竟是有限的,有些场景是无法被自动优化的,这时候需要手动来处理,避免频繁使用+操作。
2023-06-04 18:53:46
69
原创 通用程序设计——如果需要精确,避免使用float和double
BigDecimal , 但要注意一点,BigDecimal 初始化小数的时候要使用字符串来初始化,如果用 double 初始化,比如初始化上面的0.1 的时候,在初始化阶段就已经丢失精度了,后续 BigDecimal 已经无能为力了。或者说如果你的系统中对钱有明确下限,就用它做单位来存储计算,当然, BigDecimal 也有优点,可以自由控制舍入问题,它允许从多种舍入方案中选择,比如常见的四舍五入,银行家舍入法,五舍六入 远零舍入,近零舍入 等,可以根据需要完成舍入,具体各种舍入可以参考文档。
2023-06-04 17:11:42
586
原创 通用程序设计——基本类型优先于包装类
java 默认对 Integer 的 -128~127做了缓存,所以两个1用的是同一个实例,而221则使用了不同的 Integer 实例,而且,即便是1,也可以构建出不同来。另外,如果不注意自动装箱拆箱问题,也可能造成性能下降,虽然拆箱装箱性能差异在系统中不算很重要,但这是无畏的浪费,应该避免。但实际上,两者是有区别的,如果不注意,可能造成性能损失,甚至造成异常错误。所以,两者的使用是有区别的,很多时候,基本类型会更合适,它们性能更好,且不会出现空指针。上面的代码看起来没问题,但实际上问题很大。
2023-06-04 16:55:04
490
原创 方法——返回0长度的数组或集合,而不是 null
在非常多的返回集合的场景中,null 与 0长度集合都表示没有符合条件的结果,也就是多数时候,他们是等价的,而本条目讨论的就是这种情况。当然最不合适的就是有些情况返回 null,有时候又返回空集合,这种情况使用者总要做两种判断来处理,并且可能造成意义上的困扰。在方法的返回值中, null 和 空集合/数组 可能有不同的意义或相同的意义,本条目针对的是相同意义下应该返回什么。null 有微弱的性能优势,即便是这样的优势,空集合/数组也能通过优化来无限接近 null 的性能。很多方法需要返回一个数组或集合。
2023-06-03 14:48:05
391
原创 方法——慎用可变参数
比如: jdbc 中 preparedStatement 中?占位符是不固定的(确实是 0 - n 个),那么他的实际替换值也是不固定,所以这里用比较方便,而且 jdbc中处理 占位符的性能在 jdbc与数据库交互间不值一提,所以用可变参数的性能问题不再是问题。可变参数依然是来自于 jdk 1.5 ,可见 jdk1.5 在 java 中有多么重要。所以可变参数方法也可声明如下(其他参数与正常的方法格式一样,只有可变参数放在最后)由上一条可知,一个方法最多允许1个可变参数。
2023-06-03 14:26:49
57
原创 方法——慎用重载
/ 方法重载的选择是会选择最精确的匹配,如上面的实例,我们的参数为 Integer,当方法重载的时候,java 会优先使用参数为 integer 的方法,也就是 dosh(Integer i). 当此方法不存在(被删除)时,也会自动选择 dosh(Object o ) ,因此,重载方法可能造成的问题就是在重构的时候,可能导致程序编译不报错,但实际执行的方法已经变了,可能造成程序在运行时才会出错,更大的麻烦可能是程序没有报错,但执行一段时间后,我们发现了数据错误,又很难找到原因。
2023-05-28 15:48:53
649
原创 方法——必要时进行保护性拷贝
后者的情况比较罕见,毕竟对于恶意破坏的程序,我们其实更合适的是根本不给对方访问权限,比如将 Period 定义为某个类的内部类,所有与外部的交互都严格校验,防止反射等修改手段,并且不会返回任何内部的引用,只返回数据的复制对象或复制的基本数据。程序的问题可能来自故意的破坏,也可能来自无意的破坏。本篇的真正启示在于,如果可能,尽量使用基本类型或者final类型,这样就不存在引用问题了,比如上面方法可以改为。保护性拷贝有两种级别,一种是避免无意的破坏,另一种是尽可能避免任何有意的破坏。本篇的重点在于第一种。
2023-05-28 15:07:18
53
原创 方法——检查参数的有效性
当编写方法或者构造方法的时候,应该考虑它的参数有哪些限制,应该把这些限制写到文档中,并且在这个方法的开头处,通过显示的检查来实施这些限制.养成这个习惯是非常必要的.
2023-05-27 11:54:37
865
原创 枚举——用接口模拟可伸缩的枚举
在 java 中,普通类默认继承了 Object 类, 如果显示声明 extends ,则变为继承指定的类,但无论如何,所有类的最终继承都指向了 Object 类,因此,一切实例都可以被 Object 接受。枚举的这种限制让它可以被 jvm 优化,提供了优异的性能,自 jdk 1.5 之后,单例的最佳实现就是枚举,jvm 帮我们优化处理好了一切,包括反射,克隆,序列化等都无法破坏枚举的单例。幸好,java 也考虑到了这一点,让枚举可以实现接口,因此,我们可以通过接口来模拟枚举的扩展。
2023-05-27 11:20:54
65
原创 枚举——用EnumMap代替序号索引
本条目与 EnumSet 类似,强调的是 int 类型数据在 java 中本身其实没有特殊意义,对于数组来说,下标与内容也没有严格对应关系,因此依赖数组下标也是不太好的行为。在上面的例子中,为了把Plant 按照播种季节区分,使用了泛型数组, Set[] types = new Set[Type.values().length];再操作这个数组的时候,我们必须注意索引范围,避免使用错误的 int index 得到错误的数据,或者报出ArrayIndexOutOfbounds 异常。
2023-05-27 10:36:54
70
原创 枚举——用EnumSet代替位域
通过二进制可以发现,他们的值的组成都是单一的, 例如 3 只能 是 1 和 2 组成, 13只能是1和4和8组成,只要能看懂二进制都能明白这个道理,不懂的需要先熟悉一下二进制。如果 我们选取了 0、1、2、3 来标识abcd这四个值,那么不定项选择中,如果答案为bc,那么值是 1+2=3,但问题来了,d选项的值也是3,那么3对应的就是两种可能,bc或者d,因为是不定项选择,我们也没法确定是哪个,所以不能随意标识值,只能选择那些组合出来的值只能被分解成唯一的几个子值,位移就是其中一个完美的选择。
2023-05-21 16:55:48
342
转载 shell脚本自动发布jar、vue程序参考
1、脚本是在Windows下写的,Windows和Linux的换行符号不同,所以在Linux中执行脚本的时候报错。需要执行 sed 's/\r//' -i sale-gate.sh。2、脚本授权 sudo chmod 777 sale-gate.sh。
2023-05-16 11:14:35
204
原创 枚举——使用实例域代替序号
可是随着后来业务发展,我们定义了一个新的状态,这时候,我们就要注意到一个隐藏的细节,为了不改变 0 代表 FAILED, 1 代表SUCCESS,我们必须把新的状态放在枚举的最后,而不能放在其他位置,并且,不能移除已有的枚举,否则他们的天然序号都变了,业务中某些地方就可能出现问题,而且这种错误非常隐蔽,可能直到很久之后才会爆发出来。序号指的是 枚举自带的 ordinal,类似于数组的下标,用于返回枚举的顺序。比如 TimeUnit。如何避免上面的问题?
2023-05-14 12:30:49
78
原创 枚举——用enum代替int常量
这种枚举类型,提供了编译时的类型安全检查,如果声明了一个参数的类型为DAY,就可以保证,被传到该参数上的任何非null的对象引用一定属于其他有效值中的一个,试图传递类型错误的值时,会导致编译时错误,就像试图将某种枚举类型的表达式赋给另一种枚举类型的变量,或者试图利用==操作符比较不同枚举类型的值一样。c、int枚举是编译时常量,被编译到客户端中,如果枚举常量关联的int发生变化,客户端必须重新编译,如果没有重新编译,程序仍可以运行,但行为就不确定了,如DAY_MONDAY关联的常量不再是1,而是0。
2023-05-14 10:50:08
481
原创 泛型——优先考虑类型安全的异构容器
对于 List<T> Set<T> 这一类的问题, 目前还没有合适的完美处理办法, 因为 List 本身是无限制的, 使用者完全可以在 List 中同时保存 Integer String User 等各种类型, 并且即便你的方法参数声明了泛型, 调用者也可以无视泛型, 直接用原生类型 List Set , 所以这一类问题 , 目前只能将方法参数化, 配合合适的注释和对于性能的实际要求考虑是否进行运行时检查。jdk 本身提供的util 为了灵活性, 没有做太大的限制, 这种灵活性也可能导致数据的不安全。
2023-05-03 17:34:57
419
原创 泛型——使用有界通配符提高api灵活性
平时我们Map 使用也比较多, 如果写工具类的时候也会面临同样问题 , 使用Map 会导致要求入参的泛型, 如果去掉泛型直接用 Map , 又导致编译警告, 并且,也会导致入参格式可能有问题. 使用通配符就可以解决 Map
2023-04-30 16:19:36
56
原创 泛型——尽量消除非受检警告
有些警告源于我们的设计, 无法轻易消除,比如我们原始信息就是多种,这时候 我们知道这个数据就是这个样子, 那我们只能使用强转来处理类型。为了处理这种警告, 我们需要使用注解 @SuppressWarnings("unchecked")正确处理掉这些警告之后, 我们可以保证至少泛型的类型转换不会出错, 如以下的场景就可以避免。这时候获取的时候就会报 unchecked cast (非受检强制转换警告)比如我们设计一个缓存, 为了方便使用, 我们允许存储各种格式。关于 @SuppressWarnings。
2023-04-30 15:13:31
739
原创 泛型——List 优于数组
泛型是编译类型,意味着 List 通过忽略泛型,是可以保存 Long 的。数组是真实类型,代表着无论如何,不能把 String 放到 Long[] 中。2、而List 不是 List的父类型。1、Object[] 是 String[] 的父类型。因此,java 语法不允许创建泛型数组。
2023-04-30 10:47:32
672
原创 泛型——请不要在新代码中使用原生态类型
java 从 1.5 版本出现泛型之后, java.util 包中的工具类大多数都已经实现了泛型化,有了泛型之后,java 编译时便可以帮我们检查出很多类型错误,因此,除非是维护 1.5 之前的版本,否则不要用原始的类型,在可能的情况下,尽量使用泛型化的类。在上面的例子中,如果使用错误示范,就意味着你的代码中丢失了泛型,之后所有的 get 方法都默认只能得到 Object,然后自行强转,编译器会给出 warning,但无法帮你处理为真实类型。
2023-04-22 19:08:28
73
原创 Autowired注解与Resource注解的区别
如上面的例子,一个接口,俩个实现类,Autowired就不知道注入哪一个实现类(得与@Qualifier注解搭配使用才知道),而Resource有name属性,可以区分要注入哪一个实现类。
2023-04-18 14:12:49
519
原创 springboot集成webservice
我感觉webservice也是post方式接口,因为我用apifox工具进行测试,body里放左侧的请求的xml,得到完全相同的的结果,为了验证我的猜想,我用springboot自带的RestTemplate类发送了一次post请求,发现也是得到了右侧的返回内容,这是我的测试类。得到熟悉的界面,可以看到webservice也启动成功了(webservice的端口号就是springboot项目自己的端口号)点击里面的emrService节点的request1,进行测试,可以看到返回数据结果。
2023-04-18 11:31:10
319
原创 类和接口——优先考虑静态成员类
匿名类的扩展成员变量无法被外部访问,只能访问那些父类中的变量和方法 ( 因为匿名类是被他的父类所引用的, 对于程序而言,只能拿到接口或者父类引用, 也就只能访问父类或接口的变量与方法)不仅如此, 内部类一旦实例化, 他就与外部类的实例已经绑定, 这种关系无法修改,无法解绑. 进而也会影响 gc (外部实例和内部实例只要有一个无法被回收, 那就都无法被回收)一般来说 内部类的最常用的场景是作为外部类的辅助类, 也就是他自身单独是没有什么作用的, 他是辅佐外部类来实现功能的。匿名类无法扩展实现接口。
2023-04-05 16:27:21
286
原创 类和接口——复合优先于继承
理由如下:当我们要扩展一个类时,特别是一个别人写好的类,一个类库的类,我们往往关心的仅仅是单个api的功能,而不关心他的实现,但是存在的一个问题就是,同一个类的各个方法直接可能存在联系,可能一个方法的实现依赖于另一个方法,这就意味着,当我们调用一个我们想要操作的方法时,“继承”会隐式的调用另一个方法,这就可能存在问题。因为,在hashSet的addAll()实现中,是循环调用add()方法的,所以导致3*2。需求:新建一个集合类,维护一个addCount变量,记录,一共添加了多少次新值。
2023-04-02 14:22:36
82
原创 synchronized 加锁 this 和 class 的区别
通过以上 4 个示例我们可以得出结论,当使用 synchronized 加锁 class 时,无论共享一个对象还是创建多个对象,它们用的都是同一把锁,而使用 synchronized 加锁 this 时,只有同一个对象会使用同一把锁,不同对象之间的锁是不同的。。
2023-03-21 14:05:17
194
原创 类和接口——Java中的不可变对象
一个类的对象在通过构造方法创建后如果状态不会再被改变,那么它就是一个不可变类。它的所有成员变量的赋值仅在构造方法中完成,不会提供任何 setter 方法供外部类去修改。自从有了多线程,生产力就被无限地放大了,所有的程序员都爱它,因为强大的硬件能力被充分地利用了。但与此同时,所有的程序员都对它心生忌惮,因为一不小心,多线程就会把对象的状态变得混乱不堪。为了保护状态的原子性、可见性、有序性,我们程序员可以说是竭尽所能。其中,synchronized(同步)关键字是最简单最入门的一种解决方案。
2023-03-19 12:45:28
205
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人