[英]Java: Kafka AdminClient not establishing connection (or so it seems)
大家。 这是我在这里的第一篇文章,所以,请原谅我写堆栈溢出问题的技巧。
我在使用org.apache.kafka.clients.admin.AdminClient中的AdminClient时遇到问题。
当前的问题是:我使用SASL SSL初始化到我们的代理服务器(运行kafka 1.0.0)的安全连接。
当我针对具有相同安全设置的同一代理运行使用者时,它工作得很好。 但是,当我执行AdminClient的工作时,它似乎已经起作用了,但是在Wireshark中,我看不到有任何流量从我的计算机传出到代理服务器,并且我试图做的事情在代理端也没有发生。
这是我的代码:
public class AclProvisioner {
//set up variables
private static Properties props = new Properties();
private static ClassLoader classloader = Thread.currentThread().getContextClassLoader();
static String mid = null;
static String topic = null;
public static void main(String... args) {
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "kafkabroker.mydomain.com:9094");
props.put("security.protocol","SASL_SSL");
props.put("ssl.truststore.location", "C:\\Temp\\mydomain.root.jks" );
props.put("ssl.truststore.password","my_truststore_password");
props.put("sasl.mechanism","GSSAPI");
props.put("sasl.kerberos.service.name","kafka_admin_username");
AdminClient adminClient = AdminClient.create(props);
// generate ACLs
AclBinding newTopicReadAcl = new AclBinding( new Resource(ResourceType.TOPIC, "TestTopic"),
new AccessControlEntry("MY_TESTID", "*", AclOperation.READ, AclPermissionType.ALLOW) );
AclBinding newTopicDescribeAcl = new AclBinding( new Resource(ResourceType.TOPIC, "TestTopic"),
new AccessControlEntry("MY_TESTID", "*", AclOperation.DESCRIBE, AclPermissionType.ALLOW) );
AclBinding newGroupReadAcl = new AclBinding( new Resource(ResourceType.GROUP, "TestGroup"),
new AccessControlEntry("MY_TESTID", "*", AclOperation.READ, AclPermissionType.ALLOW) );
Collection<AclBinding> aclList = Arrays.asList(newTopicReadAcl, newTopicDescribeAcl, newGroupReadAcl);
adminClient.createAcls(aclList);
// create topic
int numPartitions = 6;
short replicasFactor = 2;
NewTopic newTopic = new NewTopic("Demo.JavaAdminClientTest", numPartitions, replicasFactor);
Map<String, String> configMap = new HashMap<>();
configMap.put(TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_COMPACT);
configMap.put(TopicConfig.COMPRESSION_TYPE_CONFIG, "gzip");
newTopic.configs(configMap);
List<NewTopic> topics = Arrays.asList(newTopic);
adminClient.createTopics( topics );
}
如果我使用ssh到服务器本身并导出keytab和kinit,则可以使用CLI方法很好地生成ACL。 我还能够使用相同的确切属性来运行使用者(就安全性而言)。
我发现的另一件事是,如果放置的服务器不存在或无法访问,则程序确实失败,并告诉我它无法解析BOOTSTRAP_SERVER_NAME。
如果我尝试创建主题而不是ACL,则会发生相同的确切行为。 再次,这确实可以在CLI中正常工作。
我感谢任何指示!
干杯
所有AdminClient方法都是异步的,并且仅返回Future对象。
因此,如果您不明确地等待期货交易完成,那么您的程序将在AdminClient有时间通过网络发送任何内容之前终止。
您可以在CreateAclsResult
[0]和CreateTopicsResults
[1]上使用all()
或values()
来检索KafkaFuture
[2]对象。 然后对它们使用get()
等待。
[0] http://kafka.apache.org/11/javadoc/org/apache/kafka/clients/admin/CreateAclsResult.html
[1] http://kafka.apache.org/11/javadoc/org/apache/kafka/clients/admin/CreateTopicsResult.html
[2] http://kafka.apache.org/11/javadoc/org/apache/kafka/common/KafkaFuture.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.