2012-04-16 60 views
1

我目前的工作活動/活動記錄系統,其中我採取的方法使用的攔截記錄方面的背景。目前,系統/框架假設每個方法都是一個活動,但我想擴展它以便一個活動可以跨越多個方法調用。爲了做到這一點,首先想到的方法是爲所有相關的方法調用提供一些上下文。但是,如果所有方法調用都在單個線程的上下文中(例如Log4J的MDC/NDC),我只知道一種方法。有沒有辦法爲多線程提供上下文(可能沒有代碼意識到多線程)?爪哇 - 創建多個線程

回答

1

我偶然發現了InheritableThreadLocal,我認爲它可以用於我的代碼。這是假設所有相關的線程都是從父母/根線程產生的(我認爲這是一個安全的假設)。

+1

它不是那麼簡單。一個潛在的問題是這樣的:http://stackoverflow.com/questions/7296623/inheritablethreadlocal-and-thread-pools。這就是爲什麼我總是強調這樣的背景需要以一種明確的方式來設置。 – 2012-04-20 02:20:18

+0

我現在唯一遇到的問題就是我正在處理的應用程序目前沒有明確的線程產生。某些第三方API可能會在後臺執行此操作,但目前爲止我還沒有意識到這一點。我對目前InheritableThreadLocal提供的對多線程上下文的有限支持非常滿意。我一定會記下你的建議,以便在將來遇到此類問題時使用它們。謝謝。 – 2012-04-21 01:58:43

1

類的ThreadLocal?這表明它實際上可能是TLS的有效合理使用 - 爲已存在的代碼添加cotext。

+0

其實這就是我打算使用的。我只是不確定它是否仍然可以使用多線程。 – 2012-04-16 12:08:07

+0

ThreadLocal是爲了解決多線程中的某些問題(在我的回答中,ContextManager通常是在ThreadLocal內部實現的)。您應該考慮的主要問題是將上下文內容傳送到另一個線程的方式。請記住,有很多方法可以使您的應用程序成爲多線程。每次產生新線程通常是最糟糕的方式。您如何執行多線程將肯定會影響您傳播環境的方式。 – 2012-04-20 02:26:08

4

不要去想「日誌」。它變得更加基礎:如果你想讓多個線程在同一個上下文中處理完成的動作,你傳播的是什麼讓每個線程知道他們在哪個上下文中?

如果你能回答這個問題,那麼這種情況下是你所需要的投入在MDC/NDC用於記錄(可能不是全部的背景下,但在這方面,一些關鍵的信息)。

如果您的應用程序沒有隨身攜帶這樣的信息,也沒有辦法任何人都可以判斷你。


編輯:

我可以給ü你會如何執行設置的一些想法。無論是適合使用AOP進一步提升它,那是你進一步學習:)

// Assume I have a ContextManager which Context is stored in thread local: 

abstract class ContextAwaredJob implements Runnable { 
    public ContextAwaredJob() { 
    this.context = ContextManager.getCurrentContext(); 
    } 
    public void run() { 
    ContextManager.setCurrentContext(this.context); 
    doRun(); 
    } 
    protected abstract void doRun(); 
} 

你新的「工作」是要擴展這個父類,如果你是通過運行此背景下會自動安裝另一個線程。 (課程設計可以進行很多改進,但是它給出了關於發生的事情的基本想法)

+0

+1,絕對。不知怎的,這種背景必須建立起來。 – 2012-04-16 09:05:12

+0

我不確定我是否理解正確。無論如何,因爲這種方法是面向方面的,所以會在後臺有一個組件,負責跟蹤上下文,比如ContextManager。我想這樣構造它,無論如何執行任何方法,無論是在與原始執行堆棧相同還是不同的線程中,上下文都保持不變。我不確定我在這裏是否有意義;我沒有太多的多線程經驗(至少不是直接)。 – 2012-04-16 12:05:53

+0

問題是「是否在與原始執行堆棧相同或不同的線程內」。通常情況下,同一堆棧中的方法調用堆棧可以合理地認爲是在同一個上下文中。但是,當你有其他線程執行時,除了你以外沒有人知道正確的上下文。例如,你有一個爲線程池運行作業的作業調度器。你希望「context」是用戶會話,你必須爲新線程設置上下文。我相信在這種情況下一些特定的fw設置特定的上下文,但只有你知道你真正想要什麼 – 2012-04-17 01:28:52