如果您想拥有一个全局唯一的请求 id,您可以使用带有计数器的 prcoessAndName(见下文)并将其与您的消息/请求一起传递,并使用它来设置线程名称。
public void processRequest(String uniqueRequestId, args) {
Thread t = Thread.currrentThread();
String tName = t.getName();
try {
t.setName("Processing " + uniqueRequestId);
// preform process request
} finally {
t.setName(tName);
}
}
这样,线程的名称将包含请求 ID,无论它在哪个线程/机器中运行。如果您在日志中包含线程的名称,它将被包含在内。
您可以使用
设置线程的名称
String processAndHost = ManagementFactory.getRuntimeMXBean().getName()
您可以在此附加一个描述性名称或计数器。
这样你所有的线程名称都是唯一的。
您可以假设此名称是全局唯一的,前提是 a) 您有一个唯一的主机名 b) 进程不会重新启动,因此经常存在两个客户端(在不同时间)具有相同进程 ID 的重大风险主机是个问题。
这可以与本地唯一 id 结合,以获得分布式唯一 id。
ExecutorService service = Executors.newCachedThreadPool(new ThreadFactory() {
final String processName = ManagementFactory.getRuntimeMXBean().getName();
final AtomicLong counter = new AtomicLong();
@Override
public Thread newThread(Runnable r) {
String name = processName+"-"+counter.getAndIncrement();
return new Thread(r, name);
}
});
for(int i=0;i<10;i++)
service.submit(new Runnable() {
@Override
public void run() {
System.out.println("["+Thread.currentThread().getName()+"] - Hello World.");
Thread.yield();
}
});
service.shutdown();
打印
[9480@myhost-0] - Hello World.
[9480@myhost-3] - Hello World.
[9480@myhost-2] - Hello World.
[9480@myhost-1] - Hello World.
[9480@myhost-5] - Hello World.
[9480@myhost-4] - Hello World.
[9480@myhost-6] - Hello World.
[9480@myhost-7] - Hello World.
[9480@myhost-0] - Hello World.
[9480@myhost-7] - Hello World.