如何获取并配置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.HttpSOAPConnectionFactoryProviderConnectionFactory.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
相关产品推荐
相关产品推荐

