簡體   English   中英

我們如何在 Android 應用程序中創建 Kafka 生產者?

[英]How can we create Kafka producer in Android application?

我是 apache kafka 的新手,我正在嘗試在 android studio 上使用它,以便使用來自一個簡單的 Kafka 消費者和生產者示例的代碼將數據生成到位於我電腦上的服務器

搖籃代碼:

apply plugin: 'com.android.application'

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
    }
    compileSdkVersion 28
    buildToolsVersion "28.0.3"
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 14
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        multiDexEnabled true

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.android.support:multidex:1.0.1'
    implementation 'io.socket:socket.io-client:0.2.1'
    implementation 'org.apache.kafka:kafka-clients:0.10.0.0'
    implementation 'org.apache.kafka:kafka-streams:0.10.0.0'




}

這是我的主要活動:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.net.Uri;
import android.os.Bundle;
import android.os.Looper;
import android.os.StrictMode;
import android.widget.Toast;


import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.LongSerializer;
import org.apache.kafka.common.serialization.StringSerializer;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.WeakHashMap;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName());
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        KafkaProducer<String, String> producer = new KafkaProducer<String, String>(props);
        for (int i = 0; i < 1000; i++) {
            ProducerRecord<String, String> data;
            if (i % 2 == 0) {
                data = new ProducerRecord<String, String>("even", 0, Integer.toString(i), String.format("%d is even", i));
            } else {
                data = new ProducerRecord<String, String>("odd", 0, Integer.toString(i), String.format("%d is odd", i));
            }
            producer.send(data);
            try {
                Thread.sleep(1L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        producer.close();


        }


    }

這是錯誤:

基本上錯誤出現在這些行中:

 java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory;
        at org.apache.kafka.common.utils.AppInfoParser.unregisterAppInfo(AppInfoParser.java:65)
        at org.apache.kafka.clients.producer.KafkaProducer.close(KafkaProducer.java:699)
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:333)
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:188)

它會立即崩潰並且無法識別問題。 我試圖將 multidex 設置為 true 或 false,但出現了相同的錯誤。 我也嘗試使用 maven 依賴項,但錯誤保持不變。

我錯過了什么? 你能幫忙嗎

你不會。 這將是不安全的。 你會向一個網絡服務發送一個請求,它會向 Kafka 發送數據。 其他任何事情都需要您的 Kafka 服務器在應用程序中公開身份驗證信息,然后基本上對任何人開放。

我發現我們無法在 android 中創建 kafka。 最好為 kafka 創建一個暴露 REST 端點的應用程序,稍后可以在 android 應用程序中調用。 您可以使用任何語言或框架創建它,我已經在 Spring Boot 中完成了它並且運行良好。

https://github.com/vpkeerthan/Kafka/tree/master/KafkaRestService

使用為 kafka 服務公開的 RESTful 端點的 Android 應用程序https://github.com/vpkeerthan/Android-Tutorial/tree/master/Kafka-REST-Android

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM