Spring Integration を使用して、次のワークフローを実現しようとしています。
- 1) ポーリング REST API
- 2) POJO を Cassandra クラスターに保存する
Spring Integration を試すのは初めてなので、参照からの情報の量にまだ少し圧倒されています。いくつかの調査の後、次の作業を行うことができました。
- 1) ポーリング REST API
- 2) マッピングされた POJO JSON の結果を文字列に変換する
- 3) 文字列をファイルに保存
コードは次のとおりです。
@Configuration
public class ConsulIntegrationConfig {
@InboundChannelAdapter(value = "consulHttp", poller = @Poller(maxMessagesPerPoll = "1", fixedDelay = "1000"))
public String consulAgentPoller() {
return "";
}
@Bean
public MessageChannel consulHttp() {
return MessageChannels.direct("consulHttp").get();
}
@Bean
@ServiceActivator(inputChannel = "consulHttp")
MessageHandler consulAgentHandler() {
final HttpRequestExecutingMessageHandler handler =
new HttpRequestExecutingMessageHandler("http://localhost:8500/v1/agent/self");
handler.setExpectedResponseType(AgentSelfResult.class);
handler.setOutputChannelName("consulAgentSelfChannel");
LOG.info("Created bean'consulAgentHandler'");
return handler;
}
@Bean
public MessageChannel consulAgentSelfChannel() {
return MessageChannels.direct("consulAgentSelfChannel").get();
}
@Bean
public MessageChannel consulAgentSelfFileChannel() {
return MessageChannels.direct("consulAgentSelfFileChannel").get();
}
@Bean
@ServiceActivator(inputChannel = "consulAgentSelfFileChannel")
MessageHandler consulAgentFileHandler() {
final Expression directoryExpression = new SpelExpressionParser().parseExpression("'./'");
final FileWritingMessageHandler handler = new FileWritingMessageHandler(directoryExpression);
handler.setFileNameGenerator(message -> "../../agent_self.txt");
handler.setFileExistsMode(FileExistsMode.APPEND);
handler.setCharset("UTF-8");
handler.setExpectReply(false);
return handler;
}
}
@Component
public final class ConsulAgentTransformer {
@Transformer(inputChannel = "consulAgentSelfChannel", outputChannel = "consulAgentSelfFileChannel")
public String transform(final AgentSelfResult json) throws IOException {
final String result = new StringBuilder(json.toString()).append("\n").toString();
return result;
}
これはうまくいきます!
しかし今、オブジェクトをファイルに書き込む代わりに、spring-data-cassandra を使用して Cassandra クラスターに格納したいと考えています。そのために、構成ファイルのファイル ハンドラーをコメント アウトし、トランスフォーマーで POJO を返し、次を作成しました。
@MessagingGateway(name = "consulCassandraGateway", defaultRequestChannel = "consulAgentSelfFileChannel")
public interface CassandraStorageService {
@Gateway(requestChannel="consulAgentSelfFileChannel")
void store(AgentSelfResult agentSelfResult);
}
@Component
public final class CassandraStorageServiceImpl implements CassandraStorageService {
@Override
public void store(AgentSelfResult agentSelfResult) {
//use spring-data-cassandra repository to store
LOG.info("Received 'AgentSelfResult': {} in Cassandra cluster...");
LOG.info("Trying to store 'AgentSelfResult' in Cassandra cluster...");
}
}
しかし、これは間違ったアプローチのようです。サービス メソッドは決してトリガーされません。
私の質問は、私のユースケースの正しいアプローチは何でしょうか? サービス コンポーネントに MessageHandler インターフェイスを実装し、設定で @ServiceActivator を使用する必要がありますか。または、現在の「ゲートウェイアプローチ」に何か欠けているものがありますか?? または、私が見ることができない別の解決策があるかもしれません..
前に述べたように、私は SI に慣れていないので、これはばかげた質問かもしれません...
それにもかかわらず、事前にどうもありがとう!