首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复竞争条件,创建了重复的类错误

如何修复竞争条件,创建了重复的类错误
EN

Stack Overflow用户
提问于 2015-11-10 02:58:31
回答 1查看 175关注 0票数 0

当我启动tomcat服务器时,我收到此错误: 2015 10:25:50 PM org.mongodb.morphia.mapping.MappedClass getOrCreateInstance SEVERE: Race-condition,created duplicate class: class com.calendar.model.watchers.AccountWatcher

据我所知,它来自Morphia,但我不确定为什么会发生这种情况,或者如何修复它。

Morphia中出现错误的代码是这样的:

代码语言:javascript
复制
private Object getOrCreateInstance(Class<?> clazz) {
    if (mapr.instanceCache.containsKey(clazz))
        return mapr.instanceCache.get(clazz);

    Object o = mapr.getOptions().objectFactory.createInstance(clazz);
    Object nullO = mapr.instanceCache.put(clazz, o);
    if (nullO != null)
        if(log.isErrorEnabled())
            log.error("Race-condition, created duplicate class: " + clazz);

    return o;

}

AccountWatcher的代码是:

代码语言:javascript
复制
package com.calendar.model.watchers;

import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;  
import org.mongodb.morphia.annotations.PreLoad;
import org.mongodb.morphia.annotations.PrePersist;
import com.calendar.exception.DataAccessException;
import com.calendar.model.Account;
import com.calendar.model.Partner;
import com.calendar.util.MongoUtils;

public class AccountWatcher {
  final static Logger log = LoggerFactory.getLogger(AccountWatcher.class);

  @PrePersist
  void prePersist(Account account) {
    if (account.getId() == null) {// This is for create
      account.setId(MongoUtils.getGuid());
      account.setDateCreated(new Date());
      Partner owner = account.getOwner();
      if (owner == null || StringUtils.isEmpty(owner.getId())) {
        throw new DataAccessException("Owner :" + owner
            + " doesn't exist for account :" + account);
      }
    } else { // This is for update

    }
    account.setDateModified(new Date());
  }

  @PreLoad
  void preLoad(Account account) {
    if (log.isDebugEnabled()) {
      log.debug("Account watcher @PreLoad executing ...");
    }
  }
}

Account类的代码是:

代码语言:javascript
复制
package com.calendar.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.ToString;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize.Typing;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.EntityListeners;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Indexed;
import org.mongodb.morphia.annotations.Reference;
import com.calendar.model.serializers.PartnerDeSerializer;
import com.calendar.model.serializers.PartnerListSerializer;
import com.calendar.model.serializers.PartnerSerializer;
import com.calendar.model.watchers.AccountWatcher;

@ToString
@EntityListeners(AccountWatcher.class)
@Entity("accounts")
@Data
public class Account {
  @Id
  private String id;
  private String name;
  private String timezone;

  @JsonSerialize(using = PartnerSerializer.class, typing = Typing.STATIC)
  @JsonDeserialize(using = PartnerDeSerializer.class)
  @Reference
  private Partner owner;

  @JsonSerialize(using = PartnerListSerializer.class, typing = Typing.STATIC)
  @Reference
  private List<Partner> associatedPartners;

  @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
  private Date dateCreated;
  @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
  private Date dateModified;
  @Indexed(unique = true, dropDups = true)
  private String externalId;
  private Integer externalVersionNumber;
  private List<EList> elists;

  public Account() {
    associatedPartners = new ArrayList<Partner>();
  }
}

提前感谢您能提供的任何帮助。

EN

回答 1

Stack Overflow用户

发布于 2015-11-12 00:09:00

啊,我明白了。我不确定为什么决定将其记录为错误(相反,为什么该逻辑不同步),但它只是一条日志消息。当然,这不是一个真正的问题,除非您的侦听器是可变的,并且拥有两个实例是一个实际问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33616211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档