3

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 に慣れていないので、これはばかげた質問かもしれません...

それにもかかわらず、事前にどうもありがとう!

4

2 に答える 2

0

CassandraStorageServiceBeanでどのように配線しているかは明確ではありません。

Spring Integration Cassandra Extension Projectには、メッセージ ハンドラーの実装があります。

spring-cloud-stream-modulesのCassandra Sink はJava 構成でそれを使用するため、例として使用できます。

于 2015-12-19T19:34:22.727 に答える
0

だから私はついにそれを機能させました。私がする必要があったのは

@Component
public final class CassandraStorageServiceImpl implements CassandraStorageService {

    @ServiceActivator(inputChannel="consulAgentSelfFileChannel")
    @Override
    public void store(AgentSelfResult agentSelfResult) {
        //use spring-data-cassandra repository to store
        LOG.info("Received 'AgentSelfResult': {}...");
        LOG.info("Trying to store 'AgentSelfResult' in Cassandra cluster...");
    }
}

CassandraMessageHandler と spring-cloud-streaming は、私のユース ケースではオーバーヘッドが大きすぎるようで、まだよくわかりませんでした...そして、このソリューションを使用して、Spring コンポーネントで何が起こるかを制御し続けます。

于 2015-12-20T13:28:55.180 に答える