2015-12-13 69 views
0

我有兩個戰爭文件都建立自己的緩存(通過單身對象的方法)。緩存操作完全相同並且運行時間很長。我正在計劃的是在一個war文件中有一個緩存,然後從另一個war文件中調用單例對象。它可以實現嗎? 可能是通過JNDI或RMI?在兩個war文件之間共享對象?

我可以做的另一種方法是單獨的戰爭,然後通過servlet返回結果。現在,這兩場戰爭都會向此servlet發出呼叫請求(通過java代碼而不是瀏覽器) ,並將緩存作爲響應。但是在這裏我需要做很多工作,還需要處理認證?

的另一種方式,我得到通網是shared objects between webapps of the same tomcatCommunication between two web application in same server

有沒有更好的或乾淨的方式

+0

合併你的兩個war文件如何?然後你有直接的相互直接訪問。否則,您將始終與應用程序服務器試圖在webapps之間實施的分離工作相抗衡。當然,我不知道你的圍繞戰爭文件佈局的限制。 – miw

回答

0

我建議大家分享使用父ClassLoader和靜態結構的數據。例如,像這樣編譯類:

public class SharedMemory<K, V> {   
    private static final SharedMemory INSTANCE = new SharedMemory(); 

    public static SharedMemory getInstance() { 
     return INSTANCE; 
    } 

    private final ConcurrentHashMap<K, V> map = new ConcurrentHashMap<>(); 

    private SharedMemory() { 
    } 

    public V put(K key, V value) { 
     return map.put(key, value); 
    } 

    public V putIfAbsent(K key, V value) { 
     return map.putIfAbsent(key, value); 
    } 

    public V get(K key) { 
     return map.get(key); 
    } 
} 

到特定的jar並將該jar添加到您的web服務器的類路徑。所以,這個類將由一個系統類加載器加載而不是由webapp類加載器加載,你將能夠在所有的戰爭中共享它的狀態。確保該類不包含在您的戰爭中,以防戰爭類裝載器在父類中找不到類。

+0

我嘗試了類似的東西,我添加了tomcat/lib下的類,但仍然沒有找到該類,並拋出錯誤noclassdeferror。見http://stackoverflow.com/questions/34241780/caused-by-java-lang-noclassdeffounderror-when-class-exists-under-tomcat-lib – user3198603

+0

我相信,如果你準備一些像上面列出的簡單的類,並把將通用類加載器(https://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html)的結果jar放到/ lib中。至於你當前的問題,「無法初始化類...」錯誤意味着你的類實際上被發現,但它在它的靜態構造函數中拋出了一個異常。確保可以在Common classloader中找到所有的依賴關係和配置 – AnatolyG