7 Replies Latest reply on Aug 14, 2006 8:33 AM by ben.wang

    Running POJOCache error

    confuz

      Hi All,
      I ran pojo cache, but hit error, following is the code and errors

      package org.jboss.cache.data;
      
      import java.util.List;
      
      /**
       * @author Ben Wang
       * @@org.jboss.cache.aop.AopMarker
       */
      public class Person {
       protected String name;
       protected Address address;
      
       public void setName(String name)
       {
       this.name = name;
       }
      
       public String getName()
       {
       return this.name;
       }
      
       public void setAddress(Address address)
       {
       this.address = address;
       }
      
       public Address getAddress()
       {
       return this.address;
       }
      
       public String toString()
       {
       StringBuffer buf = new StringBuffer();
       buf.append("{Name = " +name);
       if (address != null)
       buf.append(", Address = " + address.getSimpleAddress());
       buf.append("}\n");
      
       return buf.toString();
       }
      
      }
      
      

      
      package org.jboss.cache.data;
      
      /**
       * @author Ben Wang
       * @@org.jboss.cache.aop.AopMarker
       */
      public class Address {
       protected String city;
       protected int zip;
       protected String street;
      
       public void setCity(String city)
       {
       this.city = city;
       }
      
       public String getCity()
       {
       return this.city;
       }
      
       public void setZip(int zip)
       {
       this.zip = zip;
       }
      
       public int getZip()
       {
       return zip;
       }
      
       public void setStreet(String street)
       {
       this.street = street;
       }
      
       public String getStreet()
       {
       return this.street;
       }
      
       public String getSimpleAddress()
       {
       StringBuffer buf = new StringBuffer(street);
       buf.append(" " + city);
       if (zip > 0)
       buf.append(" " + zip);
      
       return buf.toString();
       }
      
       public String toString()
       {
       StringBuffer buf = new StringBuffer();
       buf.append("{City = " +city).append(" ,zip = " +zip).append(" ,street = " +street + "}\n");
      
       return buf.toString();
       }
      }
      


      I put thoes pojos into JBossCache-1.4.0.GA\tools\src and ran the ant all to generated the aopc classes(Persion.class,Persion$*.class,Address.class,Address$*.class,))

      Then I tested POJOCache base on those class file, but hit error

      cache = new TreeCache();
       PropertyConfigurator pc = new PropertyConfigurator();
       pc.configure(cache, "tree-service.xml");
      
       cache.createService();
       cache.startService();
      
       Person p1 = new Person();
       p1.setName("P1");
       Person p2 = new Person();
       p2.setName("P2");
       Address add = new Address();
       add.setCity("SZ");
       add.setStreet("NR");
       add.setZip(3009884);
       p1.setAddress(add);
       p2.setAddress(add);
      
       cache.put("/test/p1","p1", p1);
       cache.put("/test/p2","p2", p2);
       cache.put("/test/a1","a1", add);
      

      <?xml version="1.0" encoding="UTF-8"?>
      
      <!-- ===================================================================== -->
      <!-- -->
      <!-- Sample TreeCache Service Configuration -->
      <!-- -->
      <!-- ===================================================================== -->
      
      <server>
      
       <classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/>
      
      
       <!-- ==================================================================== -->
       <!-- Defines TreeCache configuration -->
       <!-- ==================================================================== -->
      
       <mbean code="org.jboss.cache.aop.PojoCache"
       name="jboss.cache:service=testTreeCache">
      
       <depends>jboss:service=Naming</depends>
       <depends>jboss:service=TransactionManager</depends>
       <!--
       Configure the TransactionManager
       -->
       <attribute name="TransactionManagerLookupClass">org.jboss.cache.DummyTransactionManagerLookup</attribute>
      
      
       <!--
       Node locking level : SERIALIZABLE
       REPEATABLE_READ (default)
       READ_COMMITTED
       READ_UNCOMMITTED
       NONE
       -->
       <attribute name="IsolationLevel">REPEATABLE_READ</attribute>
      
       <!--
       Valid modes are LOCAL
       REPL_ASYNC
       REPL_SYNC
       -->
       <attribute name="CacheMode">REPL_SYNC</attribute>
      
       <!-- Name of cluster. Needs to be the same for all clusters, in order
       to find each other
       -->
       <attribute name="ClusterName">TreeCache-Cluster</attribute>
      
       <!-- JGroups protocol stack properties. Can also be a URL,
       e.g. file:/home/bela/default.xml
       <attribute name="ClusterProperties"></attribute>
       -->
      
       <attribute name="ClusterConfig">
       <config>
       <!-- UDP: if you have a multihomed machine,
       set the bind_addr attribute to the appropriate NIC IP address -->
       <!-- UDP: On Windows machines, because of the media sense feature
       being broken with multicast (even after disabling media sense)
       set the loopback attribute to true -->
       <UDP mcast_addr="228.1.2.5" mcast_port="45577"
       ip_ttl="64" ip_mcast="true"
       mcast_send_buf_size="150000" mcast_recv_buf_size="80000"
       ucast_send_buf_size="150000" ucast_recv_buf_size="80000"
       loopback="false"/>
       <PING timeout="2000" num_initial_members="3"
       up_thread="false" down_thread="false"/>
       <MERGE2 min_interval="10000" max_interval="20000"/>
       <FD shun="true" up_thread="true" down_thread="true"/>
       <VERIFY_SUSPECT timeout="1500"
       up_thread="false" down_thread="false"/>
       <pbcast.NAKACK gc_lag="50" retransmit_timeout="600,1200,2400,4800"
       up_thread="false" down_thread="false"/>
       <pbcast.STABLE desired_avg_gossip="20000"
       up_thread="false" down_thread="false"/>
       <UNICAST timeout="600,1200,2400" window_size="100" min_threshold="10"
       down_thread="false"/>
       <FRAG frag_size="8192"
       down_thread="false" up_thread="false"/>
       <pbcast.GMS join_timeout="5000" join_retry_timeout="2000"
       shun="true" print_local_addr="true"/>
       <pbcast.STATE_TRANSFER up_thread="false" down_thread="false"/>
       </config>
       </attribute>
      
      
       <!--
       The max amount of time (in milliseconds) we wait until the
       initial state (ie. the contents of the cache) are retrieved from
       existing members in a clustered environment
       -->
       <attribute name="InitialStateRetrievalTimeout">20000</attribute>
      
       <!--
       Number of milliseconds to wait until all responses for a
       synchronous call have been received.
       -->
       <attribute name="SyncReplTimeout">15000</attribute>
      
       <!-- Max number of milliseconds to wait for a lock acquisition -->
       <attribute name="LockAcquisitionTimeout">10000</attribute>
      
      
       <!-- Name of the eviction policy class. Not supported now. -->
       <attribute name="EvictionPolicyClass">org.jboss.cache.aop.eviction.AopLRUPolicy</attribute>
      
       <!-- Specific eviction policy configurations. This is LRU -->
       <attribute name="EvictionPolicyConfig">
       <config>
       <attribute name="wakeUpIntervalSeconds">5</attribute>
       <!-- Cache wide default -->
       <region name="/_default_">
       <attribute name="maxNodes">5000</attribute>
       <attribute name="timeToLiveSeconds">1000</attribute>
       </region>
       <region name="/aop">
       <attribute name="maxNodes">5</attribute>
       <attribute name="timeToLiveSeconds">4</attribute>
       </region>
       <region name="/pojo">
       <attribute name="maxNodes">100</attribute>
       <attribute name="timeToLiveSeconds">4</attribute>
       </region>
       <region name="/test">
       <attribute name="maxNodes">500</attribute>
       <attribute name="timeToLiveSeconds">0</attribute>
       </region>
       </config>
       </attribute>
      
       </mbean>
      
      
      </server>
      


      Exception
      java.lang.RuntimeException: java.io.NotSerializableException: RpcDispatcher retu
      rned a null. This is most often caused by args for _replicate(_put(null, /test/
      p1, p1, {Name = P1, Address = NR SZ 3009884}
      , true)) not being serializable.
       at org.jboss.cache.TreeCache.invokeMethod(TreeCache.java:5523)
       at org.jboss.cache.TreeCache.put(TreeCache.java:3677)
       at org.jboss.cache.TreeCache.put(TreeCache.java:3615)
       at org.jboss.cache.JSServlet.init(JSServlet.java:45)
       at javax.servlet.GenericServlet.init(GenericServlet.java:211)
       at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.
      java:1091)
       at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.jav
      a:750)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
      alve.java:130)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
      alve.java:178)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
      


      Am I missing something?

        • 1. Re: Running POJOCache error

          The apis are putObject, removeObject, and getObject for PojoCache. :-)

          • 2. Re: Running POJOCache error
            confuz

            Ben,
            Thanks for you response, that's my careless. now the program works well.

            And other need to clear.
            As my understanding, the main distinguish between TreeCache and PojoCache
            1. PojoCache only support in-memory(not support passivate to disk or other sources, once passivate, the object will evict out of cache system) while TreeCache support in-memory and passivate to disk or other sources.
            2.TreeCache cann't keep object references after state from passivation to activation or replcating from other node while PojoCache can.

            Any mistakes please correct me, thanks.

            • 3. Re: Running POJOCache error

              1. PojoCache does not support pure eviction. That is, it will support pure cache loader (persistency) or passivation (eviction + cacheloading).

              2. Yes.

              • 4. Re: Running POJOCache error
                confuz

                 

                "ben.wang@jboss.com" wrote:
                1. PojoCache does not support pure eviction. That is, it will support pure cache loader (persistency) or passivation (eviction + cacheloading).

                2. Yes.


                For point 1 , i wrote following test code
                package org.jboss.cache.passivation;
                
                import java.io.Serializable;
                import java.util.Properties;
                
                import javax.naming.Context;
                import javax.naming.InitialContext;
                import javax.transaction.UserTransaction;
                
                import org.apache.commons.logging.Log;
                import org.apache.commons.logging.LogFactory;
                import org.jboss.cache.CacheException;
                import org.jboss.cache.Fqn;
                import org.jboss.cache.PropertyConfigurator;
                import org.jboss.cache.aop.PojoCache;
                import org.jboss.cache.data.Address;
                import org.jboss.cache.data.Person;
                import org.jboss.cache.loader.CacheLoader;
                import org.jboss.cache.loader.SamplePojo;
                
                public class AOPTestPassivation1 {
                
                 PojoCache cache = null;
                 CacheLoader loader = null;
                
                 /**
                 * @param args
                 */
                 public static void main(String[] args) throws Exception {
                 AOPTestPassivation1 tester = new AOPTestPassivation1();
                 tester.start();
                 Log log = LogFactory.getLog(AOPTestPassivation1.class);
                 long start = System.currentTimeMillis();
                 tester.test1();
                 System.out.println("/test/1:" + tester.cache.getObject(Fqn.fromString("/test/1")));
                 System.out.println("/test/2:" + tester.cache.getObject(Fqn.fromString("/test/2")));
                 Thread.sleep(6000);
                
                 System.out.println("/test/3:" + tester.cache.getObject(Fqn.fromString("/test/3")));
                
                 long end = System.currentTimeMillis();
                 System.out.println(end - start);
                
                 tester.stop();
                 }
                
                
                
                 private void test1() throws Exception{
                 String key = "key";
                 String obj = "obj";
                 long start = System.currentTimeMillis();
                 long end = System.currentTimeMillis();
                 for(int i = 0; i < 1; i ++){
                 end = System.currentTimeMillis();
                 System.out.println("PPP:" + i + " Time:" + (end-start));
                 start = end;
                 for(int j = 0; j < 15; j ++){
                
                 cache.putObject("/test/"+(i*1000+j), "Object" + i);
                 }
                 }
                 }
                
                
                 private void start() throws Exception{
                 cache = new PojoCache();
                 PropertyConfigurator pc = new PropertyConfigurator();
                 pc.configure(cache, "META-INF/aop-tree-service1.xml");
                
                 cache.createService();
                 cache.startService();
                 loader = cache.getCacheLoader();
                
                 }
                
                
                 private void stop() throws Exception{
                 cache.remove("/");
                 //loader.remove(Fqn.fromString("/"));
                 cache.stopService();
                 cache.destroyService();
                 }
                
                }
                

                <?xml version="1.0" encoding="UTF-8"?>
                
                <!-- ===================================================================== -->
                <!-- -->
                <!-- Sample TreeCache Service Configuration -->
                <!-- -->
                <!-- ===================================================================== -->
                
                <server>
                
                 <classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/>
                
                
                 <!-- ==================================================================== -->
                 <!-- Defines TreeCache configuration -->
                 <!-- ==================================================================== -->
                
                 <mbean code="org.jboss.cache.aop.PojoCache"
                 name="jboss.cache:service=testTreeCache">
                
                 <depends>jboss:service=Naming</depends>
                 <depends>jboss:service=TransactionManager</depends>
                
                 <attribute name="TransactionManagerLookupClass">org.jboss.cache.DummyTransactionManagerLookup</attribute>
                
                 <attribute name="IsolationLevel">REPEATABLE_READ</attribute>
                
                 <attribute name="CacheMode">REPL_SYNC</attribute>
                
                 <attribute name="ClusterName">TreeCache-Cluster</attribute>
                
                 <attribute name="InitialStateRetrievalTimeout">20000</attribute>
                
                 <attribute name="SyncReplTimeout">15000</attribute>
                
                 <attribute name="LockAcquisitionTimeout">10000</attribute>
                
                 <attribute name="EvictionPolicyClass">org.jboss.cache.aop.eviction.AopLRUPolicy</attribute>
                
                 <attribute name="EvictionPolicyConfig">
                 <config>
                 <attribute name="wakeUpIntervalSeconds">5</attribute>
                 <!-- Cache wide default -->
                 <region name="/_default_">
                 <attribute name="maxNodes">5000</attribute>
                 <attribute name="timeToLiveSeconds">1000</attribute>
                 </region>
                 <region name="/aop">
                 <attribute name="maxNodes">5</attribute>
                 <attribute name="timeToLiveSeconds">4</attribute>
                 </region>
                 <region name="/pojo">
                 <attribute name="maxNodes">100</attribute>
                 <attribute name="timeToLiveSeconds">4</attribute>
                 </region>
                 <region name="/test">
                 <attribute name="maxNodes">10</attribute>
                 <attribute name="timeToLiveSeconds">0</attribute>
                 </region>
                 </config>
                 </attribute>
                
                
                 <attribute name="CacheLoaderConfiguration">
                 <config>
                 <passivation>true</passivation>
                
                 <shared>false</shared>
                
                 <cacheloader>
                 <class>org.jboss.cache.loader.bdbje.BdbjeCacheLoader</class>
                 <properties>
                 location=c:/tmp/filetore1
                 </properties>
                 <async>false</async>
                
                 <fetchPersistentState>false</fetchPersistentState>
                 <ignoreModifications>false</ignoreModifications>
                 <purgeOnStartup>false</purgeOnStartup>
                 </cacheloader>
                
                 </config>
                 </attribute>
                
                 </mbean>
                
                
                </server>
                


                The result is different base on passivation element configureation
                1. true output
                /test/1:Object0
                /test/2:Object0
                /test/3:null
                


                false output
                /test/1:Object0
                /test/2:Object0
                /test/3:Object0
                


                It seems the eviction + cacheloading works base on the passivation configuration value
                I check the document for passivation
                1. <!-- if passivation is true, only the first cache loader is used; the rest are ignored -->
                false

                2.To enable cache passivation/activation, you can set passivation to true. The default is false. You set it via the XML cache configuration file. The XML above shows the passivation element when configuring a cache loader. When passivation is used, only the first cache loader configured is used. All others are ignored.

                how to explain the test result, thanks..

                • 5. Re: Running POJOCache error

                  Sorry, are you saying setting passivation to true doesn't work in this case?

                  • 6. Re: Running POJOCache error
                    confuz

                    yes

                    • 7. Re: Running POJOCache error

                      Sorry to take so long to get back to you. Yes, I have verified in 1.4 that passivation won't work. The reason being that aop module have overriden the evict method to use a recursiveEvict and recursiveEvict would bypass the passivation interceptor. I have logged a Jira for this.

                      http://jira.jboss.com/jira/browse/JBCACHE-736

                      However, there is no easy fix as it involves the proper behavior for POJO eviction.

                      In the 2.0 release currently under development, I have opted not to provide POJO-specific eviction. Instead, the policy supported is passivation. I have couple of test cases that verified that it works.