2011-06-20 42 views
0

我們有以下設置:客戶端(Tomcat)的調用無狀態會話Bean(JBoss的),如何處理客戶端標識符

  • 的Tomcat(Web應用程序)到JBoss 5.1.0調用服務(無狀態會話Bean) EAP(EJB 3.0)
  • JBoss已經使用兩個不同的數據庫
  • 兩個不同的持久化上下文定義
  • JBoss服務需要知道哪些客戶端調用它的服務,像一個標識符(多租戶?)

我們可以更改Jboss端的所有服務方法,以接受客戶端標識符作爲參數。那麼我們需要改變服務內部的每個可能的方法調用來傳輸這個標識符,這對我來說聽起來太麻煩了。

首先,我想到了一個類似於ThreadLocal變量的東西......我想這是在Java EE世界中被禁止的東西。

你們是否知道任何優雅的「運送」客戶標識符的解決方案?我認爲JAAS做了類似的處理,每個來自「外部」世界的呼叫都會被過濾,並將用戶憑據應用於每個呼叫。一旦呼叫進入「Jboss服務世界」,所有後續的方法調用都具有主叫方標識。

我希望我的應用程序儘可能作爲「客戶端不可知」,它應該根據哪個客戶端調用服務來獲得正確的配置「注入」(如持久化上下文)。邏輯將是相同的,只是它使用的資源不同(某種攔截器體系結構)。

我有點失落。任何幫助,高度讚賞。

歡呼聲 燙髮

回答

0

從@AroundInvoke攔截器,你應該能夠通過檢查InvocationContext.getContextData(),它與每JAX-WS規範web服務上下文中共享的內容,以檢測web服務。你仍然需要在內部傳播它。

的ThreadLocal中的Java EE不一定是壞事,只要你記得照顧好自己清理:(當然,明確地傳遞上下文周圍可能是最乾淨的)

tl.set(something); 
try { 
    deepMethodCallHierarchy(); 
} finally { 
    tl.remove(); 
} 

+0

感謝爲你的答案。我們沒有使用web服務。只需通過JNDI查找使用導出的服務接口(* .class)即可得到RMI。任何想法? – Marcel

+0

看起來像我們可以使用「TransactionSynchronizationRegistry」。一個例子可以在這裏找到:http://www.scribd.com/doc/55889067/106/ThreadLocal-Strategy - >上下文持有人模式 – Marcel

+0

啊,對不起。我不確定我是如何誤解你的第一個子彈說的「webservice」,但我做到了。 –