【问题标题】:Coherence Extend Proxy putting uninitialized objects in cacheCoherence Extend Proxy 将未初始化的对象放入缓存中
【发布时间】:2015-02-18 15:44:33
【问题描述】:

我们有一个现有的应用程序,它使用 Oracle Coherence 集群将 POFable 对象放入/从集群缓存中取出。我正在尝试修改它以使用扩展代理来做同样的事情。到目前为止,我已经能够启动一个单独的代理进程来连接到我们的集群,并且我已经修改了现有应用程序的缓存配置以连接到扩展代理。在启动时,一切看起来都很愉快且相互关联。但是当我尝试将某些内容放入缓存时,这些对象最终的所有字段都未初始化。

在将键/值对放入缓存时,我没有更改任何客户端应用程序代码,因为据我了解,使用扩展应该对客户端是透明的。这是将对象放入缓存的代码:

// Initiliaze POF object from DB; MyObject implements EvolvablePortableObject
MyObject o = new MyObject();
o.setField1(...);
o.setField2(...);
o.setField3(...);

CacheFactory.getCache("cache-name").put(key, o, expireTime);

最终结果是对象最终进入缓存,其所有字段都未初始化(即全为零和空值)。我已经使用调试器确认在客户端内部,对象已完全初始化,并且它的所有字段都按我的预期填充。同样,我使用调试器显示在代理应用程序内部调用 MyObject.writeExternal() 时对象未初始化。所以客户端和代理之间出现了问题,但我不确定是什么。两者都指向相同的 POF 配置文件并具有相同的类路径,因此它们应该看到相同的 POF 方案和 Java 对象。我在客户端和代理上都将日志记录提高到了 9 级,但我没有看到任何不寻常的消息。当我在没有代理的情况下运行时,客户端能够毫无问题地将相同的对象放入缓存中。

【问题讨论】:

    标签: oracle-coherence


    【解决方案1】:

    万一其他人有这个问题,根本原因最终是缺少一些标签。我已经在扩展服务的接受器配置下定义了它:

            <serializer>
               <class-name>com.tangosol.io.pof.ConfigurablePofContext</class-name>
               <init-params>
                  <init-param>
                     <param-type>java.lang.String</param-type>
                     <param-value>pof-config.xml</param-value>
                  </init-param>
               </init-params>
            </serializer>
    

    (如果您定义了调用服务,则需要同样的东西)。

    但还必须在客户端配置中添加类似的配置以使事情匹配:

    <defaults>
      <serializer>
         <class-name>com.tangosol.io.pof.ConfigurablePofContext</class-name>
         <init-params>
            <init-param>
               <param-type>java.lang.String</param-type>
               <param-value>pof-config.xml</param-value>
            </init-param>
         </init-params>
      </serializer>
    

    【讨论】:

      猜你喜欢
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多