2009-07-02 81 views
1

(X-張貼到吉斯郵件列表)吉斯定製範圍和Spring管理豆

我對將生活在一個現有的應用程序中的新的圖書館試用吉斯。我們現在所有的應用程序都是Spring應用程序,我們有一些與Spring相關的通用代碼,主要是處理我們傾向於使用的線程模型。它基本上給我們(可以看作是)一個邏輯線程 。

因此,我們可以在它上面投擲作業,並確保具有給定關鍵點的作業總是以它們提交的順序結束在同一個管道上。通常情況下,這是應用程序生命週期的單個線程,但如果發生不良事件,則工作線程(支持管道)將被廢棄,管道停用,創建新工人並在該工人上重新激活管道。這裏的所有接線都是由彈簧提供的。

我的新的lib需要&我打算使用吉斯對事物的邏輯&域方面,即構建是那張管道&和它所代表的邏輯工作使用的線程模型。這似乎對我來說很簡單,除了一件看起來很粗糙的東西,即我想用「管道」(又名邏輯線程)作用域注入某些東西。我讀過的定製範圍(和SimpleScope實現)的維基頁面,但有些事情是我不明白和澄清,將不勝感激......

  1. 管存活的JVM的生命因此看來我需要進入一個範圍,但永遠不會退出,這有什麼缺點?
  2. 我有什麼選擇來觸發春季託管bean的範圍條目?是否只是創建Spring上下文,然後使用SpringIntegration將spring bean吸引到guice環境中?
  3. 這聽起來真的很脆弱,我應該用一個由我的管道ID鍵入的單例來包裝它呢?

乾杯 馬特

回答

0

我實現了一些東西,工作,但涉及到一些稍微難看設置...依然有興趣的任何改進這個&有可能是有點過分代碼張貼真的那麼公正在希望照片中加入一些片段

這是SimpleScope示例中的一個變體,其涉及;

  • 帶來了春天CTX
  • 抓住一個特定豆出來的(即管道鍵的註冊表)
  • 順便指出,與Bean工廠
  • 給該註冊表沿吉斯模塊範圍impl因此範圍是在管道激活時輸入的(後來發生在某些彈簧豆被初始化時)

看來我必須抓住特定的bean,而不是通過Nam訪問它ED上的beanfactory做bindAll作爲Scope實例new'ed自己的模塊,即

PipeScope<SecurityId> pipeScope = new PipeScope<SecurityId>(); 
    pipeScope.setPipeIdRegistry(pipeIdRegistry); 
    bindScope(Pipe.class, pipeScope); 
    bind(PipeScope.class) 
      .annotatedWith(Names.named("pipeScope")) 
      .toInstance(pipeScope); 
    SpringIntegration.bindAll(binder(), beanFactory); 

我有新的事實,這意味着我需要明確地提供註冊表到模塊後,可以」因爲它是雞蛋&雞蛋的情況,所以看不到這條路。

的PipeScope基本上存儲值對管道鍵(實際上是一個鍵的列表),而不是一個ThreadLocal,所以我進入像

public void enter(List<K> scopedKeys) { 
    checkState(values.get(scopedKeys) == null, "A scoping block is already in progress"); 
    values.put(scopedKeys, Maps.<Key<?>, Object>newHashMap()); 
} 

一切的一切似乎便能很好地工作......至少在我的反應迅速打開測試設備