如何解决Race-condition,创建重复类错误
当我启动我的tomcat服务器时,出现此错误: 2015 10:25:50 PM org.mongodb.morphia.mapping.MappedClass getOrCreateInstance SEVERE:Race-condition,创建重复的类:class com.calendar.model.watchers.AccountWatcher如何解决Race-condition,创建重复类错误
从我可以告诉它来自Morphia,但我不确定它为什么会发生或如何解决它。
在吗啡的代码时出现的错误是从未来是这样的:
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的代码是:
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 ...");
}
}
}
并为该帐户类的代码是:
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>();
}
}
在此先感谢您提供任何帮助。
啊,我明白了。我不知道为什么做出决定将其记录为错误(并且相反,为什么该逻辑不同步),但它只是一条记录消息。这不是一个真正的问题,除非你的监听器是可变的,并且有两个实例是一个实际问题。
听众是由Morphia预定义的,我没有改变任何东西。从我所能告诉的类本身没有任何改变,所以它似乎并不可变,尽管它为每个实例创建了记录器。看起来奇怪的是,它会很好,但记录错误,除非听众默认是可变的,但它也完全有可能不是实际的问题,而Morphia只是穿过它的T并点了它的I。你的建议是否可以忽略呢?或者需要更多研究/信息? – Ben
因为AccountWatcher是无状态的,所以你可以忽略这个错误。 – evanchooly
好,非常感谢您的帮助! – Ben
实际的堆栈跟踪会有所帮助。 – evanchooly
你可以使用http://vmlens.com。它应该检测所有的数据竞赛。 –
@evanchooly这个错误没有stackrace。该错误来自morphia,它所做的只是记录该错误以及它遇到问题的类。我会更新我的原始问题,以包含来自Morphia的记录错误的代码。谢谢托马斯,我会仔细研究一下。 – Ben