[jboss-user] [JBoss Cache: Core Edition] - Writing custom Async Loader

canik do-not-reply at jboss.com
Wed Feb 18 06:42:14 EST 2009

Hello folks,

First a little intro to my persistence problem:
I'm writing data to a couple of different nodes in JBoss Cache. I'm doing this in a batch (afaik this is interpreted as a transaction by JBoss) since the different cache nodes in fact contain a memory snapshot of a parsing process.
The parsing process is fast, that is, there can be lots of put operations per second. Thus I use async. replication, to replicate the data only every ~500ms. The problem is, I do not need the database to be hit that often. It would be absolutely sufficient to write the last snapshot (without the intermediate stages) to the DB every 5 seconds. I cannot see any possibility to do this without custom coding.

First I tried "cache.getInvocationContext().getOptionOverrides().setSuppressPersistence(true);" but this does not work for transactions. (Even if it worked, I still would have the little issue that if I suppress persistence for 5 seconds, and the parsing stopped for a while, the last message would not be persisted (because suppression is on), even if 10 hours had passed. But I could live with that.)

Then I tried to write a custom cache loader based on the async loader. I tried both: extending AbstractDelegatingCacheLoader and extending AsyncCacheLoader.
But start() e.g. never gets called in my implementation. I inserted log outputs in multiple methods. When the constructor is invoked, log output appears. Also, for setConfig(), and setCache() I can produce log output. But start() is never invoked. Nor are any of the put() methods invoked. Persistence via JDBC works, though.

This is a cache configuration xml fragment:

  | <loaders passivation="false" shared="true">
  |        <loader class="mypackage.CustomJDBCCacheLoader" async="false" fetchPersistentState="false"
  |             ignoreModifications="false" purgeOnStartup="false">
  |           <properties>
  |             cache.jdbc.driver=org.postgresql.Driver
  |             cache.jdbc.url=jdbc:postgresql://localhost:5432/...
  |             cache.jdbc.user=...
  |             cache.jdbc.password=...
  |             cache.jdbc.table.name=...
  |             cache.jdbc.table.drop=false
  |             cache.jdbc.node.type=bytea
  |           </properties>
  |        </loader>
  |    </loaders>

So, does anybody know why start() isn't invoked by the framework?

Best regards,
Can Özdemir

import org.apache.commons.logging.Log;
  | import org.apache.commons.logging.LogFactory;
  | public class CustomJDBCCacheLoader extends org.jboss.cache.loader.AsyncCacheLoader
  | {
  |    private static final Log log = LogFactory.getLog(CustomJDBCCacheLoader.class);
  |    public CustomJDBCCacheLoader()
  |    {
  |       super(new org.jboss.cache.loader.JDBCCacheLoader());
  |       log.info("ASYNC JDBC LOADER Constructor");
  |    }
  |    @Override
  |    public void start() throws Exception
  |    {
  |       log.info("-----------------Async cache loader starting: " + this);
  |       System.out.println("-----------------Async cache loader starting: " + this);
  |       super.start();
  |    }
  | }

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

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4211033

More information about the jboss-user mailing list