【发布时间】:2024-01-20 01:38:01
【问题描述】:
我正在开发一个 SoapHandler 实现。基本上我的目标是获取请求和响应有效负载并将它们插入数据库。
虽然我可以获得请求和响应有效负载,但我无法确定我的代码是否在线程安全的情况下工作。换句话说,我不确定响应是否与正确的请求匹配。
public boolean handleMessage(SOAPMessageContext mContext) {
boolean isResponse = (Boolean) mContext
.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!isResponse) {
try {
mContext.put("currentStream", new ByteArrayOutputStream());
mContext.getMessage().writeTo((OutputStream) mContext.get("currentStream"));
} catch (SOAPException | IOException e) {
e.printStackTrace();
}
} else {
try {
mContext.getMessage().writeTo(
(OutputStream) mContext.get("currentStream"));
System.out.println(((OutputStream) mContext.get("currentStream"))
.toString());
((OutputStream) mContext.get("currentStream")).flush();
} catch (SOAPException | IOException e) {
e.printStackTrace();
}
}
return true;
}
我在 JCP 规范中发现了这一点:
9.3.3 处理程序实现注意事项
处理程序实例可以由 JAX-RPC 运行时系统汇集。特定处理程序的所有实例都是 JAX-RPC 运行时系统认为是等效的,并且可以选择任何实例来处理特定的 信息。可以使用不同的处理程序实例来处理 MEP 的每条消息。不同的线程 可以用于处理程序链中的每个处理程序,用于 MEP 中的每个消息或任何组合 二。处理程序不应依赖线程本地状态来共享信息。处理程序应改为使用 消息上下文,见第 9.4 节。
9.4 消息上下文
使用消息上下文调用处理程序,该消息上下文提供访问和修改入站和 出站消息并管理一组属性。 使用不同类型的消息上下文调用不同类型的处理程序。第 9.4.1 和 9.4.2 节 分别描述 MessageContext 和 LogicalMessageContext。此外,JAX-RPC 绑定 12 可以为它们的特定协议绑定定义一个消息上下文子类型,提供对协议的访问 具体功能。第 10.3 节描述了 JAX-RPC SOAP 绑定的消息上下文子类型。
这是否意味着为每个请求创建一个新的 MessageContext 对象(在这种情况下我认为代码将是线程安全的),或者同一个 MessageContext 对象可以用于多个请求(那么我的代码将不是线程安全的)。
任何帮助/替代解决方案将不胜感激。
【问题讨论】:
标签: web-services soap thread-safety jax-ws soaphandler