我有一个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
标题没有改变。
我错过了什么?谢谢
您声明了一个@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名称。