如何为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
相关产品推荐
相关产品推荐

