activemq plugin开发指南及示例
activemq提供了一种插件(plugin)开发的机制(http://activemq.apache.org/developing-plugins.html), 可以方便的添加各种自定义功能。其效果类似于直接去修改activemq的源码,无论从方便性还是风险程度上,使用plugin都要比去修改源码要好很多。通过这种方式,理论上我们可以实现几乎所有能想到的功能。 开发指南首先需要在工程中添加activemq的依赖,为了方便,可以直接用activemq-all包。 12345<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.13.2</version></dependency> Actviemq plugin的开发非常方便,只需要实现两个类。 一个是plugin类, 需要implements BrokerPlugin这个...
通过加入classpath的形式实现命令行运行java程序时引入第三方jar包
在命令行直接运行 Java 程序时,如果需要引入第三方 jar 包,通常的做法是用 Maven/Gradle 打一个 fat jar(把依赖全部打包进去)。但在某些轻量场景下——比如写了一个小脚本、做快速原型验证、或者在 CI 环境中临时跑一段 Java 代码——手动设置 classpath 反而更直接。 Classpath 是什么?Classpath 是 JVM 查找类文件的搜索路径。当你写 java com.example.Main 的时候,JVM 会在 classpath 中逐条路径搜索 com/example/Main.class。 默认情况下,classpath 只包含当前目录(.)。如果程序依赖了其他 jar 包,就需要手动把它们加到 classpath 中。 方法一:Shell 脚本拼接写一个简单的启动脚本,手动拼接所有依赖 jar 的路径: 1234567#!/bin/bash# 定义 CLASSPATHCLASSPATH=your-main.jar:lib/dep1.jar:lib/dep2.jar:"$CLASSPATH"# ...
解决fatjar的 "java.lang.SecurityException: Invalid signature file digest for Manifest main attributes" 问题
问题现象最近试图运行一个fatjar的时候报错: 1234567891011121314151617181920Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:287) at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:240) at java.util.jar.JarVerifier.processEntry(JarVerifier.java:317) at java.util.jar.JarVerifier.update(JarVerifier.java:228) at java.util.jar.JarFile...
通过实际操作理解redis cluster原理
Redis 集群是redis官方提供的一种集群方案,从3.0开始提供稳定版,应用也已经比较广泛,也经受住了时间考验,个人感觉完全可以取代codis,tweemproxy等集群方案。 cluster原理介绍cluster是使用数据分片的形式实现的,一个 Redis cluster集群包含 16384 个哈希槽, 任意一个key都可以通过 CRC16(key) % 16384 这个公式计算出应当属于哪个槽。每个槽应当落在哪个节点上,也是事先定好。这样,进行任一操作时,首先会根据key计算出对应的节点,然后操作相应的节点就可以了。 所以说,其实cluster跟单点相比,只是多了一个给key计算sharding值的过程,并没有增加多少复杂度,完全可以放心使用。 在这样的设计下,一些对节点的操作也很方便,操作过程中对client端也不会有影响。1. 增加节点:将原有节点的某些slot转移到新节点上2. 删除节点: 将节点上的槽转移到其他节点上以后,移除空节点3. 节点故障:落到故障节点上的操作会失败,而集群其他部分可以正常访问,这样就不会出现一致性哈希方案的“雪崩”问题。单点的故障也可以通...
一种实现在hbase中存储set的思路
HBase 的存储模型是简单的键值对(rowkey → column family → qualifier → value),不像 Redis 那样原生支持 Set、List、Hash 等数据结构。但实际业务中,我们经常需要存储集合类型的数据——比如用户的标签集合、商品的属性集合、社交关系中的好友列表。 如何在 HBase 中优雅地实现一个 Set?本文介绍一种利用 HBase 列(qualifier)特性实现的高效方案。 需求定义一个合格的 Set 存储方案需要满足: 元素自动去重——Set 的基本语义 原子操作单个元素——增删查改不应影响其他元素 方便查询——能快速获取整个 Set,也能快速判断某个元素是否存在 方案对比方案 A:整体序列化把整个 Set 序列化为一个字节数组,存到 HBase 的某个 cell 中。 12345678910111213// 写Set<String> set = new HashSet<>(Arrays.asList("a", "b", "c"));by...
log4j2.xml配置示例及与log4j的区别
完整配置示例1234567891011121314151617181920212223242526272829303132333435<?xml version="1.0" encoding="UTF-8" ?><configuration status="warn"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="[%p] %d %c %l - %m%n"/> </Console> <RollingFile name="activity" fileName="/opt/fox.log" filePattern="...
不实现equals方法的情况下比较java list
问题的提出java里比较两个list的值是否一致,不考虑顺序,有多种方法,比如排序后直接用equals比较,相互之间执行两次containsAll等,这些办法都需要我们给list的元素类实现equals和hashcode方法。但是有一种特殊情况,如果我们并不方便去实习类的equals方法,例如是一个古老的第三方jar包,改代码会带来很多未知问题,这时候该怎么办呢。 不实现 equals 的比较方案其实很简单,万能的apache-commons早就想到了这一点,所以在commons-collections4中增加了外部输入equals和hashcode的方法,甚至equals和hashcode方法本身也不需要我们自己写代码,可以用comons-lang包实现,具体代码如下 使用第三方工具1234567891011<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> &...
使用lua脚本和jedis实现redis的hmsetnx命令,操作hash表时不覆盖原有数据
Redis 的 Hash 操作中,HSETNX 可以保证只在 field 不存在时才写入,但 HMSET(批量设置多个 field)却没有对应的 HMSETNX 命令。如果你需要批量初始化缓存且不覆盖已有数据,每次发 N 个 HSETNX 命令会产生 N 次网络往返,这在批量场景下性能很差。 用 Lua 脚本可以完美解决这个问题——把逻辑放到 Redis 服务端执行,只需要一次网络往返。 问题背景假设你有一个用户配置的缓存场景:新用户首次访问时,需要初始化一组默认配置到 Redis Hash 中。但如果用户已经有了部分配置,不应该覆盖。 用 HSETNX 逐个设置当然可以,但如果有 20 个配置项,就是 20 次 Redis 往返。在高并发下,这会成为瓶颈。 而 HMSET 一次可以设多个 field,但它会无条件覆盖已有值——这不符合需求。 Lua 脚本方案12345678910local keyfor i, j in ipairs(ARGV)do if i % 2 == 0 then redis.call('hsetnx', KEY...
vitualbox虚拟机安装centos 7 及ssh访问、自启动等配置
为了方便,最近用vitualbox搭了一个centos7的虚拟机,整个过程比较简单,在这里记录一下。 下载vitualbox直接去官网(https://www.virtualbox.org/wiki/Downloads)下载即可 下载centos安装包同样官网下载(https://www.centos.org/download/),我下载的是minimal iso 安装安装过程很简单,一路默认点下去就可以,中间内存、分区什么的可以根据需要调一下 配置本机ssh访问vitualbox默认的分辨率非常低,可以通过安装增强工具进行优化。不过由于我们不需要图形化界面,其实可以通过其他方式解决这一问题,就是用xshell或者putty通过ssh远程登陆到虚拟机上。 打开ssh服务12service sshd startchkconfig sshd on 分别启动ssh服务,并将ssh设定为自启动 关闭防火墙由于只是弄着玩的,直接把防火墙关掉,方便。 centos7的防火墙操作和之前版本区别很大: 12sudo systemctl stop firewalld.servicesudo sys...
在java独立进程(standalone app)中嵌入hawtio监控
hawtio(hawt.io)是一个开源的监控系统,它提供了多种启动方式,可以运行单独的jar包、war包,然后远程连接其他应用进行监控,也可以将它直接嵌到我们自己的应用中。 本文会介绍在一个单独的java进程(java standalone application)中嵌入hawtio,对应官方文档(http://hawt.io/getstarted/index.html)的 “Using hawtio inside a stand alone Java application”,不过这一节文档问题是比较多的,如果你只看这段,会遇到各种问题。 下面介绍具体步骤 引入jar包除了官方文档里说的hawtio-embedded外,hawtio-insight-log,hawtio-core,hawtio-web这几个包都是必需的,我们都引入当前的最新版本. 1234567891011121314151617181920<dependency> <groupId>io.hawt</groupId> <artifactId>haw...













