Kafka在Unity3D中集成时出现Win32Exception错误

3

我正在尝试在Unity环境中运行一个Kafka代码示例,为此我创建了一个消费者客户端(以下是代码)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Confluent.Kafka;
using Confluent.Kafka.Serialization;
using System.Text;

public class KafkaConsumer : MonoBehaviour 
{
    // Use this for initialization
    void Start () 
    {
        /*
         * The consumer application will then pick the messages from the same topic and write them to console output. 
         * The process to create the consumer application is also very simple.
         */
        var config = new Dictionary<string, object>
        {
            { "group.id","JavaInUseGroup" },
            { "bootstrap.servers", "localhost:9092" },
            { "enable.auto.commit", "false" }
        };

        using (var consumer = new Consumer<Null, string>(config, null, new StringDeserializer(Encoding.UTF8)))
        {
            consumer.Subscribe(new string[] { "javainuse-topic" });

            consumer.OnMessage += (_, msg) =>
            {
                //Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset :{msg.Offset} {msg.Value}");
                Debug.Log($"Topic: {msg.Topic} Partition: {msg.Partition} Offset :{msg.Offset} {msg.Value}");

                consumer.CommitAsync(msg);
            };

            while (true)
            {
                consumer.Poll(100);
            }
        }
    }
}

为了执行上面的代码示例,我还将confluent.Kafka dll添加到我的项目资产文件夹中。但是每当我运行我的Unity游戏时,它都会抛出一个错误:Win32Exception:找不到指定的模块。

重新抛出InvalidOperationException:从Assets / librdkafka.dll加载librdkafka.dll或其依赖项时出错。检查目录是否存在,如果不存在,请检查您的部署过程。在调用Confluent.Kafka Confluent.Kafka之前,您还可以自己加载库及其依赖项。Impl.LibRdKafka.Initialize(System.String userSpecifiedPath)(位于<700d5bbe3b974ce5aed001c82b789f6a>:0)Confluent.Kafka.Consumer..ctor(System.Collections.Generic.IEnumerable<code>1[T] config)(位于<700d5bbe3b974ce5aed001c82b789f6a>:0)Confluent.Kafka.Consumer 2 [TKey,TValue]..ctor(System.Collections.Generic.IEnumerable<code>1[T] config,Confluent.Kafka.Serialization.IDeserializer 1 [T] keyDeserializer,Confluent.Kafka.Serialization.IDeserializer`1 [T] valueDeserializer)(位于<700d5bbe3b974ce5aed001c82b789f6a>:0)KafkaConsumer.Start()(位于Assets / KafkaConsumer.cs:26)

正如错误所述,存在依赖关系问题,因此我还将这些dll复制到assets / librdkafka / x64文件夹中。
  1. librdkafka
  2. librdkafkacpp

  3. msvcr120

  4. zlib
现在的问题是,每当我尝试播放它时,我的项目都会卡住。
记住:我通过nuget在vs 2017中下载了所有这些dll。然后我将这些dll带到了Unity中。

实际上,我无法想象Unity3d应用程序需要Kafka客户端的情况。你是在尝试创建一个移动(PC、Xbox或其他)客户端,直接将一些数据发送到Kafka代理吗? - Victor Perov
2个回答

2
对于未来的用户,这是在Unity3d项目中添加Kafka的过程: 实际上,有一个特定的顺序或文件夹层次结构来添加dll到您的项目中。(如果有人找到了任何权威参考,请分享)
  1. 首先将Confluen.Kafka dll粘贴到任何文件夹中

enter image description here

  1. 创建librdkafka文件夹(确保它在confluent.kafka dll旁边),并将与您的平台相关的dll文件粘贴到x64或x86文件夹中。 enter image description here

现在,您可以运行我在问题中提到的代码示例。

重要提示:构建播放器后,您必须手动复制dll文件到Player/Managed/librdkafka文件夹中。您必须在managed文件夹中创建librdkafka文件夹,然后粘贴您的dll文件。(再次强调,我不知道为什么需要这样做,如果有人找到权威参考,请分享。)


1
如果您查看源代码:https://github.com/confluentinc/confluent-kafka-dotnet/blob/master/src/Confluent.Kafka/Impl/LibRdKafka.cs#L323-L374,confluent.kafka会动态加载librdkafka,并且这些dll文件如下:
  1. libeay32.dll
  2. librdkafka.dll
  3. librdkafkacpp.dll
  4. libzstd.dll
  5. msvcp120.dll
  6. msvcr120.dll
  7. ssleay32.dll
  8. zlib.dll

需要将其复制到与Confluent.Kafka.dll相同的文件夹中,或者在相同的文件夹中创建一个类似于此的librdkafka文件夹:

\---librdkafka
    +---x64
    |       libeay32.dll
    |       librdkafka.dll
    |       librdkafkacpp.dll
    |       libzstd.dll
    |       msvcp120.dll
    |       msvcr120.dll
    |       ssleay32.dll
    |       zlib.dll
    |
    \---x86
            libeay32.dll
            librdkafka.dll
            librdkafkacpp.dll
            libzstd.dll
            msvcp120.dll
            msvcr120.dll
            ssleay32.dll
            zlib.dll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接