coherence初識

近期,發如今預發佈環境上的項目有些衝突,本着治病救人的原則,不得已要一步步剖析,苦逼的就是咱們可愛可敬的程序員。html

先介紹下大致狀況,應用項目都是velocity+spring+mybatis,沒什麼好說的,spring配置了一個sso的filter,filter中使用了coherence3.5.3做爲緩存,項目打成war包後部署在jboss eap 6.3域模式下(兩臺物理機,每一個上起一個server實例,屬於同一group),因爲有些jar包是公用的,這些jar包做爲jboss的module部署在jboss上,其中就包括coherence.jar。一個war包部上後是正常的,再部一個war,上一個war的ssofilter就出現異常,彷佛緩存的東西沒了。node

開始找人來看,讓咱們換成Ehcache,好吧,換。。。,卻是好了,沒想到過幾天問題來了,ehcache都是local存儲的,一個應用一個cache,原來的coherence會自動組羣,刪一次就ok了,如今要一個一個的刪,不夠nice,想一想仍是要弄明白coherence究竟是怎麼了?程序員

注意力再次集中在coherence上,百度一下,沒有答案,百度一下,沒有答案。。。卻是看了一些介紹性的文章和翻譯的中文文檔,大致知道coherence能夠經過組播地址自動組羣,構成集羣。再看咱們的項目,coherence配置都是同樣的,難道要區別?試試吧,折騰好半天沒好,卸大半氣了。一直以來懷疑是咱們在jboss上部署的公共模塊有問題,後來在本機上搭了個環境,各類奇淫技巧用上,看日誌嘛,分析來分析去,發現若是兩個war包部在兩個jboss server上沒有問題,第一個war會建一個集羣,並把本身加進去,第二個war再部署,會自動加入第一個war建的集羣中,正常啊。若是放在一個server中,第一個正常,第二個好像不是一個節點,沒有coherence的日誌,使用的應該是第一個war包建立的node,下圖Id=1就是第一個war包的節點信息spring

而後,在jboss上replace第二個war包緩存

 

 能夠看到Id=1(由第一個war建立)的節點left,第二個war產生一個Id=2的節點,若是操做第一個war包的cache,會出現相似下面的日誌mybatis

出現這樣的日誌也與咱們的項目有關,分佈式

public class NamedCacheFactoryBean implements FactoryBean<NamedCache>, InitializingBean, DisposableBean {
    。。。。。
    @Override
    public void destroy() throws Exception {
      if (this.ensureCluster) {
        CacheFactory.shutdown();
      }
    }

    @Override
    public void afterPropertiesSet() throws Exception {
      if (this.ensureCluster) {
        CacheFactory.ensureCluster();
      }
      this.cache = CacheFactory.getCache(this.cacheName);
      for (MapListener mapListener : mapListeners) {
        this.cache.addMapListener(mapListener);
      }
    }    
    。。。。。      
}

第二個war包replace致使共享的node關閉,第二個war產生一個Id=2的節點僅第二個war包使用,第一個war包使用異常,估計是像CacheFactory.shutdown()這樣操做的問題,只要保持各個war包獨立就能夠了吧,把coherence.jar從jboss公共模塊上拉下來,打包到war裏面,後來的測試很順利,每一個war包有單獨的nodeide

 

 期間還發現一個問題:一樣的配置coherence.jar做爲公共模塊,tangosol-coherence-override.xml配置不起做用,出現相似post

Optional configuration override "coherence/preproduct/tangosol-coherence-override.xml" is not specified

的日誌,而打包到coherence.jar中就能夠,看來coherence找這個配置路徑時是依賴class加載路徑的,其實也能夠把這些配置文件打包到jar包中,不過,這樣的話就限制了這個jar的使用,不太好測試

 

 

參考文章:

1. Oracle Coherence中文教程七:設置羣集

2. Coherence Step by Step 第二篇 集羣(二) 創建集羣

3. 分佈式網格緩存Coherence簡介

相關文章
相關標籤/搜索