静态地图不保存对象的更改

时间:2018-01-18 16:24:24

标签: java rest web-services dictionary

我一直在尝试从一个宁静的服务调用中更改静态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);
}

1 个答案:

答案 0 :(得分:0)

synchronized并没有真正做任何事情,每个请求都会创建一个新的Class实例,所以它没有帮助。

nffgService应确保同步存在......

如果您展示如何创建nffgService - 它可能会指出问题。