Я разрабатываю небольшой бэкэнд с движком приложения. Теперь я получаю какое-то странное поведение после сохранения объекта несколько раз с разными значениями. Моего код для загрузки сущности является одинаковым для всех субъектов - каждый субъект получает 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
Кто-нибудь есть полезные идеи? Я также проверил разные типы объектов - такое же поведение.
Возможно, я просто заявляю очевидное. Но уверены ли вы, что, когда вы выполняете вызов REST, ваш код на самом деле попадает в цель, и нет кеша http в середине, возвращая вам неправильное предыдущее значение)? – Claudio
Эй @ Claudio - нет, это определенно нет.Я могу назвать это с помощью утилиты 'curl' и получить разные результаты. Браузер, завиток, приложение для iOS - все те же. – mreichelt
Я узнал, что если я * вручную выключу * мой экземпляр и пусть новый запускается автоматически, все работает так, как ожидалось. Но это не может быть решением. ;) – mreichelt