假设我在grizzles服务器中有一个Jersey服务,并且我希望在服务器和服务实现之间共享数据(例如mydata)。
public class MyServer
{
String mydata="";
public static void main (String [] args)
{
ResourceConfig rc = new ResourceConfig ().packages (MyServer.class.getPackage ().getName ());
HttpServer hs = GrizzlyHttpServerFactory.createHttpServer (URI.create ("http://localhost/myserver"), rc);
for (int i = 0; i < 10; i ++)
{
mydata += "bla";
}
hs.shutdown ();
}
}
@Path ("myservice")
public class MyService
{
@GET
public String getIt()
{
// how to access mydata?
}
}
共享该数据的最佳方法是什么? 我可以想到单例或使mydata静态。但是也许有一种标准方式我在这里看不到?
谢谢!
答案 0 :(得分:1)
仅当mydata
确实是静态的并且不能被多个线程更改时(例如,在服务的mydata
方法中),才可以使getIt()
成为静态或单例实例变量。
这种技术通常适用于通用配置属性。
通常,这是这种情况的标准方法。顺便说一句,您可以将mydata
保留在Server类中不是必需的,但是可以使另一个类将这些公共数据保留在其中(如果有大量的话),但这是选择的问题。
此外,更标准的是不公开实际的mydata
字段,而为其提供getter / setter对。
最后,如果这样的公共/静态值可以被多个线程更改,则需要使其同步,以避免并发修改。
还有更多不同的方法来处理并发并使代码成为线程安全的,但这属于您的实际需求。无论如何,所有这些最终都会实现静态/单同步同步实现。
PS。请注意,如果它是常见的静态数据,则必须在启动服务器之前而不是之后(例如,在示例中)填充它-否则,请求可能会在服务线程准备使用的数据之前发出。