我有一个SessionDaoCassandraImpl类,它使用Astyanax从Cassandra读取数据,我想用嵌入式Cassandra服务器进行测试。 CassandraUnit似乎很完美,但我遇到了异常
ERROR - 2012-11-21 14:54:34,754 - AbstractCassandraDaemon.activate(370) | Exception encountered during startup
java.lang.NoSuchMethodError: com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap$Builder.maximumWeightedCapacity(I)Lcom/googlecode/concurrentlinkedhashmap/ConcurrentLinkedHashMap$Builder;
at org.apache.cassandra.cache.ConcurrentLinkedHashCache.create(ConcurrentLinkedHashCache.java:70)
该异常记录在案here,但我无法理解今天我能做些什么来绕过它。
以下是我使用的pom依赖项:
...
<dependency>
<groupId>org.cassandraunit</groupId>
<artifactId>cassandra-unit</artifactId>
<version>1.1.1.1</version>
<!-- <version>1.1.0.1</version> -->
<!-- version 1.1.0.1 leads to java.lang.NoSuchMethodError:
com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap$Builder.maximumWeightedCapacity -->
<!-- <version>0.8.0.2.4</version> -->
<!-- version 0.8.0.2.4 leads to ERROR - 2012-11-21 14:28:45,774 -
DatabaseDescriptor.loadYaml(479) | Fatal configuration error error -->
<scope>test</scope>
</dependency>
...
无论是使用1.1.1.1还是1.1.0.1,我都会遇到同样的异常。
<小时/> 我尝试过的事情
...
<dependency>
<groupId>org.cassandraunit</groupId>
<artifactId>cassandra-unit</artifactId>
<version>1.1.1.1</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
<artifactId>concurrentlinkedhashmap-lru</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
<artifactId>concurrentlinkedhashmap-lru</artifactId>
<version>1.3.1</version>
</dependency>
...
这对例外情况没有任何帮助。
以下是运行EmbeddedCassandraServerHelper.startEmbeddedCassandra()时生成异常的代码;
import java.io.IOException;
import org.apache.cassandra.config.ConfigurationException;
import org.apache.thrift.transport.TTransportException;
import org.cassandraunit.DataLoader;
import org.cassandraunit.dataset.xml.ClassPathXmlDataSet;
import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
import org.junit.Before;
import org.junit.Test;
import com.netflix.astyanax.AstyanaxContext;
import com.netflix.astyanax.Keyspace;
import com.netflix.astyanax.connectionpool.NodeDiscoveryType;
import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;
import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
import com.netflix.astyanax.thrift.ThriftFamilyFactory;
public class SessionDaoCassandraTestIT {
private SessionDaoCassandraImpl sessionDao;
@Before
public void init() throws TTransportException, IOException,
InterruptedException, ConfigurationException {
EmbeddedCassandraServerHelper.startEmbeddedCassandra();
final DataLoader dataLoader = new DataLoader("Test Cluster", "localhost:9171");
dataLoader.load(new ClassPathXmlDataSet("cassandraDataSet.xml"));
/* Doing this below instead of extending AbstractCassandraUnit4TestCase because
* getDataSet.getKeySpace() returns a Hector keyspace but we want to use Astyanax
* instead */
/* Code below inspired from
* http://pio-tech.blogspot.com/2012/07/unitintegration-testing-with-maven-and.html */
final AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
.forCluster("Test Cluster")
.forKeyspace("sessiondata")
.withAstyanaxConfiguration(
new AstyanaxConfigurationImpl()
.setDiscoveryType(NodeDiscoveryType.NONE))
.withConnectionPoolConfiguration(
new ConnectionPoolConfigurationImpl("testConnectionPool")
.setPort(9171).setMaxConnsPerHost(1)
.setSeeds("localhost:9171"))
.withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
.buildKeyspace(ThriftFamilyFactory.getInstance());
context.start();
final Keyspace keyspace = context.getEntity();
sessionDao = new SessionDaoCassandraImpl(keyspace);
}
@Test
public void shouldDisplayAccountFromSessionCreatedByDataLoader() {
System.out.println(sessionDao.getSession("72b97796-b1b3-4220-ba03-ba7e9ecfe946").get().getAccount());
}
}
最后,这是我的cassandraDataTest.xml的开头:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<keyspace xmlns="http://xml.dataset.cassandraunit.org">
<name>sessiondata</name>
<columnFamilies>
<columnFamily>
<name>session</name>
<keyType>UTF8Type</keyType>
<comparatorType>UTF8Type</comparatorType>
<defaultColumnValueType>UTF8Type</defaultColumnValueType>
<row>
<key>72b97796-b1b3-4220-ba03-ba7e9ecfe946</key>
<column>
<name>account</name>
<value>account</value>
</column>
...
答案 0 :(得分:3)
原来我的项目使用的astyanax库调用了比1.1.1更旧版本的cassandra。 在pom中添加排除解决了我的问题:
<dependency>
<groupId>com.netflix.astyanax</groupId>
<artifactId>astyanax</artifactId>
<version>1.0.4</version>
<exclusions>
<exclusion>
<groupId>org.apache.cassandra</groupId>
<artifactId>cassandra-all</artifactId>
</exclusion>
</exclusions>
</dependency>