Thank you for all the help - you guys are doing a great job.

I have spent that past several weeks preparing was was supposed to have been a 
very simple JBossCache demo for work. I suspect that I am very close to having 
what is required, but there is still one outstanding issue - I cannot get 
fine-grained replication to work. 

I am using JBoss 4.2.1 GA and JBossCache 2.0.0 GA. I have a single instance of 
JBoss running on each of two seperate nodes in the same cluster with an EJB 
running in each of the two instances. I also have two seperate standalone apps 
(clients used to monitor the EJBs for demonstration purposes) running on each 
of the two nodes. 

I need any changes that are made to an object in either of the two nodes to 
automatically propagate to the other (ie. fine-grained replication).

Upon initialization, the following happens on each of the nodes:

The PojoCache wrapper is registered as an MBean using the following code:


MBeanServer server = MBeanServerLocator.locateJBoss();
ObjectName on = new ObjectName("jboss.cache:service=PojoCache")         

PojoCache cache = PojoCacheFactory.createCache("META-INF/service.xml", true);
PojoCacheJmxWrapperMBean wrapper = new PojoCacheJmxWrapper(cache);

server.registerMBean(wrapper, on);


an object is attached to one of the instances using the following code:


PojoCache cache = cacheWrapper.getPojoCache();
cache.attach("/person", person);


the object is retrieved on the other node and it's values are displayed using 
the following code:


PojoCache cache = cacheWrapper.getPojoCache();
person = (Person)cache.find("/person");
System.out.println(person.toString());


This all works fine. If I make a change to the object on either of the two 
nodes and REATTACH it to the cache, the changes
are successfully propagated to the other node.

The problem is that I have to reattach the object to the cache in order for it 
to be replicated and therefore lose the benefits of fine-grained replication. 
Changes to the object are not automatically intercepted and propagated to the 
other node.

I suspect that the problem is related to instrumentation of objects. I am using 
pojocache-aop.xml and have annotated my Pojo with the 
"@org.jboss.cache.pojo.annotation.Replicable" annotation. A comment in the 
pojocache-aop.xml file states that "If a POJO has PojoCachable annotation, it 
will be asepectized". I have searched the entire JBossCache distribution jar 
file, but simply cannot find a class named PojoCachable. I have not made any 
changes to the pojocache-aop.xml file as I understand that any Pojo annotated 
with "@org.jboss.cache.pojo.annotation.Replicable", will automatically become 
replicable.

I have attached the code for the EJB as well as the contents of service.xml 
below.

Thank you for your time and help.

The EJB code:



package za.co.test.cachedemo.model.session;

import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerInvocationHandler;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;

import org.jboss.cache.pojo.PojoCache;
import org.jboss.cache.pojo.PojoCacheFactory;
import org.jboss.cache.pojo.jmx.PojoCacheJmxWrapper;
import org.jboss.cache.pojo.jmx.PojoCacheJmxWrapperMBean;
import org.jboss.mx.util.MBeanServerLocator;

import za.co.test.cachedemo.model.dto.Person;

public class JBossCacheDemoBean implements SessionBean {
        
        SessionContext sessionContext;
        
        public void initCache() throws java.rmi.RemoteException {
                
                try {
                MBeanServer server = MBeanServerLocator.locateJBoss();
                ObjectName on = new ObjectName("jboss.cache:service=PojoCache");
                
                        PojoCache cache = 
PojoCacheFactory.createCache("META-INF/service.xml", true);
                PojoCacheJmxWrapperMBean wrapper = new 
PojoCacheJmxWrapper(cache);

                server.registerMBean(wrapper, on);
                }
                catch(Exception e) {
                        System.out.println(e.getMessage());
                }
        }
        
        public void attachObjectToCache(Person person) throws 
java.rmi.RemoteException {
                try {
                        MBeanServer server = MBeanServerLocator.locateJBoss();
                        ObjectName on = new 
ObjectName("jboss.cache:service=PojoCache");

                        PojoCacheJmxWrapperMBean cacheWrapper = 
                                (PojoCacheJmxWrapperMBean) 
MBeanServerInvocationHandler.newProxyInstance(server, on,
                                                PojoCacheJmxWrapperMBean.class, 
false);

                        PojoCache cache = cacheWrapper.getPojoCache();
                cache.attach("/person", person);
                }
                catch(Exception e) {
                        System.out.println(e.getMessage());
                }
        }
        
