ConfigurationException:触发类'org.apache.cassandra.triggers.AuditTrigger'不存在

时间:2018-07-22 17:45:13

标签: cassandra cassandra-3.0

我正在使用here创建触发器,但根本无法正常工作,并且我收到ConfigurationException:触发器类'org.apache.cassandra.triggers.AuditTrigger'不存在。

我创建触发器的步骤如下:

1:我已经使用

编译了Java文件。

javac -cp /CassandraTriggerExample/lib/cassandra-all-3.6.jar    AuditTrigger.Java

2:瓶子的制造:

jar -cvf trigger-example.jar AuditTrigger.class

3:我检查了jar文件的内容:

“解压缩-l trigger-example.jar”

enter image description here

4:将此jar文件复制到:     cassandra_home / conf / triggers

5:将AuditTrigger.properties复制到:     cassandra_home / conf

6:重新启动cassandra服务器

7:./nodetool -h localhost reloadtriggers

8:在system.log中,我可以看到以下条目:

INFO  [RMI TCP Connection(2)-127.0.0.1] 2018-07-22 22:15:25,827 
   CustomClassLoader.java:89 - Loading new jar 
   /Users/uname/cassandra/conf/triggers/trigger-example.jar

9:现在,当我使用以下命令创建触发器时:

 CREATE TRIGGER test1 ON test.test
        USING 'org.apache.cassandra.triggers.AuditTrigger';

我收到“ ConfigurationException:触发器类'org.apache.cassandra.triggers.AuditTrigger'不存在”。

2 个答案:

答案 0 :(得分:3)

我认为问题在于您的jar封装不正确:如果您的类的名称为org.apache.cassandra.triggers.AuditTrigger,则它应该位于jar文件中的org/apache/cassandra/triggers/AuditTrigger.class下...

有关更多详细信息,请参见this documentation,以解释如何找到类...

答案 1 :(得分:0)

有类似的问题。可能是因为您复制了它,但没有重新加载触发器或创建触发器。通过执行以下检查并执行命令以重新加载并创建触发器,可以解决该问题。

检查

确保该类的名称为org.apache.cassandra.triggers.AuditTrigger,并且该名称位于jar文件内org/apache/cassandra/triggers/AuditTrigger.class下。

CMD命令

转到Cassandra安装文件夹的bin文件夹,以运行nodetool reloadtriggers命令,如下所示。

C:\Cassandra\apache-cassandra-3.11.6\bin>nodetool reloadtriggers

在cqlsh提示符下执行以下语句

CREATE TRIGGER test1 ON test.test USING 'org.apache.cassandra.triggers.AuditTrigger';

您的触发器现在应该可用了! 如果问题仍然存在,则可以尝试重新启动服务器一次,以查看是否可用。 在下面的代码中找到我在每次插入Cassandra DB时向Kafka使用者发布消息的内容。您可以对其进行修改以进行更新。我使用了JDK 1.8.0_251apache-cassandra-3.11.7kafka_2.13-2.6.0Zookeeper-3.6.1

/**
 * 
 */
package com.cass.kafka.insert.trigger;

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Properties;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.apache.cassandra.config.ColumnDefinition;
import org.apache.cassandra.db.Mutation;
import org.apache.cassandra.db.partitions.Partition;
import org.apache.cassandra.db.rows.Cell;
import org.apache.cassandra.db.rows.Row;
import org.apache.cassandra.db.rows.Unfiltered;
import org.apache.cassandra.db.rows.UnfilteredRowIterator;
import org.apache.cassandra.triggers.ITrigger;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;

/**
 * @author Dinesh.Lomte
 *
 */
public class InsertCassTriggerForKafkaPublish implements ITrigger {

    private String topic;
    private Producer<String, String> producer;
    private ThreadPoolExecutor threadPoolExecutor;

    /**
     * 
     */
    public InsertCassTriggerForKafkaPublish() {
        
        Thread.currentThread().setContextClassLoader(null);
        
        topic = "test";
        producer = new KafkaProducer<String, String>(getProps());
        threadPoolExecutor = new ThreadPoolExecutor(4, 20, 30,
                TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());
    }

    /**
     * 
     */
    @Override
    public Collection<Mutation> augment(Partition partition) {
        threadPoolExecutor.execute(() -> handleUpdate(partition));
        return Collections.emptyList();
    }

    /**
     * 
     * @param partition
     */
    private void handleUpdate(Partition partition) {
        
        if (!partition.partitionLevelDeletion().isLive()) {
            return;
        }
        UnfilteredRowIterator it = partition.unfilteredIterator();
        while (it.hasNext()) {
            Unfiltered un = it.next();
            Row row = (Row) un;
            if (row.primaryKeyLivenessInfo().timestamp() != Long.MIN_VALUE) {
                Iterator<Cell> cells = row.cells().iterator();
                Iterator<ColumnDefinition> columns = row.columns().iterator();
                
                while (cells.hasNext() && columns.hasNext()) {
                    ColumnDefinition columnDef = columns.next();
                    Cell cell = cells.next();
                    if ("payload_json".equals(columnDef.name.toString())) {
                        producer.send(new ProducerRecord<>(
                                topic, columnDef.type.getString(cell.value())));                        
                        break;
                    }
                }
            }
        }        
    }

    /**
     * 
     * @return
     */
    private Properties getProps() {
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "localhost:9092");
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        return properties;
    }
}