Spring集成Cassandra持久化工作流

Spring集成Cassandra持久化工作流,cassandra,spring-integration,spring-data-cassandra,Cassandra,Spring Integration,Spring Data Cassandra,我尝试通过Spring集成实现以下工作流: 1) 轮询RESTAPI 2) 将POJO存储在Cassandra集群中 这是我第一次尝试Spring集成,所以我仍然对参考资料中的大量信息感到有些不知所措。经过一些研究,我可以做以下工作 1) 轮询RESTAPI 2) 将映射的POJO JSON结果转换为字符串 3) 将字符串保存到文件中 代码如下: @Configuration public class ConsulIntegrationConfig { @InboundChan

我尝试通过Spring集成实现以下工作流:

  • 1) 轮询RESTAPI
  • 2) 将POJO存储在Cassandra集群中
这是我第一次尝试Spring集成,所以我仍然对参考资料中的大量信息感到有些不知所措。经过一些研究,我可以做以下工作

  • 1) 轮询RESTAPI
  • 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数据Cassandra的Cassandra集群中。为此,我注释掉了配置文件中的文件处理程序,在transformer中返回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的新手,所以这可能是个愚蠢的问题


尽管如此,还是要提前表示感谢

不清楚您在
CassandraStorageService
bean中是如何连接的

具有消息处理程序实现


它与Java配置一起使用,因此您可以将其作为示例。

因此我最终使其工作。我所需要做的就是

@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云流似乎对我的用例来说是一个巨大的开销,我还没有真正理解。。。通过这个解决方案,我可以控制spring组件中发生的事情。

是的,我知道。我想我还不了解大门。另一个想法是将服务连接到变压器,但我觉得这并不干净。这些链接看起来很有希望,我明天再查看。谢谢你。