        public Person displayCacheContent() throws java.rmi.RemoteException {
                Person person = null;
                try {
                        MBeanServer server = MBeanServerLocator.locateJBoss();
                        ObjectName on = new 
ObjectName("jboss.cache:service=PojoCache");

                        PojoCacheJmxWrapperMBean cacheWrapper = 
                                (PojoCacheJmxWrapperMBean) 
MBeanServerInvocationHandler.newProxyInstance(server, on,
                                                PojoCacheJmxWrapperMBean.class, 
false);

                        PojoCache cache = cacheWrapper.getPojoCache();
                        person = (Person)cache.find("/person");
                }
                catch(Exception e) {
                        System.out.println(e.getMessage());
                }
                return person;
                
        }

        public void modifyCacheContent(Person person_) throws 
java.rmi.RemoteException {                

                try {
                        ObjectName on = new 
ObjectName("jboss.cache:service=PojoCache");
                        
                        MBeanServer server = MBeanServerLocator.locateJBoss();
                        PojoCacheJmxWrapperMBean cacheWrapper = 
                                (PojoCacheJmxWrapperMBean) 
MBeanServerInvocationHandler.newProxyInstance(server, on,
                                                PojoCacheJmxWrapperMBean.class, 
false);

                        PojoCache cache = cacheWrapper.getPojoCache();
                        
                        Person person = (Person)cache.find("/person");
                        person.setAge(person_.getAge());
                        person.setName(person_.getName());
                        person.setSurname(person_.getSurname());
                }
                catch(MalformedObjectNameException e) {
                        System.out.println("ERROR:" + e.getMessage());
                        e.printStackTrace();
                }
        }

        public void destroyCache() throws java.rmi.RemoteException {
                try {
                        ObjectName on = new 
ObjectName("jboss.cache:service=PojoCache");
                        
                        MBeanServer server = MBeanServerLocator.locateJBoss();
                        PojoCacheJmxWrapperMBean cacheWrapper = 
                                (PojoCacheJmxWrapperMBean) 
MBeanServerInvocationHandler.newProxyInstance(server, on,
                                                PojoCacheJmxWrapperMBean.class, 
false);

                        PojoCache cache = cacheWrapper.getPojoCache();
                        cache.stop();
                        cache.destroy();
                        server.unregisterMBean(on);

                }
                catch(MalformedObjectNameException e) {
                        System.out.println("ERROR:" + e.getMessage());
                        e.printStackTrace();
                }
                catch(InstanceNotFoundException e) {
                        System.out.println("ERROR:" + e.getMessage());
                        e.printStackTrace();
                }
                catch(MBeanRegistrationException e) {
                        System.out.println("ERROR:" + e.getMessage());
                        e.printStackTrace();
                }               
        }
        
        public void ejbCreate() throws CreateException {

        }

        public void setSessionContext(SessionContext sessionContext) {
                this.sessionContext = sessionContext;
        }

        public void ejbRemove() {
        }

        public void ejbActivate() {
        }

        public void ejbPassivate() {
        }
        
}



Contents of service.xml:



   

      jboss:service=Naming
      jboss:service=TransactionManager

      <!--
          Configure the TransactionManager
      -->
      org.jboss.cache.transaction.GenericTransactionManagerLookup
      

      <!--
          Isolation level : SERIALIZABLE
                            REPEATABLE_READ (default)
                            READ_COMMITTED
                            READ_UNCOMMITTED
                            NONE
      -->
      REPEATABLE_READ

      <!--
           Valid modes are LOCAL
                           REPL_ASYNC
                           REPL_SYNC
                           INVALIDATION_ASYNC
                           INVALIDATION_SYNC
      -->
      REPL_ASYNC

      <!--
      Just used for async repl: use a replication queue
      -->
      false

      <!--
          Replication interval for replication queue (in ms)
      -->
      0

      <!--
          Max number of elements which trigger replication
      -->
      0

      <!-- Name of cluster. Needs to be the same for all TreeCache nodes in a
           cluster in order to find each other.
      -->
      JBossCache-Cluster

      <!--Uncomment next three statements to enable JGroups multiplexer.
