You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SpringBoot中ActiveMQ/Stomp的MessageTransformer配置失效问题

问题分析:ActiveMQ MessageTransformer未被调用的原因及解决思路

我来帮你拆解下这个问题——你的MessageTransformer始终没被触发,核心原因大概率是配置的位置不对,或者Spring的WebSocket消息链路根本没用到你自定义的ActiveMQConnectionFactory。咱们一步步来理清楚:

1. Spring WebSocket消息Broker没关联你的ConnectionFactory

你继承了AbstractWebSocketMessageBrokerConfigurer,但没有重写configureMessageBroker方法来指定使用你创建的ActiveMQConnectionFactory。默认情况下,Spring会启用内置的SimpleBroker,完全不会用到你配置的ActiveMQ连接工厂,那你给它设置的Transformer自然不会生效。

修正方案:配置StompBrokerRelay并关联ConnectionFactory

重写configureMessageBroker方法,让Spring的Stomp中继使用你的自定义ConnectionFactory:

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    // 启用Stomp Broker中继,连接到你的ActiveMQ
    config.enableStompBrokerRelay("/topic", "/queue")
          .setRelayHost("localhost")
          .setRelayPort(stompPort)
          .setClientLogin("admin") // 根据你的ActiveMQ配置填写用户名
          .setClientPasscode("admin") // 填写对应密码
          .setConnectionFactory(activeMQConnectionFactory()); // 关联你的自定义ConnectionFactory
    
    // 设置应用内消息前缀,对应@MessageMapping注解的路径
    config.setApplicationDestinationPrefixes("/app");
}

2. 混淆了MessageTransformer的作用场景

你给ActiveMQConnectionFactory设置的MessageTransformer,是在该连接工厂创建的客户端连接与Broker交互时生效的。但如果你的需求是让Spring应用收发Stomp消息时做序列化/反序列化,其实更适合用Spring自身的MessageConverter,而不是ActiveMQ原生的Transformer:

如果是Spring应用层面的消息转换

重写configureMessageConverters方法,添加自定义的消息转换器:

@Override
public void configureMessageConverters(List<MessageConverter> converters) {
    converters.add(new YourCustomMessageConverter());
    super.configureMessageConverters(converters);
}

3. BrokerService未关联Transformer(如果是Broker层面的转换需求)

你通过BrokerFactory创建的BrokerService,和你配置的ActiveMQConnectionFactory没有绑定关系。如果你的目标是让ActiveMQ Broker本身处理所有消息的转换,应该直接给BrokerService设置Transformer,而不是给ConnectionFactory:

修正Broker配置

@Bean
public BrokerService brokerService() throws Exception {
    BrokerService brokerService = BrokerFactory.createBroker(String.format(
        "broker:(stomp://localhost:%d)" + "?persistent=false&amp;useJmx=false&amp;useShutdownHook=true",
        stompPort));
    // 直接给Broker设置Transformer
    brokerService.setMessageTransformer(new ClientMessageTransformer());
    return brokerService;
}

最后排查步骤

  1. 先明确你的转换需求:是Spring应用收发消息时转换,还是ActiveMQ Broker处理消息时转换
  2. 检查Spring的WebSocket配置是否真的在使用你自定义的ActiveMQConnectionFactory
  3. 如果是Broker层面的转换,确认BrokerService是否正确设置了Transformer

内容的提问来源于stack exchange,提问作者Ralf B.

火山引擎 最新活动