Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的Spark流单元测试_Java_Multithreading_Unit Testing_Apache Spark_Apache Kafka - Fatal编程技术网

Java中的Spark流单元测试

Java中的Spark流单元测试,java,multithreading,unit-testing,apache-spark,apache-kafka,Java,Multithreading,Unit Testing,Apache Spark,Apache Kafka,我正在尝试为我的Spark流媒体工作编写单元测试。我的spark流媒体作业使用来自MQ的消息,并将其推送到kafka主题 我的方法是 向MQ发送测试消息 在单独的线程中启动流作业。(流媒体作业将推送 致卡夫卡主题的信息“主题1”) 卡夫卡消费者继续轮询主题1 收到消息后,停止线程并从循环中断 下面是我的代码,它不工作。Spark流媒体作业启动正常,但一旦流媒体作业启动,我的while循环停止循环。不确定原因,因为我不熟悉并发主题 public class StreamingJobTest {

我正在尝试为我的Spark流媒体工作编写单元测试。我的spark流媒体作业使用来自
MQ
的消息,并将其推送到
kafka
主题

我的方法是

  • 向MQ发送测试消息
  • 在单独的线程中启动流作业。(流媒体作业将推送 致卡夫卡主题的信息“主题1”)
  • 卡夫卡消费者继续轮询主题1
  • 收到消息后,停止线程并从循环中断
下面是我的代码,它不工作。Spark流媒体作业启动正常,但一旦流媒体作业启动,我的
while
循环停止循环。不确定原因,因为我不熟悉
并发
主题

public class StreamingJobTest {

private static KafkaConsumer<String, String> consumer;

@BeforeClass
public static void setUpClass()  {

    Properties properties = new Properties();

    properties.put("bootstrap.servers", "localhost:9090");
    properties.put("subscribe", "topic1");
    properties.put("startingOffsets", "earliest");
    properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

    consumer = new KafkaConsumer<String, String>(properties);



}


@Test
public void create_test() {
    String[] arguments = new String[]{};
    ConsumerRecords<String, String> records;

    Thread thread = new Thread(() -> StreamingJob.main(arguments));
    thread.start();

     //send a message to MQ.

    MqSender mqSender = new MqSender();
    mqSender.mqPushMsg("TestMsg");

    //keep polling the kafka topic.

    while(true){
        System.out.println("Polling...");
        records = consumer.poll(100);

        if(!records.isEmpty()){

            thread.interrupt();
            break;
        }

    assertNotNull(records);

    }


}
公共类StreamingJobTest{
私人静态卡夫卡消费者;
@课前
公共静态void setUpClass(){
属性=新属性();
properties.put(“bootstrap.servers”,“localhost:9090”);
出售(“认购”、“主题1”);
出售(“开始抵销”、“最早”);
properties.put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
properties.put(“value.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
消费者=新卡夫卡消费者(房产);
}
@试验
公共void创建_测试(){
字符串[]参数=新字符串[]{};
消费者记录;
线程线程=新线程(()->StreamingJob.main(参数));
thread.start();
//向MQ发送消息。
MqSender MqSender=新MqSender();
mqSender.mqPushMsg(“TestMsg”);
//继续轮询卡夫卡主题。
while(true){
System.out.println(“轮询…”);
记录=消费者调查(100);
如果(!records.isEmpty()){
thread.interrupt();
打破
}
assertNotNull(记录);
}
}
}


为什么我的循环在流作业启动后停止工作?据我所知,流媒体将在单独的线程中运行,对吗

我自己明白了。我需要在另一行订阅这个主题。我把它添加到我的属性中。而且groupid在卡夫卡中是强制性的,我错过了。现在对我来说很好。下面是订阅主题的代码

consumer.subscribe(Arrays.asList("topic1"));