2015-04-17 4 views
1

Я разрабатываю небольшой бэкэнд с движком приложения. Теперь я получаю какое-то странное поведение после сохранения объекта несколько раз с разными значениями. Моего код для загрузки сущности является одинаковым для всех субъектов - каждый субъект получает changeId так что я могу передать только измененные объекты для клиентов:App Engine: разные результаты для того же объекта запроса

public class VersionableRecordHelper<T extends VersionableRecord> { 

final Class<T> clazz; 

public VersionableRecordHelper(Class<T> clazz) { 
    this.clazz = clazz; 
} 

Query<T> load() { 
    return ofy().load().type(clazz); 
} 

List<T> loadOrdered() { 
    return load().order("changeId").list(); 
} 

public List<T> loadOrdered(Long since) { 
    return since == null ? loadOrdered() : load().filter("changeId >", since).order("changeId").list(); 
} 

} 

клиентов могут затем запросить все объекты класса, предоставляя since стоимость. Например:

private final VersionableRecordHelper<Cat> helper 
    = new VersionableRecordHelper<>(Cat.class); 

// actually an @ApiMethod, simplified here 
public List<Cat> getCats(Long since) { 
    return helper.loadOrdered(since); 
} 

Моя сущность Cat выглядит следующим образом:

@Entity 
@Cache 
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS) 
public class Cat extends VersionableRecord { 
    // some fields, getters, setters 
} 

public class VersionableRecord { 
    @Id 
    private String id; 

    @Index 
    private Long changeId; 

    // getters, setters and more 
} 

Теперь, если я делаю то же запрос REST с since == 4, я получаю совершенно разные результаты - иногда с changeId == 5, , но также с 2, 3 или 4 - что не должно быть возможным!

Я полностью потерян здесь. Это то, что я еще проверил:

  • Я не менял записей во время теста. Фактически, я полностью оставил записи только более 90 минут.
  • Я проверил, что работает только один экземпляр двигателя приложения.
  • Я попытался очистить memcache - но те же 2 ключа ObjectifyCache продолжают болтаться.
  • Уровень обслуживания memcache - «Общий».
  • Я проверил, что значение since не является никчемным. Таким образом, код определенно выполняется.
  • В настоящее время я использую объектную версию 5.0.3. С моей build.gradle: compile 'com.googlecode.objectify:objectify:5.0.3'
  • Я также убедился, что предприятие имеет правильную changeId в хранилище данных, проверяя https://console.developers.google.com/project/project-id/datastore/query?authuser=0

Кто-нибудь есть полезные идеи? Я также проверил разные типы объектов - такое же поведение.

+0

Возможно, я просто заявляю очевидное. Но уверены ли вы, что, когда вы выполняете вызов REST, ваш код на самом деле попадает в цель, и нет кеша http в середине, возвращая вам неправильное предыдущее значение)? – Claudio

+0

Эй @ Claudio - нет, это определенно нет.Я могу назвать это с помощью утилиты 'curl' и получить разные результаты. Браузер, завиток, приложение для iOS - все те же. – mreichelt

+0

Я узнал, что если я * вручную выключу * мой экземпляр и пусть новый запускается автоматически, все работает так, как ожидалось. Но это не может быть решением. ;) – mreichelt

ответ

2

Wild догадка, это связано с FAQ # 3:

https://code.google.com/p/objectify-appengine/wiki/FrequentlyAskedQuestions#Strange_things_are_showing_up_in_my_session_cache!_(or_missing_f

или, когда GoogleCode умирает, третий один вниз:

https://github.com/objectify/objectify/wiki/FrequentlyAskedQuestions

Вы должны иметь ObjectifyFilter в противном случае вы будете пропускать данные сеанса в последующие запросы. Перейдите к более поздней версии Objectify; он даст вам более явную ошибку (за счет усложнения теста и удаленного использования api, но это совсем другая история).

Если это не ваша проблема, вам необходимо более подробно описать ваш точный код.

+0

Это правильный ответ - я пропустил, чтобы добавить ObjectifyFilter в web.xml. Спасибо за помощь! :) Теперь я вижу, что в установочном документе четко указано, что включить ObjectifyFilter на https://github.com/objectify/objectify/wiki/Setup - но я считаю, что это могло быть спроектировано в более удобном, безопасный способ. – mreichelt

+0

Очень недавние версии Objectify делают это явной ошибкой (за счет того, что некоторые другие способы использования Objectify немного сложнее). Пожалуйста, обновите :) – stickfigure

+0

Хорошо, я обновился до Objectify 5.1.5! Надеемся, что новая версия работает так, как ожидалось. В очередной раз благодарим за помощь! :) – mreichelt