我一直在尝试从一个宁静的服务调用中更改静态ConcurrentMap中的对象,并从另一个访问更改的对象,但到目前为止还没有成功。详细信息将遵循代码。
休息服务
view
Map本身只被初始化一次,服务Constructor和addNode工作得非常好,它会改变DeployedNffgImpl对象,并且在方法更改中是可见的。但是当我尝试从addLink访问相同的地图时,更改是不可见的,就好像对象根本没有改变一样。是否有一些我错过的逻辑错误,或者是其他什么? 如果我错过提及的话,请问。
MainService 的构造函数,它包含上述addNode和addLink
superview
NfvDeployerApp
@POST
@Path("/nffgs/{nffg_id}/nodes")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public synchronized String addNode(@PathParam("nffg_id") String nffg_id, NodeType node, @Context UriInfo uriInfo) {
DeployedNffgImpl changedNffg = NfvDeployerDB.getDeployedNffgSet().get(nffg_id);
System.out.println("Size before: " + changedNffg.getResponsibleReader().getNodes().size());
NodeReader retNode = nffgService.addNode(node);
changedNffg =NfvDeployerDB.getDeployedNffgSet().get(nffg_id);
System.out.println("Size after: " + changedNffg.getResponsibleReader().getNodes().size());
NfvDeployerDB.getDeployedNffgSet().replace(nffg_id, changedNffg);
return retNode.getName();
}
@POST
@Path("/nffgs/{nffg_id}/nodes/{node_id}/links")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public synchronized String addLink(@PathParam("nffg_id") String nffg_id, Link link, @Context UriInfo uriInfo) {
LinkReader retLink = null;
System.out.println("Size after: " + NfvDeployerDB.getDeployedNffgSet().get(nffg_id).getResponsibleReader().getNodes().size());
try {
retLink = nffgService.addLink(link, true);
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return retLink.getName();
}
NfvDeployerDB init
public ServiceMain() {
super();
if(!NfvDeployerDB.getInitialBoot()) {
NfvDeployerDB.initDB();
NfvDeployerDB.setInitialBoot(true);
}
this.nffgService = new NffgServices(System.getProperty("it.polito.dp2.NFV.lab3.Neo4JSimpleXMLURL"));
NffgReader nffg0 = NfvDeployerDB.getMonitor().getNffg("Nffg0");
this.nffgService.deployNffg(nffg0);
}
答案 0 :(得分:0)
synchronized并没有真正做任何事情,每个请求都会创建一个新的Class实例,所以它没有帮助。
nffgService应确保同步存在......
如果您展示如何创建nffgService - 它可能会指出问题。