Alex Turok
Alex Turok

Reputation: 586

Callback-driven Spring Cloud Dataflow source application

I want to create a Spring Cloud Dataflow source application based on a lib that connects to a messaging service (IRC, actually) and calls my callback when a message arrives. The only goal of the source app is to create an SCDF message from the received IRC message and send it to the stream.

I have come up with the following solution:

The IrcListener class annotated with @Component does some configuration and starts listening for IRC messages when the start() method is called. When a message is received its onGenericMessage callback simply sends the message to the stream via the injected source property:

@Component
public class IrcListener extends ListenerAdapter {

    @Override
    public void onGenericMessage(GenericMessageEvent event) {
            Message msg = new Message();
            msg.content = event.getMessage();

            source.output().send(MessageBuilder.withPayload(msg).build());
    }

    private Source source;
    private String _name;
    private String _server;
    private List<String> _channels;

    public void start() throws Exception {
            Configuration configuration = new Configuration.Builder()
                            .setName(_name)
                            .addServer(_server)
                            .addAutoJoinChannels(_channels)
                            .addListener(this)
                            .buildConfiguration();

            PircBotX bot = new PircBotX(configuration);
            bot.startBot();
    }

    @Autowired
    public IrcListener(Source source) {
            this.source = source;

            _name = "ircsource";
            _server = "irc.rizon.net";
            _channels = Arrays.asList("#test".split(","));
    }
}

The main class runs Spring Application and calls the aforementioned start() method on the IrcListener component.

@EnableBinding(Source.class)
@SpringBootApplication
public class IrcStreamApplication {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(IrcStreamApplication.class, args);
        context.getBean(IrcListener.class).start();
    }
}

This works ok and the messages are received and published to the stream successfully, but I'd like to know whether this is the right approach to take in the Spring (Cloud Dataflow) universe and or maybe I am missing something important?

Upvotes: 0

Views: 142

Answers (1)

Gary Russell
Gary Russell

Reputation: 174514

It looks ok; but, generally, message-driven sources extend MessageProducerSupport and call sendMessage(Message<?>).

(and override doStart() in this case).

It would give you access to message history tracking and error handling (if the send fails).

Upvotes: 1

Related Questions