【问题标题】:JAX-WS request and response interceptors in same thread as invoke?与调用相同的线程中的 JAX-WS 请求和响应拦截器?
【发布时间】:2012-11-06 14:57:53
【问题描述】:

我想知道通过JAX-WS (CXF/JAXB) 发送的SOAP 请求的拦截器是否保证在调用发生时在同一个线程中运行?

我问的原因是因为我想使用一些请求 ID 参数作为键将原始请求和响应(XML 转储)记录到数据库中。而且我不知道如何将此 ID 传递给拦截器,除了在 JAXB 调用之前将其设置为 ThreadLocal 变量并在拦截器中检索它。是否还有其他我看不到的原因使该策略成为一个坏主意?

【问题讨论】:

  • 你不需要 ThreadLocal,看这个答案stackoverflow.com/a/12690600/116509
  • 你说得对,我可以使用消息交换解决它,谢谢!但是我仍然很好奇是否有某种方法可以可靠且方便地从我执行实际 JAXB 方法调用的代码部分(例如事务 ID)向拦截器发送特定于请求的参数。因为似乎消息交换在拦截器之外不可用。
  • 在这种情况下,线程本地是要走的路。如果您使用 Spring/CDI/其他一些框架,它将提供请求范围的代理(在幕后使用 ThreadLocal)来让您执行此操作。您可能还想查看日志框架中的映射/嵌套诊断上下文。

标签: java multithreading jax-ws cxf


【解决方案1】:

您可以将 ServletContext 注入到您的服务/拦截器类中

   @Context 
   private ServletContext context;   

并从/到上下文获取/设置属性

context.getAttribute  
context.setAttribute  

通过这种方式,您可以在服务/拦截器之间传输对象。
你也可以使用方法

Message#getContextualProperty  
Message#setContextualProperty 

在你的拦截器中设置/从上下文中获取属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多