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
?