2016-05-26 7 views
1

この例を実装したいのですが、here が動作していますが、修正方法はわかりません。cassandra 3.xトリガの例エラー

public class AuditTrigger implements ITrigger 
{ 
    private Properties properties = loadProperties(); 

    public Collection<Mutation> augment(Partition update) 
    { 
     String auditKeyspace = properties.getProperty("keyspace"); 
     String auditTable = properties.getProperty("table"); 



     RowUpdateBuilder audit = new RowUpdateBuilder(Schema.instance.getCFMetaData(auditKeyspace, auditTable), 
                 FBUtilities.timestampMicros(), 
                 UUIDGen.getTimeUUID()); 


     audit.add("keyspace_name", update.metadata().ksName); 
     audit.add("table_name", update.metadata().cfName); 
     audit.add("primary_key", update.metadata().getKeyValidator().getString(update.partitionKey().getKey())); 

     return Collections.singletonList(audit.build()); 
    } 

    private static Properties loadProperties() 
    { 
     Properties properties = new Properties(); 
     InputStream stream = AuditTrigger.class.getClassLoader().getResourceAsStream("AuditTrigger.properties"); 
     try 
     { 
      properties.load(stream); 
     } 
     catch (Exception e) 
     { 
      throw new RuntimeException(e); 
     } 
     finally 
     { 
     // FileUtils.closeQuietly(stream); 

     } 
     return properties; 
    } 
} 

とXMLコード:

<project default="jar" name="trigger-example"> 
    <property name="cassandra.dir" value="../.." /> 
    <property name="cassandra.dir.lib" value="${cassandra.dir}/lib" /> 
    <property name="cassandra.classes" value="${cassandra.dir}/build/classes/main" /> 
    <property name="build.src" value="${basedir}/src" /> 
    <property name="build.dir" value="${basedir}/build" /> 
    <property name="conf.dir" value="${basedir}/conf" /> 
    <property name="build.classes" value="${build.dir}/classes" /> 
    <property name="final.name" value="trigger-example" /> 

    <path id="build.classpath"> 
     <fileset dir="${cassandra.dir.lib}"> 
      <include name="**/*.jar" /> 
     </fileset> 
     <fileset dir="${cassandra.dir}/build/lib/jars"> 
      <include name="**/*.jar" /> 
     </fileset> 
     <pathelement location="${cassandra.classes}" /> 
    </path> 
    <target name="init"> 
     <mkdir dir="${build.classes}" /> 
    </target> 

    <target name="build" depends="init"> 
     <javac destdir="${build.classes}" debug="true" includeantruntime="false"> 
      <src path="${build.src}" /> 
      <classpath refid="build.classpath" /> 
     </javac> 
    </target> 

    <target name="jar" depends="build"> 
     <jar jarfile="${build.dir}/${final.name}.jar"> 
      <fileset dir="${build.classes}" /> 
      <fileset dir="${conf.dir}"> 
       <include name="**/*.properties" /> 
      </fileset> 
     </jar> 
    </target> 

    <target name="clean"> 
     <delete dir="${build.dir}" /> 
    </target> 
    <dependencies> 
<dependency> 
    <groupId>org.apache.cassandra</groupId> 
    <artifactId>cassandra-all</artifactId> 
    <version>0.8.0-rc1</version> 
</dependency> 
</dependencies> 
</project> 

アン私はこのエラーを取得する:私は新しいRowUpdateBuilderオブジェクトを作成したいとき インスタンスが解決されないか、 フィールドではありませんすることができます。 誰でも助けることができますか?

+2

あなたはコンパイル時にこのエラーを取得またはいるために働いていますか?適切なビルドまたは実行ログを含めてください。 – mikea

答えて

0

カサンドラトリガーのClassLoaderが異なります。したがって、別のクラスにメソッドloadPropertiesを抽出し、$CASSANDRA/libにパッケージする必要があります。ポンポン

<dependencies> 
    <dependency> 
     <groupId>org.apache.cassandra</groupId> 
     <artifactId>cassandra-all</artifactId> 
     <version>3.6</version> 
    </dependency> 
</dependencies> 

とコードで

0

は、このようにする必要があり、それはあなたがトリガーを実行したときに、私は

import java.util.*; 
import org.apache.cassandra.config.Schema; 
import org.apache.cassandra.db.Mutation; 
import org.apache.cassandra.db.RowUpdateBuilder; 
import org.apache.cassandra.db.partitions.Partition; 
import org.apache.cassandra.triggers.ITrigger; 
import org.apache.cassandra.utils.FBUtilities; 
import static org.apache.cassandra.cql3.CQL3Type.logger; 

public class CassandraTrigger implements ITrigger{ 
    public Collection<Mutation> augment(Partition update) { 
     //Hard code properties, You can do that however you want 
     String auditKeyspace = "test_networktopology"; 
     String auditTable = "timestamptest"; 
     RowUpdateBuilder audit = new RowUpdateBuilder(Schema.instance.getCFMetaData(auditKeyspace, auditTable), 
       FBUtilities.timestampMicros(), 
       update.partitionKey()); 
     Calendar calendar = Calendar.getInstance(); 
     audit.add("time", calendar.getTime()); 
     return Collections.singletonList(audit.build()); 
    } 
    } 
関連する問題