如何在Java程序中获取自己的进程号

在分布式系统中,对于一个需要全局唯一ID的需求,我们可能会按照如下的格式来定一个ID的组成:
机器编号 + 进程号 + 时间戳 + 流水号
按照上面这个逻辑,我们可能会得到一个类似 08C5 00375 20210320232030 0001 这样的ID。

当然根据您的业务实际情况,这个ID的规则可能会有很多变种。比如去掉空格、加上业务标志符、时间戳到毫秒、时间戳到日期、每个部分用不同的符号分隔等等,这些当然都是可以的。但是仔细一想好像哪里不对劲,我怎么获取自己正在运行的进程号呢?

不过,如果您不存在一个机器或容器里面运行多个相同业务实例的话,那肯定可以不用进程号来区分了。这个就属于本篇文章之外的情况,咱们暂不考虑。下面就来说明如何在运行的过程中获取自己的进程号。

获取Java进程自己的进程号
从JDK 1.5开始,软件包 java.lang.management 提供了管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。它同时允许从本地和远程对正在运行的 Java 虚拟机进行监视和管理。

其中java.lang.management.RuntimeMXBean 为Java 虚拟机的运行时系统的管理接口。
Java 虚拟机具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean,它可以通过调用 ManagementFactory.getRuntimeMXBean() 方法或从平台 MBeanServer 方法获得。

为我们可以通过 RuntimeMXbean 对象来获取当前运行时的信息,自然也就可以获取到自己的进程号了。请看如下代码:

import java.lang.management.ManagementFactory;

public class PIDSelector {

    public static void main(String[] args) {
        String name = ManagementFactory.getRuntimeMXBean().getName();
        System.out.println(name);

        String pid = name.split("@")[0];
        System.out.println("Pid is:" + pid);
    }
}

运行上面的代码,输出结果为:

13904@msi
Pid is:13904

这样我们就得到了当前运行中进程自己的进程号。

PS:顺便提一句,一般ID都需要有固定的位数,所以涉及到序列号格式化的问题。因为在Windows(x86/64)、Linux/Unix(x86/x64)等其他不同平台上进程号的最大值是不一样的。您如果需要格式化进程号,最好是调研一下您的运行平台的最大进程号是多少,以免出现溢出或反转的问题。

附Java方法:

  /**
   * 获取当前程序的进程ID
   * [email protected]
   * Pid is: 25107
   * @return
   */
  public static int getPid() {
    RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
    String name = runtime.getName(); // format: "pid@hostname"
    try {
      return Integer.parseInt(name.substring(0, name.indexOf('@')));
    } catch (Exception e) {
      return -1;
    }
  }

你可能感兴趣的:(Java,SE,java,分布式,tranceId,进程号)