Java 使用代码在运行时获取mysql、jdk、elasticsearch、redis、netty、kafka等组件的版本号
2023-04-18 12:37:08 时间
直接上代码
@FunctionalInterface
interface VersionGetter {
String getVersion();
}
@Slf4j
private static class MysqlVersionGetter implements VersionGetter {
@Override
public String getVersion() {
try {
final DataSource dataSource = SpringUtil.getBean(DataSource.class);
if (dataSource != null) {
final Connection connection = dataSource.getConnection();
return connection.getMetaData().getDatabaseProductVersion();
}
} catch (Exception e) {
log.error("获取mysql版本出错", e);
}
return null;
}
}
private static class JavaVersionGetter implements VersionGetter {
@Override
public String getVersion() {
return SystemUtil.get(SystemUtil.VERSION);
}
}
@Slf4j
private static class EsVersionGetter implements VersionGetter {
@Override
public String getVersion() {
try {
final RestHighLevelClient bean = SpringUtil.getBean(RestHighLevelClient.class);
final MainResponse info = bean.info(RequestOptions.DEFAULT);
final MainResponse.Version version = info.getVersion();
return version.getNumber();
} catch (IOException e) {
log.error("获取ES版本出错", e);
}
return null;
}
}
@Slf4j
private static class RedisVersionGetter implements VersionGetter {
@Override
public String getVersion() {
//因我的redis服务 info命令重命名了 所以使用了lua脚本方式
//如果没有重命名 直接调用template的info api即可
try {
final StringRedisTemplate redisTemplate = RedisUtil.getRedisTemplate();
final String response = redisTemplate.execute(ServerInfoScript.getInstance(), new ArrayList<>());
if (StrUtil.isNotBlank(response)) {
final String[] split = response.split("
");
for (String item : split) {
if (StrUtil.startWith(item, "redis_version")) {
final String[] versionSplit = item.split(":");
if (versionSplit.length == 2) {
return versionSplit[1];
}
}
}
}
} catch (Exception e) {
log.error("获取redis版本出错", e);
}
return null;
}
}
private static class NettyVersionGetter implements VersionGetter {
@Override
public String getVersion() {
final Map<String, Version> identify = Version.identify();
//netty组件有很多版本 这里随便取了一个
final Version version = identify.values().stream().findFirst().orElse(null);
if (version != null) {
return version.artifactVersion();
}
return null;
}
}
private static class KafkaVersionGetter implements VersionGetter {
@Override
public String getVersion() {
return AppInfoParser.getVersion();
}
}
private static class HotfixVersionGetter implements VersionGetter {
@Override
public String getVersion() {
File file = new File("/data/tip/hotfix/hotfix-version.txt");
if (file.exists() && file.isFile()) {
return FileUtil.readUtf8String(file);
} else {
return null;
}
}
}
private static class ServerInfoScript implements RedisScript<String> {
private static final ServerInfoScript INSTANCE = new ServerInfoScript();
private ServerInfoScript() {
}
public static ServerInfoScript getInstance() {
return INSTANCE;
}
private final String cmd = "return redis.call('redisinfo','server')";
@Override
public String getSha1() {
return SecureUtil.sha1(cmd);
}
@Override
public Class<String> getResultType() {
return String.class;
}
@Override
public String getScriptAsString() {
return cmd;
}
}
相关文章
- Jease 2.6发布 Java开源内容框架
- JVM调优总结:反思
- JVM调优总结:调优方法
- JVM调优总结:新一代的垃圾回收算法
- JVM调优总结:典型配置举例
- JVM调优总结:分代垃圾回收详述
- JVM调优总结:垃圾回收面临的问题
- JVM调优总结:基本垃圾回收算法
- JVM调优总结:一些概念
- 用Java GUI编写的画板程序
- Java的动态绑定机制
- jOOQ 2.0.2发布 Java的ORM框架
- Java中带复选框的树的实现和应用
- Java网络编程菜鸟进阶:TCP和套接字入门
- 甲骨文与谷歌专利权之争定于今年三月开审
- Java调用C/C++编写的第三方dll动态链接库
- 集成开发环境 NetBeans IDE 7.1正式版发布
- kangle 2.7.5紧急发布 防hash碰撞攻击
- 东方通技术引领模式为国产软件“争权”
- UML中关联,组合与聚合等关系的辨析