【发布时间】:2019-05-16 13:38:16
【问题描述】:
我有一个问题,在我能找到的任何示例中似乎都没有解决。
我的应用程序读取 JSON 消息的 ActiveMQ 主题。它将基于此数据构建一个全新的出站 REST 调用。请注意,这不是“转换”。它被赋予“X”产生“Y”即ServiceActivator。
到目前为止我的流量是
public IntegrationFlow splitInputFlow() {
return IntegrationFlows.from("inboundJmsChannel")
.split()
.log(LoggingHandler.Level.DEBUG)
.route(Message.class, m -> m.getHeaders().get("x-bn-class").equals("Healthcheck.class") ? "healthcheckChannel" : "metricChannel")
.get();
}
public IntegrationFlow healthcheckFlow() {
return IntegrationFlows.from("healthcheckChannel")
.log(LoggingHandler.Level.DEBUG)
.transform(Transformers.fromJson(Healthcheck.class))
.handle("healthcheckActivator", "process")
.get();
}
有很多关于如何使用弹簧变压器的例子。我什至考虑过尝试使用 MessageConverter。但我不明白为什么它会有所帮助,而且这似乎不是正常的方法。
这里的主要问题是集成调用 healthcheckActivator.process(String payload)。有效负载本身是预期的有效 JSON 字符串。
我有点惊讶它没有调用 healthcheckActivator.process(Message payload) 但这无济于事,所以没关系。
真正的问题是它为什么不调用 healthcheckActivator.process(Healthcheck healthcheck)?
其实我明白“为什么”。这是因为 DSL 生成了一个内部通道来将这些步骤联系在一起,据我所知,通道上的任何内容都是 spring.messaging.Message。
进入 SA 后,我可以轻松地实例化我的 Healthcheck 对象。但这留下了一个棘手的问题:整个转换步骤有什么好处?如果它总是将对象“序列化”回 Message ——那有什么意义呢。
就像我说的,我认为我在这里遗漏了一些基本的东西。
编辑 我的新想法(也可能是最后一个想法)可能是我发布错了。
要发布它,我正在使用
jmsTemplate.convertAndSend(topicName, healthcheck, messagePostProcessor -> {
messagePostProcessor.setJMSType("TextMessage");
messagePostProcessor.setStringProperty("x-bn-class", "Healthcheck.class");
messagePostProcessor.setStringProperty("x-bn-service-name", restEndpoint.getServiceName());
messagePostProcessor.setStringProperty("x-bn-service-endpoint-name", restEndpoint.getEndpointName());
messagePostProcessor.setLongProperty("x-bn-heathcheck-timestamp", queryDate);
messagePostProcessor.setStringProperty("x-bn-healthcheck-status", subsystemStatus.getStatus(subsystemStatus));
messagePostProcessor.setIntProperty("httpStatus", httpStatus.value());
return messagePostProcessor;
});
SI process(String payload)方法中到达的是:
LoggingHandler - GenericMessage [payload={"healthcheckType":"LOCAL","outcome":"PASS","dependencyType":"DB","endpoint":"NODE TABLE","description":"Read from DB","durationSecs":0.025}, headers={x-bn-service-name=TG10-CS2, x-bn-service-endpoint-name=TG Q10-CS2 Ready Check, jms_destination=topic://HEALTH_MONITOR, _type=com.healthcheck.response.Healthcheck, x-bn-heathcheck-timestamp=1558356538000, priority=4, jms_timestamp=1558356544244, x-bn-healthcheck-status=SEV0, jms_redelivered=false, x-bn-class=Healthcheck.class, httpStatus=200, jms_type=TextMessage, id=b29ffea7-7128-c543-9a14-8bab450f0ac6, jms_messageId=ID:39479-1558356520091-1:2:1:1:1, timestamp=1558356544409}]
我之前没有注意到 jms_destination 标头中的 _type 参数。但在我开始搞砸之前(因为它不起作用),这是其他团队提供的正确类名。
我还没有实现 JMS 消息转换器。但是提供的 SimpleMessageConverter 似乎应该完全符合我的要求。
【问题讨论】: