0

我有一个基于 EclipseLink + JPA Guice Persist 的基础设施

当我重新部署应用程序时,我总是遇到缓存实体的缓存问题,我必须重新启动服务器(Oracle Weblogic 11g)。这个问题在这篇文章中得到了处理:https ://bugs.eclipse.org/bugs/show_bug.cgi ?id=326552 但是,也许不是错误¿?¿? ...

我设法解决了以下问题:

最初我将所有内容集中在一个 GuiceModule 中:

1.创建模块JAPersist

2.调用persistenceService.start()的Initializer类的绑定

public class MyGuiceModule implements Module {
    @Override
    public void configure(final Binder binder) {        
        Properties props = _dbConnectionPropertiesForPool();    
        JpaPersistModule jpaModule = new JpaPersistModule(persistenceUnit); 
        jpaModule.properties(props);            
        binder.install(jpaModule);
        binder.bind(JPAInitializer.class).asEagerSingleton();       
    }

   public class JPAInitializer {
    @Inject
    public JPAInitializer(final PersistService service) {
        service.start();
    }
}

一切正常....但正如我所说的重新部署时保持缓存实例

我是如何解决的?

  1. 我改变了方法 JPAInitializer

    公共静态类 JPAInitializer {

        private static PersistService _persistenceService = null;
    
        @Inject
        public JPAInitializer(final PersistService service) {
            _persistenceService = service;          
            _persistenceService.start();            
        }       
        public static void stop() {
            _persistenceService.stop();
        }
    }
    
  2. 我创建了一个停止服务的方法 stop () ..但是 WTF!我被迫将注入的持久性服务保存在静态变量中:((

  3. 从作为入口点的 guice / listener 过滤器调用停止应用程序时取消部署(onContextDestroyed)

    公共无效 contextDestroyed(ServletContextEvent servletContextEvent) { JPAInitializer.stop();
    }

现在,当我重新部署时,没有缓存问题或问题,也无需重新启动服务器

它是这样工作的,但我不知道是否可以创建一个静态实例 PesistenceService.,所以我试图找到另一种方法来调用停止.....

有什么建议吗?

4

1 回答 1

0

找到解决方案。

  1. 创建一个接口来处理 Guice Persistence Service :

    接口 MyPersistenceServiceHandler {

     public void start();
    
     public void stop(); 
    

    }

    这将用于主 DB Guice 模块:

    binder.bind(MyPersistenceServiceHandler .class)
    .to(JPAPersistenceServiceControl.class) .in(Singleton.class);

    静态类 JAPersistenceServiceControl 实现 MyPersistenceServiceHandler {

         private final PersistService _service;
    
         @Inject
         public JPAPersistenceServiceControl(final PersistService service) {
                _service = service;
         }
         @Override
         public void start() {
                if (_service == null) throw new IllegalStateException("NO persistence service available!");
                _service.start();
         }
         @Override
         public void stop() {
                if (_service == null) throw new IllegalStateException("NO persistence service available!");
                _service.stop();
         }
    

    }

  2. 通过 Guice Injector 获取 RESTEndpoint/Guice 过滤器中的实例。

    jpaServiceHandler = _myGuiceInjector.getInstance(MyPersistenceServiceHandler .class);

  3. 在 contextInitialized 上启动服务: jpaServiceHandler.start();

  4. 在 contextDeproyed 上停止服务: jpaServiceHandler.stop();

于 2015-02-23T09:16:47.567 回答