2015-11-09 5 views
0

Когда я начинаю свой сервер Tomcat я получаю эту ошибку: 2015 10:25:50 PM org.mongodb.morphia.mapping.MappedClass getOrCreateInstance суровое: Race-состояние, созданный дубликат класса: класс com.calendar.model.watchers.AccountWatcherКак исправить Race-состояние, дублировал Класс ошибка

Из того, что я могу сказать, это происходит от Морфии, но я не уверен, почему это происходит или как это исправить.

Код в морфий, который появляется ошибка будет приходить от это:

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 ..."); 
    } 
    } 
} 

И код для класса Account является:

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

Слушатель предопределен Морфией, и я ничего не изменил. Из того, что я могу сказать, сам класс никоим образом не изменяется, поэтому он не кажется изменчивым, хотя он создает регистратор для каждого экземпляра. Кажется странным, что было бы хорошо и все же регистрировать ошибку, если слушатель по умолчанию не изменен, но также вполне возможно, что это не проблема, и Морфия просто пересекает свои T и усекает ее I. Ваша рекомендация, что это можно игнорировать? Или требуется больше исследований/информации? – Ben

+0

Возможно, вы проигнорируете эту ошибку, так как AccountWatcher не имеет статуса. – evanchooly

+0

Хорошо, спасибо за помощь! – Ben

Смежные вопросы