使用Header Enricher / SpEL解析连接ID并在Map中查找

问题描述 投票:0回答:1

我有一个ConcurrentHashMap,它将服务器连接映射到客户端连接:

{localhost:6080:50848:42a5d558-6264-4f2f-83c4-5a9964e1d168=localhost:50847:6060:a7da2280-abe3-4fce-9650-4e8a0ae31891}

我需要使用Header Enricher拦截传入的Message,解析其当前的ip_connectionId头,在我的地图中查找该键,并使用该值更新ip_connectionId

    @Bean
    @Transformer(inputChannel="responseChannel1", outputChannel="responseChannel2")
    public HeaderEnricher responseEnricher() {

        Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<>();

        Expression expression = new SpelExpressionParser().parseExpression("headers['ip_connectionId']");

        try {
            String serverConnectionId = expression.getValue(String.class);
            log.info(serverConnectionId);

            String clientConnectionId = outboundToInboundMap.get(serverConnectionId);
            log.info(clientConnectionId);

            headersToAdd.put("ip_connectionId", new StaticHeaderValueMessageProcessor<>(clientConnectionId));
        } catch (Exception e) {
            e.printStackTrace();
        }

        HeaderEnricher enricher = new HeaderEnricher(headersToAdd);
        enricher.setDefaultOverwrite(true);
        return enricher;
    }

当我运行它时,我没有看到日志语句,我仍然收到此错误:

org.springframework.messaging.MessageHandlingException: Unable to find outbound socket

因为ip_connectionId标题没有改变。

我错过了什么?谢谢

spring-integration
1个回答
0
投票

您声明了一个@Bean,并尝试在bean定义阶段对outboundToInboundMap执行活动的运行时操作。这真的是一个事实,这里的outboundToInboundMap.get()太早了,你还没有在那张地图上有任何东西。

您需要做的是在运行时执行逻辑,当发生对该responseChannel1的发送操作时。为此,你不能使用StaticHeaderValueMessageProcessor。你需要的只是一个ExpressionEvaluatingHeaderValueMessageProcessor

@Bean
@Transformer(inputChannel="responseChannel1", outputChannel="responseChannel2")
public HeaderEnricher responseEnricher() {

    Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<>();

    headersToAdd.put("ip_connectionId", 
       new ExpressionEvaluatingHeaderValueMessageProcessor<>("@outboundToInboundMap[headers['ip_connectionId']]", String .class));

    HeaderEnricher enricher = new HeaderEnricher(headersToAdd);
    enricher.setDefaultOverwrite(true);
    return enricher;
}

这样一个表达式将在运行时针对请求消息进行评估,您需要将该outboundToInboundMap作为具有适当名称的bean。我使用了outboundToInboundMap,但您可以将该bean引用更改为地图的真实bean名称。

© www.soinside.com 2019 - 2024. All rights reserved.