集成流程中的条件处理程序

时间:2017-11-05 16:20:28

标签: java spring spring-integration spring-integration-dsl

我正在开发Web钩子通知服务,允许客户端订阅/取消订阅流经中间件的消息,并通过将消息有效负载发布到提供的回调URL来获得有关消息的通知(根据提供的标准)。 消息传递如下所示:

flowBuilder
    .enrichHeaders(e->e.header(MessageHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE,true))
    .handle(Http.outboundChannelAdapter(message-> {
              String subscriptionId = message.getHeaders().get(SUBSCRIPTION_ID_HEADER_NAME, String.class);
                return subscriptionsStore.get(UUID.fromString(subscriptionId)).getCallbackUrl(); //potential NPE if subscription was removed 

            },restTemplateBuilder.build())

.get()

如您所见, uriFunction 的实现通过订阅ID(消息头的一部分)从subscriptionsStore获取回调URL。

我的问题是客户已经取消订阅了他的订阅ID并且我在条件处理程序之后的情况。

我知道我可以过滤订阅ID的邮件仍然存在于订阅商店中,但这不是正确的解决方案,因为客户可能会在filterhandle操作之间取消订阅仍然导致{ {1}}。

另一种解决方案是使用回调URL扩展标头,然后通过具有非空值的标头进行过滤,但我不想同时妥协原始消息的标头和有效负载。

我可以考虑另一种方法:将不存在的订阅的URI计算为某个静态值,并将拦截器添加到uriFunction以模拟此特定URI值的HTTP OK重放...

所以我的问题是通过使用标准的EIP或我不了解的另一个Spring集成功能来处理这种情况的正确方法......

由于

更新

我添加了保存上下文的RestTempalte类:

DedicatedMessage

并将流程更改为:

public static class DedicatedMessage  extends GenericMessage<Object> implements MessageDecorator{
        @Getter
        @Transient
        private Subscription subscription;


        public DedicatedMessage(Subscription subscription,Object payload,Map<String,Object> headers) {
            super(payload,headers);
            this.subscription = subscription;
        }

        @Override
        public Message<?> decorateMessage(Message<?> message) {
            return new DedicatedMessage (subscription,message.getPayload(),message.getHeaders());
        }
    }

这个apporach有什么问题吗?

1 个答案:

答案 0 :(得分:1)

我不确定您的NRE缩写是什么意思,但您可以从NoSuchSubscriptionException方法中抛出subscriptionsStore.get(),然后在ExpressionEvaluatingRequestHandlerAdvice应用中忽略/报告该异常到endpoint.advice()链中的出站通道适配器。