В настоящее время я работаю над переносом приложения GWT-RPC на использование сервисов RESTful. Для этого я заменил все вызовы RPC на domino-rest и дополнительно обновил jersey1 на jersey2. Да, jersey1 уже был там для какой-то внешней связи. Теперь я перенес все вызовы RPC в REST и сначала подумал, что все работает отлично.
Для внедрения зависимостей я использую Guice 6, а после миграции на Jersey2 — HK2-Guice-bridge. Для сохранения нескольких моих БД я использую JPA/Hibernate. Для полноты картины: перед началом миграции на Jersey2 и domino-rest все работало.
Проблема
Каждый раз, когда я обновляю объект домена в базе данных , это работает идеально. Но когда я запрашиваю его снова с помощью запроса GET, я иногда (!) получаю старую версию (до обновления), а иногда и правильную обновленную версию. Я проверил весь стек вызовов и понял, что это не проблема с кэшированием GET. Проблема исходит из моего репозитория, точнее, из EntityManager, иногда возвращает старую версию.
Журнал jersey2 показал мне, что используются разные потоки, поэтому EntityManager не является потоковым. безопасно, я думал, в этом ли проблема. Я не уверен, или есть что-то еще. Если это проблема с потокобезопасностью, было бы неплохо, если бы вы помогли мне разобраться, в чем проблема.
Источники
Generic-Repository
Код: Выделить всё
public class Repository {
@Inject
private Provider emProvider;
private final Class entityType;
@Inject
public Repository(final Class entityType) {
this.entityType = entityType;
}
public EntityManager getEntityManager() {
return emProvider.get();
}
public T get(long id) {
return getEntityManager().find(entityType, id);
}
public T update(T o) {
EntityManager em = getEntityManager();
em.merge(o);
em.flush();
return o;
}
//other code omitted
}
Код: Выделить всё
public class PersistenceModule extends PrivateModule {
private final String unitName;
public PersistenceModule(String unitName) {
this.unitName = unitName;
}
@Override
protected void configure() {
// I know setAutoBeginWorkOnEntityManagerCreation is not recommended, but for the time being.
install(new JpaPersistModule(unitName, JpaPersistOptions.builder().setAutoBeginWorkOnEntityManagerCreation(true).build()));
bind(PersistenceManager.class).asEagerSingleton();
expose(PersistenceManager.class);
// User
TypeLiteral userRepoType = new TypeLiteral() {
};
bind(userRepoType).toInstance(new Repository(User.class));
expose(userRepoType);
}
}
Код: Выделить всё
@Singleton
public class PersistenceManager {
private final PersistService service;
@Inject
public PersistenceManager(PersistService service) {
this.service = service;
service.start();
}
public void stop() {
service.stop();
}
}
Моей точкой входа для веб-приложения является ApplicationConfig, расширяющий ResourceConfig, где Guice.createInjector< /code> с вышеупомянутым PersistenceModule. Затем инжектор подается на мост HK2-Guice. Надеюсь, у вас есть подсказка. Требуется ли что-то еще? Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/791 ... fe-problem
Мобильная версия