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

如何获取并配置JAXM客户端调用异步SOAP API的messaging provider?

我之前也折腾过JAXM的异步SOAP调用,给你梳理下具体的配置步骤和注意点:

用JAXM实现异步SOAP API客户端的核心配置指南

首先得明确:JAXM的异步通信必须依赖消息提供者(messaging provider),这个提供者要么是Java EE容器自带的,要么是独立的JAXM实现库提供的,下面分场景给你讲怎么获取和配置ProviderConnectionFactory:

一、获取ProviderConnectionFactory的两种常见方式

1. Java EE容器托管场景(推荐)

如果你的项目部署在WebLogic、JBoss这类Java EE应用服务器里,容器已经内置了JAXM消息提供者,直接通过JNDI获取实例即可:

Context ctx = new InitialContext();
ProviderConnectionFactory pcf = (ProviderConnectionFactory) ctx.lookup("java:comp/env/jaxm/ProviderConnectionFactory");

不过得先在项目配置里声明资源引用,比如在web.xml中添加:

<resource-ref>
  <description>JAXM Provider Connection Factory</description>
  <res-ref-name>jaxm/ProviderConnectionFactory</res-ref-name>
  <res-type>javax.xml.messaging.ProviderConnectionFactory</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

之后再对应容器的专属配置文件(比如WebLogic的weblogic.xml)里,把这个引用绑定到容器实际的提供者实例上。

2. 独立Java程序场景

如果是脱离Java EE容器的独立程序,你需要先确保引入了JAXM的实现库(比如Oracle JWSDP里的参考实现),然后通过两种方式指定提供者:

  • 方式一:代码里设置系统属性
    System.setProperty("javax.xml.messaging.ProviderConnectionFactory", 
                       "com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnectionFactory");
    ProviderConnectionFactory pcf = ProviderConnectionFactory.newInstance();
    
  • 方式二:类路径下配置jaxm.properties
    在项目类路径下创建jaxm.properties文件,内容如下:
    javax.xml.messaging.ProviderConnectionFactory=com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnectionFactory
    
    之后直接调用ProviderConnectionFactory.newInstance()就能拿到实例。

二、异步调用的完整流程示例

拿到ProviderConnectionFactory后,就可以搭建异步调用的逻辑了:

// 1. 创建提供者连接
ProviderConnection conn = pcf.createConnection();
// 2. 设置异步消息监听器(自定义实现MessageListener接口)
conn.setMessageListener(new AsyncResponseListener());
// 3. 创建SOAP消息工厂
MessageFactory mf = MessageFactory.newInstance();
// 4. 构建要发送的SOAP消息
SOAPMessage msg = mf.createMessage();
// 5. 设置第三方API的目标地址
msg.getMimeHeaders().addHeader("To", "http://third-party-api-url/soap-endpoint");
// 6. 异步发送消息(不会阻塞当前线程)
conn.send(msg);

其中自定义的监听器需要处理返回的响应:

public class AsyncResponseListener implements MessageListener {
    @Override
    public void onMessage(SOAPMessage response) {
        // 在这里处理第三方返回的SOAP响应
        try {
            response.writeTo(System.out);
            // 解析响应内容、业务逻辑处理...
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、额外注意事项

  • JAXM是比较老旧的技术了,现在更推荐用JAX-WS的异步API(比如结合AsyncHandler),如果项目允许,建议考虑迁移到更现代的框架。
  • 不同的消息提供者可能有额外配置项,比如消息存储、回调线程池大小等,需要参考对应实现的文档调整。
  • 异步调用要确保回调线程的资源充足,避免因为回调阻塞影响整体性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:43:27