Java中的Spark流单元测试
我正在尝试为我的Spark流媒体工作编写单元测试。我的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 {
MQ
的消息,并将其推送到kafka
主题
我的方法是
- 向MQ发送测试消息
- 在单独的线程中启动流作业。(流媒体作业将推送 致卡夫卡主题的信息“主题1”)
- 卡夫卡消费者继续轮询主题1
- 收到消息后,停止线程并从循环中断
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"));