我正在研究 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 对象可以用于多个请求(那么我的代码将不是线程安全的)。
任何帮助/替代解决方案将不胜感激。