2015-11-09 35 views
0

当我启动我的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>(); 
    } 
} 

在此先感谢您提供任何帮助。

+0

实际的堆栈跟踪会有所帮助。 – evanchooly

+0

你可以使用http://vmlens.com。它应该检测所有的数据竞赛。 –

+0

@evanchooly这个错误没有stackrace。该错误来自morphia,它所做的只是记录该错误以及它遇到问题的类。我会更新我的原始问题,以包含来自Morphia的记录错误的代码。谢谢托马斯,我会仔细研究一下。 – Ben

回答

0

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

+0

听众是由Morphia预定义的,我没有改变任何东西。从我所能告诉的类本身没有任何改变,所以它似乎并不可变,尽管它为每个实例创建了记录器。看起来奇怪的是,它会很好,但记录错误,除非听众默认是可变的,但它也完全有可能不是实际的问题,而Morphia只是穿过它的T并点了它的I。你的建议是否可以忽略呢?或者需要更多研究/信息? – Ben

+0

因为AccountWatcher是无状态的,所以你可以忽略这个错误。 – evanchooly

+0

好,非常感谢您的帮助! – Ben

相关问题