Используйте Header Enricher / SpEL для анализа идентификатора соединения и поиска на карте. - PullRequest
0 голосов
/ 27 марта 2019

У меня есть ConcurrentHashMap, который отображает соединения сервера с клиентом соединения:

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

Мне нужно использовать заголовок, чтобы перехватить входящее сообщение, разобрать его текущий заголовок 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 не был изменен.

Чего мне не хватает? Спасибо

1 Ответ

0 голосов
/ 27 марта 2019

Вы объявляете @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 как компонент с соответствующим именем.Я использовал outboundToInboundMap, но вы можете изменить эту ссылку на ваше реальное имя для карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...