我正在开发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的邮件仍然存在于订阅商店中,但这不是正确的解决方案,因为客户可能会在filter
和handle
操作之间取消订阅仍然导致{ {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有什么问题吗?
答案 0 :(得分:1)
我不确定您的NRE
缩写是什么意思,但您可以从NoSuchSubscriptionException
方法中抛出subscriptionsStore.get()
,然后在ExpressionEvaluatingRequestHandlerAdvice
应用中忽略/报告该异常到endpoint.advice()
链中的出站通道适配器。