You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ignite.apache.org by rizal123 <kh...@btpn.com> on 2018/05/23 02:57:18 UTC
IgniteCheckedException: Failed to validate cache configuration.
Cache store factory is not s erializable.
Dear Master Ignite,
i have exception "IgniteCheckedException: Failed to validate cache
configuration. Cache store factory is not s
erializable.".
*Here is my code:*
/**
*
*/
package com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Properties;
import javax.cache.configuration.Factory;
import javax.sql.DataSource;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.QueryEntity;
import org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory;
import org.apache.ignite.cache.store.jdbc.JdbcType;
import org.apache.ignite.cache.store.jdbc.JdbcTypeField;
import org.apache.ignite.cache.store.jdbc.dialect.OracleDialect;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import
org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
import oracle.jdbc.pool.OracleDataSource;
/**
* @author 17054072
*
*/
public class ClientConfigurationFactory implements Serializable{
/**
*
*/
private static final long serialVersionUID = 4067320674189197181L;
private static final Properties props = new Properties();
/*static {
try {
InputStream in =
IgniteConfiguration.class.getClassLoader().getResourceAsStream("META-INF/spring/secret.properties");
props.load(in);
}
catch (Exception ignored) {
// No-op.
}
}*/
public static class DataSources {
public static final OracleDataSource INSTANCE_dsOracle_Btpndev =
createdsOracle_Btpndev();
private static OracleDataSource createdsOracle_Btpndev() {
try {
OracleDataSource dsOracle_Btpndev = new OracleDataSource();
dsOracle_Btpndev.setURL("jdbc:oracle:thin:@10.1.92.63:1521:WOWDEV");
dsOracle_Btpndev.setUser("BTPN_BM_02");
dsOracle_Btpndev.setPassword("password");
/*dsOracle_Btpndev.setURL(props.getProperty("dsOracle_Btpndev.jdbc.url"));
dsOracle_Btpndev.setUser(props.getProperty("dsOracle_Btpndev.jdbc.username"));
dsOracle_Btpndev.setPassword(props.getProperty("dsOracle_Btpndev.jdbc.password"));*/
return dsOracle_Btpndev;
}
catch (SQLException ex) {
throw new Error(ex);
}
}
}
public static IgniteConfiguration createConfiguration() throws Exception
{
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setClientMode(true);
cfg.setIgniteInstanceName("BrandCluster");
TcpDiscoverySpi discovery = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
ipFinder.setAddresses(Arrays.asList("10.1.92.137:47500"));
discovery.setIpFinder(ipFinder);
cfg.setDiscoverySpi(discovery);
cfg.setCacheConfiguration(cacheSequenceCache());
return cfg;
}
public static CacheConfiguration cacheSequenceCache() throws Exception {
CacheConfiguration ccfg = new CacheConfiguration();
ccfg.setName("SequenceCache");
ccfg.setCacheMode(CacheMode.PARTITIONED);
ccfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
CacheJdbcPojoStoreFactory cacheStoreFactory = new
CacheJdbcPojoStoreFactory();
cacheStoreFactory.setDataSourceFactory(new Factory<DataSource>() {
/**
*
*/
private static final long serialVersionUID = -8028910004810254541L;
/** {@inheritDoc} **/
public DataSource create() {
return DataSources.INSTANCE_dsOracle_Btpndev;
};
});
cacheStoreFactory.setDialect(new OracleDialect());
cacheStoreFactory.setTypes(jdbcTypeSequence(ccfg.getName()));
ccfg.setCacheStoreFactory(cacheStoreFactory);
ccfg.setReadThrough(true);
ccfg.setWriteThrough(true);
ccfg.setSqlSchema("PUBLIC");
ArrayList<QueryEntity> qryEntities = new ArrayList<QueryEntity>();
QueryEntity qryEntity = new QueryEntity();
qryEntity.setKeyType("java.lang.String");
qryEntity.setValueType("com.btpn.rizal.khaerul.model.Sequence");
qryEntity.setTableName("SEQUENCE");
qryEntity.setKeyFieldName("seqName");
HashSet<String> keyFields = new HashSet<String>();
keyFields.add("seqName");
qryEntity.setKeyFields(keyFields);
LinkedHashMap<String, String> fields = new LinkedHashMap<String,
String>();
fields.put("seqCount", "java.math.BigDecimal");
fields.put("seqName", "java.lang.String");
qryEntity.setFields(fields);
HashMap<String, String> aliases = new HashMap<String, String>();
aliases.put("seqName", "SEQ_NAME");
aliases.put("seqCount", "SEQ_COUNT");
qryEntity.setAliases(aliases);
qryEntities.add(qryEntity);
ccfg.setQueryEntities(qryEntities);
return ccfg;
}
private static JdbcType jdbcTypeSequence(String cacheName) {
JdbcType type = new JdbcType();
type.setCacheName(cacheName);
type.setKeyType(String.class);
type.setValueType("com.btpnwow.brand.common.entity.Sequence");
type.setDatabaseSchema("BTPN_BM_02");
type.setDatabaseTable("SEQUENCE");
type.setKeyFields(new JdbcTypeField(Types.VARCHAR, "SEQ_NAME",
String.class, "seqName"));
type.setValueFields(new JdbcTypeField(Types.NUMERIC, "SEQ_COUNT",
BigDecimal.class, "seqCount"));
return type;
}
}
*Here is an error:*
class org.apache.ignite.IgniteCheckedException: Failed to start processor:
GridProcessorAdapter []
at
org.apache.ignite.internal.IgniteKernal.startProcessor(IgniteKernal.java:1873)
at
org.apache.ignite.internal.IgniteKernal.start(IgniteKernal.java:954)
at
org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start0(IgnitionEx.java:1909)
at
org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start(IgnitionEx.java:1652)
at
org.apache.ignite.internal.IgnitionEx.start0(IgnitionEx.java:1080)
at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:600)
at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:525)
at org.apache.ignite.Ignition.start(Ignition.java:322)
at
com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.Activator.start(Activator.java:40)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
at
org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
at
org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
at java.lang.Thread.run(Thread.java:745)
Caused by: class org.apache.ignite.IgniteCheckedException: Failed to
validate cache configuration. Cache store factory is not s
erializable. Cache name: SequenceCache
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor$9.applyx(GridCacheProcessor.java:3708)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor$9.applyx(GridCacheProcessor.java:3695)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.withBinaryContext(GridCacheProcessor.java:3740)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.cloneCheckSerializable(GridCacheProcessor.java:3695)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.addCacheOnJoin(GridCacheProcessor.java:663)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.addCacheOnJoinFromConfig(GridCacheProcessor.java:717)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.start(GridCacheProcessor.java:631)
at
org.apache.ignite.internal.IgniteKernal.startProcessor(IgniteKernal.java:1870)
... 14 more
Caused by: class org.apache.ignite.IgniteCheckedException: Failed to find
class with given class loader for unmarshalling (make
sure same versions of all classes are available on all nodes or enable
peer-class-loading) [clsLdr=org.apache.felix.framework.
BundleWiringImpl@4b6f59f5,
cls=com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config.ClientConfigurationFactory$1
not
found by org.apache.ignite.ignite-core [122]]
at
org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:124)
at
org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:94)
at
org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:143)
at
org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:82)
at
org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:9795)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor$9.applyx(GridCacheProcessor.java:3704)
... 21 more
Caused by: java.lang.ClassNotFoundException:
com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config.ClientConfiguration
Factory$1 not found by org.apache.ignite.ignite-core [122]
at
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1460)
at
org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
at
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:278)
at
org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8497)
at
org.apache.ignite.marshaller.jdk.JdkMarshallerObjectInputStream.resolveClass(JdkMarshallerObjectInputStream.java:54)
at
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/
RE: IgniteCheckedException: Failed to validate cache
configuration. Cachestore factory is not s erializable.
Posted by Stanislav Lukyanov <st...@gmail.com>.
Look at the bottom exceptions in the chain:
=========
Caused by: class org.apache.ignite.IgniteCheckedException: Failed to find
class with given class loader for unmarshalling (make
sure same versions of all classes are available on all nodes or enable
peer-class-loading) [clsLdr=org.apache.felix.framework.
BundleWiringImpl@4b6f59f5,
cls=com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config.ClientConfigurationFactory$1
not
found by org.apache.ignite.ignite-core [122]]
…
Caused by: java.lang.ClassNotFoundException:
com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config.ClientConfiguration
Factory$1 not found by org.apache.ignite.ignite-core [122]
=========
These exceptions suggest that you should check that the class
com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config.ClientConfigurationFactory$1
is available on all nodes.
One way to achieve that is to put a .jar with your code to every node’s $IGNITE_HOME/libs directory.
Alternatively, as also suggested by the exception message, you can turn on peer class loading.
See https://apacheignite.readme.io/docs/zero-deployment for defails.
Thanks,
Stan
From: rizal123
Sent: 23 мая 2018 г. 5:57
To: user@ignite.apache.org
Subject: IgniteCheckedException: Failed to validate cache configuration. Cachestore factory is not s erializable.
Dear Master Ignite,
i have exception "IgniteCheckedException: Failed to validate cache
configuration. Cache store factory is not s
erializable.".
*Here is my code:*
/**
*
*/
package com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Properties;
import javax.cache.configuration.Factory;
import javax.sql.DataSource;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.QueryEntity;
import org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory;
import org.apache.ignite.cache.store.jdbc.JdbcType;
import org.apache.ignite.cache.store.jdbc.JdbcTypeField;
import org.apache.ignite.cache.store.jdbc.dialect.OracleDialect;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import
org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
import oracle.jdbc.pool.OracleDataSource;
/**
* @author 17054072
*
*/
public class ClientConfigurationFactory implements Serializable{
/**
*
*/
private static final long serialVersionUID = 4067320674189197181L;
private static final Properties props = new Properties();
/*static {
try {
InputStream in =
IgniteConfiguration.class.getClassLoader().getResourceAsStream("META-INF/spring/secret.properties");
props.load(in);
}
catch (Exception ignored) {
// No-op.
}
}*/
public static class DataSources {
public static final OracleDataSource INSTANCE_dsOracle_Btpndev =
createdsOracle_Btpndev();
private static OracleDataSource createdsOracle_Btpndev() {
try {
OracleDataSource dsOracle_Btpndev = new OracleDataSource();
dsOracle_Btpndev.setURL("jdbc:oracle:thin:@10.1.92.63:1521:WOWDEV");
dsOracle_Btpndev.setUser("BTPN_BM_02");
dsOracle_Btpndev.setPassword("password");
/*dsOracle_Btpndev.setURL(props.getProperty("dsOracle_Btpndev.jdbc.url"));
dsOracle_Btpndev.setUser(props.getProperty("dsOracle_Btpndev.jdbc.username"));
dsOracle_Btpndev.setPassword(props.getProperty("dsOracle_Btpndev.jdbc.password"));*/
return dsOracle_Btpndev;
}
catch (SQLException ex) {
throw new Error(ex);
}
}
}
public static IgniteConfiguration createConfiguration() throws Exception
{
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setClientMode(true);
cfg.setIgniteInstanceName("BrandCluster");
TcpDiscoverySpi discovery = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
ipFinder.setAddresses(Arrays.asList("10.1.92.137:47500"));
discovery.setIpFinder(ipFinder);
cfg.setDiscoverySpi(discovery);
cfg.setCacheConfiguration(cacheSequenceCache());
return cfg;
}
public static CacheConfiguration cacheSequenceCache() throws Exception {
CacheConfiguration ccfg = new CacheConfiguration();
ccfg.setName("SequenceCache");
ccfg.setCacheMode(CacheMode.PARTITIONED);
ccfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
CacheJdbcPojoStoreFactory cacheStoreFactory = new
CacheJdbcPojoStoreFactory();
cacheStoreFactory.setDataSourceFactory(new Factory<DataSource>() {
/**
*
*/
private static final long serialVersionUID = -8028910004810254541L;
/** {@inheritDoc} **/
public DataSource create() {
return DataSources.INSTANCE_dsOracle_Btpndev;
};
});
cacheStoreFactory.setDialect(new OracleDialect());
cacheStoreFactory.setTypes(jdbcTypeSequence(ccfg.getName()));
ccfg.setCacheStoreFactory(cacheStoreFactory);
ccfg.setReadThrough(true);
ccfg.setWriteThrough(true);
ccfg.setSqlSchema("PUBLIC");
ArrayList<QueryEntity> qryEntities = new ArrayList<QueryEntity>();
QueryEntity qryEntity = new QueryEntity();
qryEntity.setKeyType("java.lang.String");
qryEntity.setValueType("com.btpn.rizal.khaerul.model.Sequence");
qryEntity.setTableName("SEQUENCE");
qryEntity.setKeyFieldName("seqName");
HashSet<String> keyFields = new HashSet<String>();
keyFields.add("seqName");
qryEntity.setKeyFields(keyFields);
LinkedHashMap<String, String> fields = new LinkedHashMap<String,
String>();
fields.put("seqCount", "java.math.BigDecimal");
fields.put("seqName", "java.lang.String");
qryEntity.setFields(fields);
HashMap<String, String> aliases = new HashMap<String, String>();
aliases.put("seqName", "SEQ_NAME");
aliases.put("seqCount", "SEQ_COUNT");
qryEntity.setAliases(aliases);
qryEntities.add(qryEntity);
ccfg.setQueryEntities(qryEntities);
return ccfg;
}
private static JdbcType jdbcTypeSequence(String cacheName) {
JdbcType type = new JdbcType();
type.setCacheName(cacheName);
type.setKeyType(String.class);
type.setValueType("com.btpnwow.brand.common.entity.Sequence");
type.setDatabaseSchema("BTPN_BM_02");
type.setDatabaseTable("SEQUENCE");
type.setKeyFields(new JdbcTypeField(Types.VARCHAR, "SEQ_NAME",
String.class, "seqName"));
type.setValueFields(new JdbcTypeField(Types.NUMERIC, "SEQ_COUNT",
BigDecimal.class, "seqCount"));
return type;
}
}
*Here is an error:*
class org.apache.ignite.IgniteCheckedException: Failed to start processor:
GridProcessorAdapter []
at
org.apache.ignite.internal.IgniteKernal.startProcessor(IgniteKernal.java:1873)
at
org.apache.ignite.internal.IgniteKernal.start(IgniteKernal.java:954)
at
org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start0(IgnitionEx.java:1909)
at
org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start(IgnitionEx.java:1652)
at
org.apache.ignite.internal.IgnitionEx.start0(IgnitionEx.java:1080)
at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:600)
at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:525)
at org.apache.ignite.Ignition.start(Ignition.java:322)
at
com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.Activator.start(Activator.java:40)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
at
org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
at
org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
at java.lang.Thread.run(Thread.java:745)
Caused by: class org.apache.ignite.IgniteCheckedException: Failed to
validate cache configuration. Cache store factory is not s
erializable. Cache name: SequenceCache
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor$9.applyx(GridCacheProcessor.java:3708)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor$9.applyx(GridCacheProcessor.java:3695)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.withBinaryContext(GridCacheProcessor.java:3740)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.cloneCheckSerializable(GridCacheProcessor.java:3695)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.addCacheOnJoin(GridCacheProcessor.java:663)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.addCacheOnJoinFromConfig(GridCacheProcessor.java:717)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.start(GridCacheProcessor.java:631)
at
org.apache.ignite.internal.IgniteKernal.startProcessor(IgniteKernal.java:1870)
... 14 more
Caused by: class org.apache.ignite.IgniteCheckedException: Failed to find
class with given class loader for unmarshalling (make
sure same versions of all classes are available on all nodes or enable
peer-class-loading) [clsLdr=org.apache.felix.framework.
BundleWiringImpl@4b6f59f5,
cls=com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config.ClientConfigurationFactory$1
not
found by org.apache.ignite.ignite-core [122]]
at
org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:124)
at
org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:94)
at
org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:143)
at
org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:82)
at
org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:9795)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor$9.applyx(GridCacheProcessor.java:3704)
... 21 more
Caused by: java.lang.ClassNotFoundException:
com.sybase365.mobiliser.custom.btpn.brand.ignite.custom.config.ClientConfiguration
Factory$1 not found by org.apache.ignite.ignite-core [122]
at
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1460)
at
org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
at
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:278)
at
org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8497)
at
org.apache.ignite.marshaller.jdk.JdkMarshallerObjectInputStream.resolveClass(JdkMarshallerObjectInputStream.java:54)
at
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/
Re: IgniteCheckedException: Failed to validate cache configuration.
Cache store factory is not s erializable.
Posted by rizal123 <kh...@btpn.com>.
Is there any solutions?
--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/