🧱 后端开发与架构
未读JDK5 新特性Java5 开发代号为 Tiger(老虎),于 2004-09-30 发行 1、泛型所谓类型擦除指的就是 Java 源码中的范型信息只允许停留在编译前期,而编译后的字节码文件中将不再保留任何的范型信息。也就是说,范型信息在编译时将会被全部删除,其中范型类型的类型参数则会被替换为 Object 类型,并在实际使用时强制转换为指定的目标数据类型。而 C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指定数据类型生成相对应的目标代码。 1Map<Integer, Integer> squares = new HashMap<Integer, Integer>(); 通配符类型:避免 unchecked 警告,问号表示任何类型都可以接受 12345public void printList(List<?> list, PrintStream out) throws IOException { for (Iterator<?> i = list.iterator(); i.hasNext(); ...
🛠️ 开发工具与插件
未读IDEA Plugin API 文件操作Virtual File SystemVirtual File System 是处理文件的一套机制, 用于处理如何加载文件, 如果保存文件, 当文件变化时如何更新缓存等. IntelliJ Platform 将操作文件封装成了 Virtual File System, 提供了以下几点主要功能: 封装处理文件的通用 API, 不论文件在磁盘, 存档, HTTP 服务器或者其他地方, 都使用同一套 API; 提供快照功能, 能跟踪文件的修改; 提供将附加持久数据与 VFS 中的文件相关联; 为了提供最后两个功能,VFS 管理用户硬盘的某些内容的持久快照。快照仅存储通过 VFS API 至少请求过一次的文件,并且异步更新以匹配磁盘上发生的更改。 快照是应用程序级别,而不是项目级别 - 因此,如果某个文件(例如,JDK 中的某个类)被多个项目引用,则其内容的一个副本将存储在 VFS 中。 所有 VFS 访问操作都通过快照。 如果通过 VFS API请求某些信息但快照中没有这些信息,则会从磁盘加载并存储到快照中。如果快照中有可用信息,则返回快照 ...
🛠️ 开发工具与插件
未读IDEA Plugin 配置持久化 持久化与设置面板上传到 Aliyun OSS 需要几个参数: endpoint accessKeyId accessKeySecret bucketName filedir (此参数可不填) 本章节将介绍怎样创建设置面板和持久化配置 设置面板直接使用 IDEA 自带的 GUI 插件来画图, 需要开启 UI Designer 插件 持久化 PersistentStateComponent
🛠️ 开发工具与插件
未读介绍 IDEA Plugin 开发入口 接下的文档都会根据前一篇的需求来找到解决方案, 对于不熟悉 IDEA 插件开发的同学 (说的就是我), 可能一时找不到各个公共的入口, 这个是否就要看一些开源的插件,从中找到功能入口. 右键菜单入口需求中提到 「在编辑视图中直接右键 –> upload to Aliyun OSS」 因此我们需要扩展右键菜单, 来添加我们自己的功能入口. 现在介绍一种新的添加 AnAction 的方式: 这么多 Group. 好了, 懵逼了…. 那么我们怎么来找我们需要的 Group 呢?我这里用个笨办法, 看别人的插件配置呗, 这里通过看 Alibaba Java Coding Guidelines 这个插件的配置, 可以确定的有: MainToolBar ProjectViewPopupMenu ChangesViewPopupMenu EditorPopupMenu 先来第一个, 在编辑器右键菜单中添加我们的 action, 很明显是用 EditorPopupMenu 1234567891011121314151617<actio ...
插件需求分析 先来梳理下需求: 开发一款插件将 Markdown 文档中的图片上传到 Aliyun OSS. 具体需求入下: 上传需求解析所有 ![]() 图片标签: 如果图片在本地, 则上传到 Aliyun OSS; 如果以 http:// 或者 https:// 开头, 则根据设置判断是否上传 (迁移图片到 Aliyun OSS) 上传完成后: 根据设置将  标签转换成 <a data-fancybox title="" href="http://xxxx" ></a> 标签 这里有 2 个设置: 是否转换为 <a> 标签: 如果开启, 在判断是否显示大图 (这个主要针对 vuepress 构建的博客) 1<a data-fancybox title="" href="http://xxxx"></a> 且要 ...
🛠️ 开发工具与插件
未读这篇大致介绍一下 IDEA 插件的几种类型 插件的主要类型IntelliJ IDEA 的强大之一就是有一个易于扩展的插件系统, 所有插件都可在 JetBrains 插件库 找到. 最常见的插件类型包括: 自定义语言支持 框架集成 工具集成 用户界面附加组件 自定义语言支持自定义语言支持提供了使用特定编程语言的基本功能, 包括: 文件类型识别 词汇分析 语法突出显示 格式化 代码洞察和代码完成 检查和快速修复 意图行动 框架集成框架集成包括改进的代码洞察功能, 这些功能对于给定的框架是典型的, 以及直接从 IDE 使用框架特定功能的选项. 有时它还包括自定义语法或 DSL 的语言支持元素. 具体的代码见解 直接访问特定于框架的功能 工具集成通过工具集成, 可以直接从 IDE 操作第三方工具和组件, 而无需切换上下文. 比如: 实施其他行动 相关的 UI 组件 访问外部资源 用户界面附加组件此类别中的插件会对 IDE 的标准用户界面应用各种更改.一些新添加的组件是交互式的并提供新功能, 而其他组件仅限于视觉修改. 所述 背景图像 的插件可以作为一个例子. 👉 ...
🛠️ 开发工具与插件
未读查看 IDEA Plugin 开发日志 上一节已经说过, IntelliJ IDEA SDK 中已经有了日志框架, 用于输出日志, 但是在哪里看日志呢. 我们可以这样查看: 最终我们知道 idea.log 会在 .sandbox/system/log/idea.log. 然后我们可以通过 Grep Console 这个插件的 Tail File in Console 或者 Tail Current File in Console 来实时查看日志. 然后我们会发现所有的日志等级都是 INFO, 在我们调试的时候 DEBUG 日志看不到, 如果全部设置成 INFO 级别调试的时候很方便, 但是大量打印日志有性能损耗,因此我们需要将日志等级降低, 又能打印到文件中. 你可以这样设置: 说明已经写得很详细了, 按照上面的来, 然后将调试日志等级设置为 TRACE 即可看见日志. 其他你也可以直接修改下面这个文件 [👉 扩展阅读 - 怎么将老的 plugin 项目转换成 gradle 项目] 由于官方开发文档写得很烂, 有多东西都没有写到, 所有我们只有看别人的代码来了解未知 ...
🛠️ 开发工具与插件
未读使用官方推荐的 Gradle 插件开发 这是 IDEA 插件开发第一篇, 整个系列记录了开发 aliyun-oss-upload 的整个细节, 将会把遇到的问题整理成文, 最终发布在 idea-plugin-dev 中. 前言IDEA 插件开发分为 2 种方式: 直接使用 IDEA 提供的 IntelliJ Platform Plugin 2. 使用 Gradle 官方推荐使用 Gradle 方式, 因此选用第二种方式. 因为未使用过 Gradle, 肯定会遇到很多坑, 为了减少大家爬坑的时间, 我会尽量把注释写详细点, 如果发现错误的地方, 请告知我. 配置使用 Gradle 创建好插件项目后, 直接拷贝以下配置到 build.gradle 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748// mavenCentral() 是一个插件仓库, 导入的插件将会在仓库中寻找并下载buildscript { repositories &# ...
🧱 后端开发与架构
未读昨天做完精准营销的需求后, 提测版本一直连不上 MQ, 然后在本地启动后也未发现问题, 直到监听的消息队列有消息而且是大量消息时才会出现的错误: 1234567891011121314151617181920212223242526javax.jms.JMSException: Cannot send, channel has already failed: tcp://172.31.205.58:61616 at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1409) at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1496) at org.apache.activem ...
🔥 效能提升
未读记录 mac mini 开发环境的搭建过程 系统设置修改 Launchpad 图标大小1234567891011121314行:defaults write com.apple.dock.springboard-rows -int 7列:defaults write com.apple.dock.springboard-columns -int 9重启 dock恢复:defaults write com.apple.dock.springboard-rows defaultdefaults write com.apple.dock.springboard-columns defaultkillall dockdefaults write com.apple.dock springboard-columns -int 11;defaults write com.apple.dock springboard-rows -int 7;defaults write com.apple.dock ResetLaunchPad -bool TRUE;killall Dock xxx. ...
为什么用线程池 创建 / 销毁线程伴随着系统开销, 过于频繁的创建 / 销毁线程, 会很大程度上影响处 - 理效率 线程并发数量过多, 抢占系统资源从而导致阻塞 对线程进行一些简单的管理 在 Java 中, 线程池的概念是 Executor 这个接口, 具体实现为 ThreadPoolExecutor 类, 学习 Java 中的线程池, 就可以直接学习他了对线程池的配置, 就是对ThreadPoolExecutor 构造函数的参数的配置 构造函数:1234567891011121314151617181920212223242526272829303132// 五个参数的构造函数public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...
🧩 开发框架与中间件
未读之前一直学习 SpringCloud, 对于配置中心,一直也是采用的 Spring Cloud Config,但是用久了,发现很多地方满足不了要求,同时也感觉很 low(个人看法勿喷)。在学习 Spring cloud config 的时候也有听到过携程的 apollo,但一直没时间去弄。直到昨天看了一张图,如下:使我下定决心去看看携程的 apollo 配置中心。 这张图也算是综合对比了 spring cloud config,netflix archaius, ctrip apollo, disconf, hawk 等配置中心的功能点。综合比较下来携程 apollo 更具有优势。 二、简单介绍携程 Apollo 配置中心1、What is Apollo1.1 背景随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址…… 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制…… 在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。 Apollo 配置中 ...
🧱 后端开发与架构
未读现有架构日志存在的问题 关键逻辑无日志埋点 日志级别规范 生产环境日志级别不正确, 不规范 日志配置不统一 日志框架不统一 日志打语句不规范 因此针对以上问题, 对整个项目中的日志进行规范管理 统一日志配置新框架中统一使用 log4j2 日志框架来进行日志管理 具有的功能: 根据不同的环境输出不同的日志级别 开发环境, 输出等级为 debug 测试和生成环境, 输出等级为 info 开发环境, 只输出到 console 测试和生产环境, 输出到 /usr/logs/app_name/port/all.log, 关闭 console 输出 按天压缩日志 自动删除 30 天以前的日志 统一输出格式 动态修改日志等级 现有日志修改现在的代码暂时不能全部迁移到新框架, 考虑到现在各个模块使用的日志配置不统一, 日志配置不合理, 这里规范一下日志相关的配置 统一配置格式由于老项目中一部分使用 log4j, 另一部分又使用了 log4j2 日志框架,配置文件一部分是 xml, 另一部分又是 properties. 为了以后迁 ...
🧱 后端开发与架构
未读开发中日志这个问题,每个公司都强调,也制定了一大堆规范,但根据实际情况看,效果不是很明显,主要是这个东西不好测试和考核,没有日志功能一样跑啊。 但是没有日志, 一旦系统出现问题, 将导致排查问题时困难重重.因此好的日志输出有利于快速定位问题 但是我们在什么时候打印日志? 需要打印什么信息? 用什么日志级别?这些问题都将应用我们排查问题时的速度 因此这里制定一个日志规范, 将日志相关的常识性问题做一个总结. 日志等级说明 trace, debug: 理论上 “不属于错误”, 只是打印一些状态, 提示信息, 以便 开发过程 中观察. info: 理论上 “不属于错误”, 只是一些提示性的信息, 但是即使在开发完成, 正式上线的系统中, 也有保留的价值. warn: 属于轻微的 “警告”, 程序中出现了一些异常情况, 但是影响不大, 还可以正常使用. error: 属于 “普通的错误”, 在程序可以控制的范围内, 不会造成连锁影响或巨大影响. fatal: 属于 “致命错误”, 可导致整个系统或者一系列功能无法使用, 甚至导致系统瘫痪, 关闭. 规范 日志必须显示 日志等级, ...















