【问题标题】:JAVA: How to set thread name (RMI)?JAVA:如何设置线程名称(RMI)?
【发布时间】:2012-07-27 21:13:32
【问题描述】:

经过here的研究和讨论,我决定需要为分布式系统中属于同一控制流的不同JVM上的线程设置相同的名称。创建线程,例如通过 RMI。以这种方式创建线程时是否可以设置名称?

【问题讨论】:

    标签: java multithreading distributed


    【解决方案1】:

    没有自动方法将此信息从客户端传输到服务器。

    听起来您想要/需要在客户端(每个线程?)上设置某种 Context 对象,并作为方法参数传递给您的 RMI 服务器。 Context 对象不仅可以包含线程名称,还可以包含其他信息,例如调用进程 pid 等。

    然后,您必须使用该Context 对象通过Thread.setName() 相应地设置线程名称等,一旦它通过网络传递。展望未来,您可以使用它在您的日志框架中设置特定于上下文的信息(例如,使用 Log4j nested diagnostic contexts

    使用方面来进一步自动化这件事留给读者进一步练习:-)

    【讨论】:

    • 我对 log4j 和 mdc/ndc 做了很多研究,但不幸的是它无法检测到分布式线程。我的问题的重点是:如何为每个请求设置一个唯一的名称,通过控制流传递它,然后使用 log4j 将此名称添加到日志中,最终将它们收集在一起并按请求名称分组。
    • 是的。无论您选择哪种解决方案,您都必须在服务器(接收)端做一些工作。您可以使用方面(AspectJ 或类似的)自动执行此操作,但这是另一个问题!
    • 实际上我也对 AspectJ 进行了研究 :) 我的想法是在 @around 方面添加日志记录,因为我需要测量执行时间。那么是否可以使用方面设置线程名称(连接到一个请求的所有线程的一个名称)?这个名字怎么传?
    • 我会再次向您推荐上述答案。我认为它包含你需要的一切
    【解决方案2】:

    Thread 类有一个setName(String) 的静态方法。如果您可以让线程(无论它们来自何处)运行该方法,那么您应该很高兴。 These guys 与 Tomcat 相关的线程有类似的问题。

    【讨论】:

    • 感谢您的链接。我的问题更多的是关于跨 JVM 传递名称而不在对象中添加字段,或者为与 RMI 连接的每个方法的参数,但我需要更仔细地研究这个链接。
    • 它不是静态方法。很明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2011-01-23
    相关资源
    最近更新 更多