事件中心使用者是否也可以在同一中心上生成事件?

Is it possible for an Event Hub Consumer to also produce events on the same Hub?

在某些情况下,EH 消费者是否也可以使用相同的 EH 生成消息?

我正在 Java 中尝试以下代码。两个相同的消费者同时 运行。他们可以很好地接收消息,但如果他们尝试在特定条件下发送消息,则任何人都不会收到该特定消息。

    EventHubConsumerAsyncClient consumer = new EventHubClientBuilder()
            .connectionString(CONNECTION_STRING, EH_NAME)
            .consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME)
            .buildAsyncConsumerClient();

    EventHubProducerClient producer = new EventHubClientBuilder()
            .connectionString(CONNECTION_STRING, EH_NAME)
            .consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME)
            .buildProducerClient();

    consumer.receiveFromPartition("0", EventPosition.latest()).subscribe(event -> 
    {
        String ev = event.getData().getBodyAsString();
        System.out.println("Event arrived: " + ev);

        if (ev.compareTo("TARGET") == 0)
        {
            System.out.println("\tCreating echo for TARGET");
            EventDataBatch batch = producer.createBatch();
            batch.tryAdd(new EventData("TARGET -- response"));
            producer.send(batch);
        }
    });

是的,可以在同一个主机应用程序中发布和使用。在您的代码片段中,您试图将事件添加到 EventDataBatch 但未验证 tryAdd 的 return - 如果您的事件太大,您将不知道它是' 接受到批处理中,您的 send 调用为空。您代码段中的事件主体足够小,这不是问题,但我建议检查 tryAdd return 并对实际应用程序数据采取适当的措施。

您可能想要检查的一件事是您的事件中心有多少个分区以及您正在积极阅读哪些分区,因为您的应用程序可能没有从您发布事件的分区中读取数据.

在您的代码段中,消费者仅从分区“0”读取数据;它不会看到来自其他分区的事件。当您的生产者发布事件时,它不会请求任何特定分区,这会向事件中心服务表明它应该分配分区。事件中心服务将使用循环方法将事件平均分配到分区。

您可能需要考虑 publishing events to a specific partition to ensure that your consumers can read them, or using the EventProcessorClient to read from all partitions

我要注意的另一件事是,对单个事件使用 EventDataBatch 没有什么价值;您需要支付测量事件大小的费用,如果事件太大,这可以帮助您避免异常,但如果您确信您的典型事件大小不会有过大的风险,您将获得通过使用 send overload that accepts an iterable.

可以提高一些效率