In our application, we need to remove some nodes (FQNs) from the cache before 
reinserting them. We do not know which nodes must be removed exactly, so we 
just remove their nearest FQN parent. The nodes are loaded using a CacheLoader 
later in the same transaction.

For simplicity, let's say we have a cache instance called "cache" that is 
configured to use a custom CacheLoader that always returns "value from 
CacheLoader". Starting with an empty cache we call:

cache.remove(Fqn.fromString("/a"));
  | String val = (String) cache.get("/a/b/c", "key");
  | assertEquals("value from CacheLoader", val);

The result will be null instead of "value from CacheLoader".

This is because the parent node of the new key is put into the 
TransactionEntry's list of cache loader modifications when remove() is called. 
In the CacheLoaderInterceptor.invoke() method, the list is checked before 
loading the node:

if (!initNode && !wasRemovedInTx(fqn))
  | {
  |     n = loadNode(fqn, n, entry);
  | }

Here, wasRemovedInTx returns true although the node has never been loaded 
before. As a result, the node is not loaded by the cache loader.

JBC version is 1.4.1 SP9.
Are we doing something wrong here?

Regards,

Kai

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

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

Reply via email to