我正在使用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”
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'不存在”。
答案 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_251
,apache-cassandra-3.11.7
,kafka_2.13-2.6.0
和Zookeeper-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;
}
}