zoukankan      html  css  js  c++  java
  • coherence初识

    近期,发现在预发布环境上的项目有些冲突,本着治病救人的原则,不得已要一步步剖析,苦逼的就是我们可爱可敬的程序员。

    先介绍下大体情况,应用项目都是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就出现异常,似乎缓存的东西没了。

    开始找人来看,让我们换成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包的节点信息

    然后,在jboss上replace第二个war包

     

     可以看到Id=1(由第一个war创建)的节点left,第二个war产生一个Id=2的节点,如果操作第一个war包的cache,会出现类似下面的日志

    出现这样的日志也与我们的项目有关,

    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包有单独的node

     

     期间还发现一个问题:同样的配置coherence.jar作为公共模块,tangosol-coherence-override.xml配置不起作用,出现类似

    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简介

  • 相关阅读:
    初识 vue
    Spring boot 整合 Swagger
    Swagger 注解
    初识 Swagger
    初识 mycat
    SpringBoot中的国际化
    为什么博客园用户体验这么差?
    Numpy常用方法及应用总汇
    嵌入式开发10种常见数字滤波算法
    .gitignore使用
  • 原文地址:https://www.cnblogs.com/yhzh/p/5037389.html
Copyright © 2011-2022 走看看