【问题标题】:How Can I store a XML object in a global session that can be reached every request?如何将 XML 对象存储在每个请求都可以访问的全局会话中?
【发布时间】:2015-01-23 13:53:30
【问题描述】:

每天晚上,WS 服务器的文件夹中都会出现一个 XML 文档。 我希望 Web 服务每天在某个时间(比如 05:00)读取这个 XML 文件,并将其放入内存中存储的对象中。

我怎样才能做到这一点?我应该使用哪个对象? 我打算使用 JAX-WS。是否也可以使用 JAX-RS?

Tks.

【问题讨论】:

  • 如果您只需要“在内存对象中存储一个 n XML 文件”,您不妨将文件读入字节数组。如果还有更多内容,您应该这样说,例如,Web 服务是单个程序吗?它是否需要 XML 文档中的详细信息?你有它的 XML 模式吗?等等……
  • 它只是存储在内存中,直到下一次读取(更新数据)。我将创建一些测试。 tks

标签: java xml web-services jax-rs jax-ws


【解决方案1】:

您可以将其作为属性存储在应用程序的ServletContext 中。 Web 模块中的任何 JAX-WS 服务或 JAX-RS 资源都可以访问它。另外,如果您的 JAX-WS 服务和 JAX-RS 资源位于同一个模块 (war) 中,它们将共享您放置在那里的对象/文档的相同 instance。

对于 JAX-RS 资源:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.servlet.ServletContext;

@Path("myresource")
public class MyResource {

    @Context ServletContext context;

    @GET
    @Produces("text/plain")
    public String getMyResource() {
        return context.getAttribute("cachedDocument");
    }
}

对于 JAX-WS 服务:

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

@WebService
public class MyService {
@Resource
private WebServiceContext context;

    @WebMethod
    public String getDocument() {
        ServletContext servletContext =
    (ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
        return servletContext.getAttribute("cachedDocument");
    }
}

另请参阅:ServletContextjavadocs。

【讨论】:

  • 感谢您的回答。我想我正在寻找类似stackoverflow.com/questions/11096310/… 的东西,这是一个加载一次并在我的所有 Web 服务线程之间共享的单例对象。关于您的回答,这个上下文是否已经实例化或者我需要手动初始化它?谢了。
  • 上下文由应用服务器(容器)运行时提供给你。走单例路线就是用你自己的解决方案来解决规范作者几年前解决的问题。只是我的两分钱。
猜你喜欢
  • 2014-04-04
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多