0

I'm trying to make Sink for Flink to be able to send messages from Flink to RabbitMQ. When I create Sink in main, everything works fine - I receive a message on the special queue on RabbitMQ. Unfortunately, when I try to create Sink outside the main method - it ends with NPEx (Flink shows, that StreamExecutionEnvironment is null).

Code which works have one disadvantage - it can send a message only once when starting .jar on Flink. I want to have a function which will allow me to send a message to RabbitMQ when calling this function.

Here is code which works:

public static void main(String[] args) throws Exception{

RMQConnectionConfig connectionConfig = new RMQConnectionConfig.Builder()
        .setHost(RABBITMQ_HOST_NAME)
        .setPort(RABBITMQ_PORT_NUMBER)
        .setUserName(RABBITMQ_USERNAME)
        .setPassword(RABBITMQ_PASSWORD)
        .setVirtualHost(RABBITMQ_VIRTUAL_HOST)
        .setConnectionTimeout(5000)
        .build();

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

SimpleStringSchema simpleStringSchema = new SimpleStringSchema();

DataStream<String> dataStreamSource = env.addSource(new RMQSource<String>(
        connectionConfig,
        KURA_QUEUE_NAME,
        simpleStringSchema));

        env.fromElements("ALERT")
        .addSink(new IotRMQSink(connectionConfig,
                ANDROID_QUEUE_NAME,
                simpleStringSchema));

dataStreamSource.filter(new TemperatureFluctuationDetector());

env.execute();
}

And here is code which I want to look like (but throws NPEx):

public static RMQConnectionConfig connectionConfig;
public static StreamExecutionEnvironment env;
public static SimpleStringSchema simpleStringSchema;

public static void main(String[] args) throws Exception{

connectionConfig = new RMQConnectionConfig.Builder()
        .setHost(RABBITMQ_HOST_NAME)
        .setPort(RABBITMQ_PORT_NUMBER)
        .setUserName(RABBITMQ_USERNAME)
        .setPassword(RABBITMQ_PASSWORD)
        .setVirtualHost(RABBITMQ_VIRTUAL_HOST)
        .setConnectionTimeout(5000)
        .build();

env = StreamExecutionEnvironment.getExecutionEnvironment();

simpleStringSchema = new SimpleStringSchema();

DataStream<String> dataStreamSource = env.addSource(new RMQSource<String>(
        connectionConfig,
        KURA_QUEUE_NAME,
        simpleStringSchema));

publish();

dataStreamSource.filter(new TemperatureFluctuationDetector());

env.execute();
}

public static void publish(){
    env.fromElements("ALERT")
        .addSink(new IotRMQSink(connectionConfig,
                ANDROID_QUEUE_NAME,
                simpleStringSchema));
}

It looks like StreamExecutionEnvironment is null, but I set it in the main function. Does anyone have an idea how can I avoid this NullPointerException?

Aurasphere
  • 3,490
  • 12
  • 37
  • 63
pitagoras3
  • 435
  • 4
  • 10

0 Answers0