Problems with creating own JDBCStore (java.lang.IllegalArgumentException: Cannot load null class!)
tomask74 Jan 7, 2013 9:54 AMHi guys,
I'm trying to create own JDBCStore with JBoss Infinispan, version 5.1.7.Final. But everytime when I try to get the instance
of the cache with the attached Store, via EmbddedCacheManager:
(cache is added programatically, adding it within the XML configuration file ends with the same result....)
Configuration loc = new ConfigurationBuilder() .clustering().cacheMode(CacheMode.LOCAL) .transaction().transactionMode(TransactionMode.TRANSACTIONAL) .autoCommit(false) .transactionManagerLookup(new GenericTransactionManagerLookup()) .loaders().passivation(false).preload(false).shared(false) .addCacheLoader().cacheLoader(new JDBCStore()) .fetchPersistentState(false).purgeOnStartup(true) .addProperty("url", "jdbc:oracle:thin:@localhost:1521:XE") .addProperty("user", "......") .addProperty("password", "......") .addProperty("driverClassName", "oracle.jdbc.driver.OracleDriver") .build(); SampleCacheContainer.getCacheContainer().defineConfiguration(CACHE_NAME, loc); Cache<Long, String> writerCache = SampleCacheContainer.getCacheContainer().getCache(CACHE_NAME); writerCache.put(1, "aaaaaa"); writerCache.put(2, "bbbbbb"); writerCache.put(3, "cccccc");
it fails with:
java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297) at java.lang.Thread.run(Thread.java:662) Caused by: org.infinispan.CacheException: Unable to invoke method public void or g.infinispan.loaders.CacheLoaderManagerImpl.start() on object of type CacheLoade rManagerImpl at org.infinispan.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.ja va:238) at org.infinispan.factories.AbstractComponentRegistry$PrioritizedMethod. invoke(AbstractComponentRegistry.java:889) at org.infinispan.factories.AbstractComponentRegistry.invokeStartMethods (AbstractComponentRegistry.java:639) at org.infinispan.factories.AbstractComponentRegistry.internalStart(Abst ractComponentRegistry.java:628) at org.infinispan.factories.AbstractComponentRegistry.start(AbstractComp onentRegistry.java:531) at org.infinispan.factories.ComponentRegistry.start(ComponentRegistry.ja va:174) at org.infinispan.CacheImpl.start(CacheImpl.java:521) at org.infinispan.manager.DefaultCacheManager.createCache(DefaultCacheMa nager.java:656) at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManag er.java:549) at com.sample.SampleCacheContainer.getCache(SampleCacheContainer.java:59 ) at com.sample.Application.registerCacheWithWriter(Application.java:118) at com.sample.Application.main(Application.java:133) ... 6 more Caused by: org.infinispan.CacheException: Unable to start cache loaders at org.infinispan.loaders.CacheLoaderManagerImpl.start(CacheLoaderManage rImpl.java:160) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.infinispan.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.ja va:236) ... 17 more Caused by: java.lang.IllegalArgumentException: Cannot load null class! at org.infinispan.util.Util.getInstance(Util.java:207) at org.infinispan.loaders.CacheLoaderManagerImpl.createCacheLoader(Cache LoaderManagerImpl.java:292) at org.infinispan.loaders.CacheLoaderManagerImpl.createCacheLoader(Cache LoaderManagerImpl.java:277) at org.infinispan.loaders.CacheLoaderManagerImpl.start(CacheLoaderManage rImpl.java:146) ... 22 more
Simple test implementation of the Store looks like (I was trying to follow the JDBCStringBasedCacheStore....) :
package com.samplestore; import java.io.ObjectInput; import java.io.ObjectOutput; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.dbcp.BasicDataSource; import org.infinispan.Cache; import org.infinispan.container.InternalEntryFactoryImpl; import org.infinispan.container.entries.InternalCacheEntry; import org.infinispan.container.versioning.EntryVersion; import org.infinispan.container.versioning.InequalVersionComparisonResult; import org.infinispan.loaders.AbstractCacheStore; import org.infinispan.loaders.CacheLoaderConfig; import org.infinispan.loaders.CacheLoaderException; import org.infinispan.loaders.CacheLoaderMetadata; import org.infinispan.marshall.StreamingMarshaller; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; class MyRowMapper implements RowMapper<InternalCacheEntry> { public InternalCacheEntry mapRow(ResultSet rs, int rowNum) throws SQLException { InternalEntryFactoryImpl impl = new InternalEntryFactoryImpl(); return impl.create(rs.getLong("key"), rs.getString("value"), new EntryVersion() { @Override public InequalVersionComparisonResult compareTo(EntryVersion arg0) { return arg0.compareTo(this); } }); } } @CacheLoaderMetadata(configurationClass = MyCacheStoreConfig.class) public class JDBCStore extends AbstractCacheStore { private static final String TABLE = "TEST_INFINISPAN"; private JdbcTemplate template; private MyCacheStoreConfig config; public void init(CacheLoaderConfig config, Cache cache, StreamingMarshaller m) throws CacheLoaderException { super.init(config, cache, m); this.config = (MyCacheStoreConfig) config; System.out.println("initializing..."); } public void start() throws CacheLoaderException { super.start(); BasicDataSource bdSource = new BasicDataSource(); bdSource.setUrl(this.config.getUrl()); bdSource.setUsername(this.config.getUser()); bdSource.setPassword(this.config.getPassword()); bdSource.setDriverClassName(this.config.getDriverClassName()); template = new JdbcTemplate(bdSource); System.out.println("starting......."); } @Override public void clear() throws CacheLoaderException { // TODO Auto-generated method stub } @Override public void fromStream(ObjectInput arg0) throws CacheLoaderException { // TODO Auto-generated method stub } @Override public boolean remove(Object arg0) throws CacheLoaderException { // TODO Auto-generated method stub return false; } @Override public void store(InternalCacheEntry arg0) throws CacheLoaderException { System.out.println("store key..."); List<Object[]> args = new ArrayList<Object[]>(); prepareJdbcArgs(args, (Long) arg0.getKey(), (String) arg0.getValue()); performInsert(args); } @Override public void toStream(ObjectOutput arg0) throws CacheLoaderException { // TODO Auto-generated method stub } @Override public Class<? extends CacheLoaderConfig> getConfigurationClass() { return MyCacheStoreConfig.class; } @Override public InternalCacheEntry load(Object arg0) throws CacheLoaderException { System.out.println("load key..."); String sql = "SELECT * FROM "+TABLE+" WHERE KEY = ?"; InternalCacheEntry cacheEntry = (InternalCacheEntry)template.queryForObject( sql, new Object[] { arg0 }, new MyRowMapper()); return cacheEntry; } @Override public Set<InternalCacheEntry> load(int arg0) throws CacheLoaderException { return loadAll(); } @Override public Set<InternalCacheEntry> loadAll() throws CacheLoaderException { System.out.println("loading all keys..."); return new HashSet(template.queryForList("select key from " + TABLE, Long.class)); } @Override public Set<Object> loadAllKeys(Set<Object> arg0) throws CacheLoaderException { // TODO Auto-generated method stub Set<Object> kSet = new HashSet<Object>(); Set<InternalCacheEntry> lAll = loadAll(); for (InternalCacheEntry entry: lAll) { kSet.add(entry.getKey()); } return kSet; } @Override protected void purgeInternal() throws CacheLoaderException { // TODO Auto-generated method stub } private static void prepareJdbcArgs(List<Object[]> jdbcArgs, Long key, String map) { System.out.println("preparing args..."); jdbcArgs.add(new Object[]{key, key, map}); } private void performInsert(List<Object[]> jdbcArgs) { System.out.println("performing insert..."); template.batchUpdate("insert into " + TABLE + " (key, value) values (?,?)", jdbcArgs); } }
Cache Store configuration looks like:
package com.samplestore; import org.infinispan.loaders.AbstractCacheStoreConfig; public class MyCacheStoreConfig extends AbstractCacheStoreConfig { private static final long serialVersionUID = 1L; protected String url = ""; protected String user = ""; protected String password = ""; protected String driverClassName = ""; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public static long getSerialversionuid() { return serialVersionUID; } }
Could some please point me onto what I'm doing wrong? Problem is that the documentation doesn't provide any example
with creating of the own store implementation...:-((
thanks a lot in advance
T.