3

組み込みのCassandraサーバーでテストしたいAstyanaxを使用してCassandraからデータを読み取るSessionDaoCassandraImplクラスがあります。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)

その例外はここに文書化され ていますが、それを回避するために今日何ができるか理解できません。

これが私が使用した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のどちらを使用しても、同じ例外が発生します。


私が試し

たことまた、例外の原因となるクラスの除外を追加し、最新バージョン1.3.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>
 ...      
4

1 に答える 1

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>
于 2012-11-26T15:59:23.133 に答える