繁体   English   中英

Java:Kafka AdminClient未建立连接(或似乎建立连接)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM