Я хочу создать исходное приложение Spring Cloud Dataflow на основе библиотеки lib, которая подключается к службе обмена сообщениями (на самом деле IRC) и вызывает мой обратный вызов при получении сообщения. Единственная цель исходного приложения - создать сообщение SCDF из полученного сообщения IRC и отправить его в поток.
Я предложил следующее решение:
Класс IrcListener
, помеченный @Component
, выполняет некоторую настройку и начинает прослушивать сообщения IRC при вызове метода start()
. Когда сообщение получено, его обратный вызов onGenericMessage
просто отправляет сообщение потоку через внедренное свойство source
:
@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(","));
}
}
Основной класс запускает приложение Spring и вызывает вышеупомянутый метод start()
для компонента IrcListener
.
@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();
}
}
Это работает нормально, и сообщения принимаются и публикуются в потоке успешно, но я хотел бы знать, является ли этот подход правильным для вселенной Spring (Cloud Dataflow) и, возможно, я упускаю что-то важное?