This configuration is dependent on the JGroups multiplexer being
registered in an MBean server such as JBossAS.  -->
      <!--
      jgroups.mux:name=Multiplexer
      jgroups.mux:name=Multiplexer
      fc-fast-minimalthreads
      -->

      <!-- JGroups protocol stack properties.
         ClusterConfig isn't used if the multiplexer is enabled and 
successfully initialized.
      -->
      
         
            <UDP mcast_addr="228.10.10.10"
                 mcast_port="45588"
                 tos="8"
                 ucast_recv_buf_size="20000000"
                 ucast_send_buf_size="640000"
                 mcast_recv_buf_size="25000000"
                 mcast_send_buf_size="640000"
                 loopback="false"
                 discard_incompatible_packets="true"
                 max_bundle_size="64000"
                 max_bundle_timeout="30"
                 use_incoming_packet_handler="true"
                 ip_ttl="2"
                 enable_bundling="false"
                 enable_diagnostics="true"

                 use_concurrent_stack="true"

                 thread_naming_pattern="pl"

                 thread_pool.enabled="true"
                 thread_pool.min_threads="1"
                 thread_pool.max_threads="25"
                 thread_pool.keep_alive_time="30000"
                 thread_pool.queue_enabled="true"
                 thread_pool.queue_max_size="10"
                 thread_pool.rejection_policy="Run"

                 oob_thread_pool.enabled="true"
                 oob_thread_pool.min_threads="1"
                 oob_thread_pool.max_threads="4"
                 oob_thread_pool.keep_alive_time="10000"
                 oob_thread_pool.queue_enabled="true"
                 oob_thread_pool.queue_max_size="10"
                 oob_thread_pool.rejection_policy="Run"/>

            <PING timeout="2000" num_initial_members="3"/>
            <MERGE2 max_interval="30000" min_interval="10000"/>
            <FD_SOCK/>
            <FD timeout="10000" max_tries="5" shun="true"/>
            <VERIFY_SUSPECT timeout="1500"/>
            <pbcast.NAKACK max_xmit_size="60000"
                           use_mcast_xmit="false" gc_lag="0"
                           retransmit_timeout="300,600,1200,2400,4800"
                           discard_delivered_msgs="true"/>
            
            <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
                           max_bytes="400000"/>
            <pbcast.GMS print_local_addr="true" join_timeout="5000"
                        join_retry_timeout="2000" shun="false"
                        view_bundling="true" 
view_ack_collection_timeout="5000"/>
            <FC max_credits="20000000" min_threshold="0.10"/>
            <FRAG2 frag_size="60000"/>
            <pbcast.STREAMING_STATE_TRANSFER use_reading_thread="true"/>
            <!-- <pbcast.STATE_TRANSFER/> -->
            <pbcast.FLUSH timeout="0"/>
         
      

      <!--
       Whether or not to fetch state on joining a cluster
       NOTE this used to be called FetchStateOnStartup and has been renamed to 
be more descriptive.
      -->
      true

      <!--
          The max amount of time (in milliseconds) we wait until the
          state (ie. the contents of the cache) are retrieved from
          existing members in a clustered environment
      -->
      20000

      <!--
          Number of milliseconds to wait until all responses for a
          synchronous call have been received.
      -->
      20000

      <!-- Max number of milliseconds to wait for a lock acquisition -->
      15000

      <!--
         Indicate whether to use region based marshalling or not. Set this to 
true if you are running under a scoped
         class loader, e.g., inside an application server. Default is "false".
      -->
      false

   


   <!--  Uncomment to get a graphical view of the TreeCache MBean above -->
   <!--   -->
   <!--      jboss.cache:service=TreeCache-->
   <!--      jboss.cache:service=TreeCache-->
   <!--   -->




Last few lines of pojocache-aop.xml:



   <!-- If a POJO has PojoCachable annotation, it will be asepectized. -->
   <!--
   Supports inheritance and polymorphism. It can either be a concrete class
   or an interface. All sub-classes or interface implementors will be 
instrumeneted.
   -->
      





View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4094926#4094926

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4094926
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to