使用Spring Integration Java DSL与Rabbit MQ集成

我最近参加了在拉斯维加斯举行的2016年Spring会议 ,很幸运地看到了我在软件世界中长期敬佩的一些人。 我亲自遇到了其中的两个人,他们实际上合并了几年前我与Spring Integration相关的一些小贡献– Gary RusselArtem Bilan ,他们启发了我重新审视我已经有一段时间没有使用过的Spring Integration

我再一次想起了Spring Integration如何使任何复杂的Enterprise集成方案看起来都很简单。 我很高兴看到基于Spring Integration Java的DSL现在已完全集成到Spring Integration伞和诸如Spring Cloud Stream之类的更高层次的抽象中(感谢我的好朋友和对该项目的贡献者进行了介绍)
Soby Chacko ),这使得某些消息驱动的场景更加容易。

在本文中,我只是在回顾与RabbitMQ的一个非常简单的集成方案,在以后的文章中,将使用Spring Cloud Stream重新实现它。

考虑一个场景,其中两个服务通过它们之间的RabbitMQ代理彼此通信,其中一个生成某种工作,另一个处理该工作。

工作单位流

制片人

可以使用Spring Integration Java DSL以以下方式在代码中表示工作单元产生/分发部分:

@Configuration
public class WorksOutbound {

    @Autowired
    private RabbitConfig rabbitConfig;

    @Bean
    public IntegrationFlow toOutboundQueueFlow() {
        return IntegrationFlows.from("worksChannel")
                .transform(Transformers.toJson())
                .handle(Amqp.outboundAdapter(rabbitConfig.worksRabbitTemplate()))
                .get();
    }
}

这是非常容易理解的-流程首先从名为“ worksChannel”的通道读取消息,将消息转换为json,然后使用出站通道适配器将其分派到RabbitMQ交换。 现在,消息如何到达名为“ worksChannel”的通道-我已经通过Messaging网关(Spring集成世界的入口)配置了消息-

@MessagingGateway
public interface WorkUnitGateway {
 @Gateway(requestChannel = "worksChannel")
 void generate(WorkUnit workUnit);

}

因此,现在,如果Java客户端想要向Rabbitmq派遣“工作单元”,则调用将如下所示:

WorkUnit sampleWorkUnit = new WorkUnit(UUID.randomUUID().toString(), definition);
workUnitGateway.generate(sampleWorkUnit);

我在这里刷了几件事-特别是Rabbit Mill配置,它是在磨房中运行的,可在此处获得

消费者

沿着生产者的思路,消费者流程将从接收来自RabbitMQ队列的消息开始,将其转换为域模型,然后处理该消息,使用Spring Integration Java DSL通过以下方式表示:

@Configuration
public class WorkInbound {

    @Autowired
    private RabbitConfig rabbitConfig;

    @Autowired
    private ConnectionFactory connectionFactory;

    @Bean
    public IntegrationFlow inboundFlow() {
        return IntegrationFlows.from(
                Amqp.inboundAdapter(connectionFactory, rabbitConfig.worksQueue()).concurrentConsumers(3))
                .transform(Transformers.fromJson(WorkUnit.class))
                .handle("workHandler", "process")
                .get();
    }
}

代码应该很直观,上面的workHandler是一个简单的Java pojo,看起来像这样,完成了仅记录有效负载的非常重要的工作:

@Service
public class WorkHandler {
    private static final Logger LOGGER = LoggerFactory.getLogger(WorkHandler.class);

    public void process(WorkUnit workUnit) {
        LOGGER.info("Handling work unit - id: {}, definition: {}", workUnit.getId(), workUnit.getDefinition());
    }
}

本质上就是这样,如果使用直接Java和原始RabbitMQ库尝试使用Spring Integration,它将提供相当出色的代码外观。
Spring Cloud Stream使整个设置变得更加简单,将成为未来帖子的主题。

如果您有兴趣尝试一下,我已将整个代码发布在我的github仓库中

翻译自: https://www.javacodegeeks.com/2016/08/integrating-rabbit-mq-using-spring-integration-java-dsl.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值