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#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...