Spring integration 如何将AWS SQS入站适配器连接到支持AMQP的消息通道?

Spring integration 如何将AWS SQS入站适配器连接到支持AMQP的消息通道?,spring-integration,spring-integration-aws,spring-integration-amqp,Spring Integration,Spring Integration Aws,Spring Integration Amqp,我已经成功地通过Java为AWS SQS配置了一个使用直接通道的入站通道适配器。该项目使用JDBC和RabbitMQ与SQS的组合作为3个单独队列的入站流。我需要持久的消息,所以我正试图找出如何利用RabbitMQ。我不知道如何引用AMQP频道。如何从setOutPutChannel引用AMQP消息通道?我的目标是,仅当消息成功发布到RabbitMQ持久队列时,才从SQS中删除消息 @Bean public MessageProducer getSQSChannel() { SqsMes

我已经成功地通过Java为AWS SQS配置了一个使用直接通道的入站通道适配器。该项目使用JDBC和RabbitMQ与SQS的组合作为3个单独队列的入站流。我需要持久的消息,所以我正试图找出如何利用RabbitMQ。我不知道如何引用AMQP频道。如何从setOutPutChannel引用AMQP消息通道?我的目标是,仅当消息成功发布到RabbitMQ持久队列时,才从SQS中删除消息

@Bean
public MessageProducer getSQSChannel() {
    SqsMessageDrivenChannelAdapter adapter = new SqsMessageDrivenChannelAdapter(this.amazonSqs, MY_SQS_QUEUE);
    adapter.setOutputChannel(????);  
    return adapter;
}

@Bean
public AmqpChannelFactoryBean messageDriven(ConnectionFactory connectionFactory) {
    AmqpChannelFactoryBean factoryBean = new AmqpChannelFactoryBean(true);
    factoryBean.setConnectionFactory(connectionFactory);
    factoryBean.setQueueName("bar");
    factoryBean.setPubSub(false);
    return factoryBean;
}
使用

工厂bean创建的通道将在运行时从其名称解析

编辑

或者,正如阿泰姆所说

MessageProducer getSQSChannel(MessageChannel messageDriven) { 
    ... 
}

您还可以执行方法参数注入
MessageProducer getSQSChannel(MessageChannel messageDriven){…}
谢谢!确认我的理解。如果我有一个集成流,例如轮询SQS消息,然后使用DirectChannel作为传入通道将转换发送到RabbitMQ,那么会有消息丢失的情况吗?SQS>>>InboundChannelAdapter>>>DirectChannel>>OBJTTransformer>>PayloadEnricher>>RabbitOutboundAdapter在我的测试中,比如杀死兔子,将SQS adapters删除策略设置为onSuccess,消息似乎没有被正确删除(但增加了读取计数)。那么在这种情况下使用直接渠道安全吗?你不应该在对现有答案的评论中提出无关的问题;它不能帮助社区找到问题/答案。
DirectChannel
是“安全的”,因为发布将发生在调用线程上。我不熟悉SQS扩展,因此无法评论何时应用
onSuccess
策略,以及它在这种情况下是否会工作(我猜可能可以,因为它是一个消息驱动的适配器,所以流在适配器线程上运行)。也就是说,RabbitMQ发布是异步的,因此,您需要使用RabbitMQ事务来确保代理接受消息;事务是RabbitMQ发布的重要开销;特别是当只发布一条消息时。谢谢Gary。我会记住的。公平地说,我在我的问题目标中陈述了不想泄露信息的愿望,因此我认为这与问题有关。但我认识到,在这个特定的主题上可能会有一个单独的问题主题行,所以我会记住这一点。再次感谢!
MessageProducer getSQSChannel(MessageChannel messageDriven) { 
    ... 
}