You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为JmsTemplate配置HTTP代理以对接Azure Service Bus

该需求完全可以实现。Azure Service Bus 对接 JMS 的底层实现基于 Apache Qpid JMS 客户端,支持通过 AMQP over WebSocket 走 HTTP 隧道传输,只需要在 JMS 连接工厂中配置对应代理参数即可,以下是完整实现示例:

1. 依赖引入

首先确保项目引入 Azure Service Bus JMS 场景启动器,以 Maven 为例:

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>azure-servicebus-jms-spring-boot-starter</artifactId>
    <version>2.15.0</version>
    <!-- 可替换为适配你项目Spring Boot版本的最新稳定版 -->
</dependency>

2. 自定义配置带代理的JmsTemplate

默认自动配置的连接工厂没有代理参数,需要手动覆盖连接工厂配置,注入代理属性:

import org.apache.qpid.jms.JmsConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;
import com.azure.spring.jms.ServiceBusJmsConnectionFactoryFactory;

@Configuration
public class JmsProxyConfig {

    @Value("${spring.jms.servicebus.connection-string}")
    private String serviceBusConnString;
    @Value("${spring.jms.servicebus.topic-name}")
    private String defaultTopic;
    
    // 代理配置
    @Value("${proxy.host}")
    private String proxyHost;
    @Value("${proxy.port}")
    private Integer proxyPort;
    // 代理需要认证则配置以下两个参数,不需要可删除
    @Value("${proxy.username:}")
    private String proxyUsername;
    @Value("${proxy.password:}")
    private String proxyPassword;

    @Bean
    public JmsConnectionFactory jmsConnectionFactory() {
        // 构造基础连接工厂
        ServiceBusJmsConnectionFactoryFactory factoryFactory = new ServiceBusJmsConnectionFactoryFactory(serviceBusConnString);
        JmsConnectionFactory connectionFactory = factoryFactory.createConnectionFactory(JmsConnectionFactory.class);
        
        // 核心配置:开启WebSocket隧道+代理参数
        connectionFactory.setTransportType("websocket");
        connectionFactory.setProxyHost(proxyHost);
        connectionFactory.setProxyPort(proxyPort);
        // 代理需要认证时保留以下逻辑,不需要可删除
        if (!proxyUsername.isBlank()) {
            connectionFactory.setProxyUser(proxyUsername);
            connectionFactory.setProxyPassword(proxyPassword);
        }
        return connectionFactory;
    }

    @Bean
    public JmsTemplate jmsTemplate(JmsConnectionFactory jmsConnectionFactory) {
        JmsTemplate jmsTemplate = new JmsTemplate(jmsConnectionFactory);
        jmsTemplate.setDefaultDestinationName(defaultTopic);
        // 主题模式需开启pubSubDomain
        jmsTemplate.setPubSubDomain(true);
        return jmsTemplate;
    }
}

3. 配置文件示例

application.yml 配置参考:

spring:
  jms:
    servicebus:
      connection-string: "你的Azure Service Bus连接字符串"
      topic-name: "默认发送的目标主题名"
# 代理配置
proxy:
  host: "公司代理主机地址,如192.168.1.10"
  port: 8080 # 代理端口
  # 代理需要认证时加以下配置
  username: "代理认证用户名"
  password: "代理认证密码"

4. 消息发送示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class TopicPublisher {

    @Autowired
    private JmsTemplate jmsTemplate;

    public void sendMessage(String content) {
        // 发送到默认主题
        jmsTemplate.convertAndSend(content);
        // 发送到其他主题用以下写法
        // jmsTemplate.convertAndSend("其他主题名", content);
    }
}

注意事项

  • 必须开启WebSocket传输模式,普通AMQP走TCP协议无法适配HTTP代理,只有AMQP over WebSocket走HTTP隧道才能通过HTTP代理传输
  • 需提前确认公司代理允许访问Azure Service Bus域名的443端口
  • 如果使用非Spring Boot的原生Spring配置,直接构造Qpid JmsConnectionFactory时按上述逻辑设置代理参数即可,逻辑完全一致

内容的提问来源于stack exchange,提问作者lxdr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:09:03