`

上下文相关的生命周期处理 LifeCycle

阅读更多
/*
 * JBoss, Home of Professional Open Source
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package org.jboss.seam.contexts;

import java.util.Map;
import java.util.Set;

import org.jboss.seam.ScopeType;
import org.jboss.seam.core.ConversationEntries;
import org.jboss.seam.core.Manager;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;

/**
 * Methods for setup and teardown of Seam contexts.
 * 
 * @author Gavin King
 * @author <a href="mailto:theute@jboss.org">Thomas Heute</a>
 */
public class Lifecycle
{

   private static final LogProvider log = Logging.getLogProvider(Lifecycle.class);

   private static ThreadLocal<Boolean> destroying = new ThreadLocal<Boolean>();
   private static Map<String, Object> application;

   public static Map<String, Object> getApplication() 
   {
      if (!isApplicationInitialized())
      {
         throw new IllegalStateException("Attempted to invoke a Seam component outside an initialized application");
      }
      return application;
   }   
   
   public static boolean isApplicationInitialized() {
       return application!=null; 
   }

   public static void beginApplication(Map<String, Object> app) 
   {
      application = app;
   }
   
   public static void endApplication()
   {
      log.debug("Shutting down application and destroying contexts");
      
      Context tempApplicationContext = new ApplicationContext( getApplication() );
      Contexts.applicationContext.set(tempApplicationContext);
      Contexts.destroy(tempApplicationContext);
      Contexts.applicationContext.set(null);
      Contexts.eventContext.set(null);
      Contexts.sessionContext.set(null);
      Contexts.conversationContext.set(null);
      
      application = null;
   }

   public static void startDestroying()
   {
      destroying.set(true);
   }

   public static void stopDestroying()
   {
      destroying.set(false);
   }

   public static boolean isDestroying()
   {
      Boolean value = destroying.get();
      return value!=null && value.booleanValue();
   }

   public static void beginCall()
   {
      log.debug( ">>> Begin call" );
      Contexts.applicationContext.set( new ApplicationContext(getApplication()) );
      Contexts.eventContext.set( new BasicContext(ScopeType.EVENT) );
      Contexts.sessionContext.set( new BasicContext(ScopeType.SESSION) );
      Contexts.conversationContext.set( new BasicContext(ScopeType.CONVERSATION) );
      Contexts.businessProcessContext.set( new BusinessProcessContext() );
   }

   public static void endCall()
   {
      try
      {
         Contexts.destroy( Contexts.getSessionContext() );
         Contexts.flushAndDestroyContexts();
         if ( Manager.instance().isLongRunningConversation() )
         {
            throw new IllegalStateException("Do not start long-running conversations in direct calls to EJBs");
         }
      }
      finally
      {
         clearThreadlocals();
         log.debug( "<<< End call" );
      }
   }

   /**
    * @deprecated Use {@link Lifecycle#setupApplication()}
    */
   @Deprecated
   public static void mockApplication()
   {
      setupApplication();
   }
   
   /**
    * @deprecated Use {@link Lifecycle#cleanupApplication()}
    */
   @Deprecated
   public static void unmockApplication()
   {
      cleanupApplication();
   }
   
   public static void setupApplication()
   {
      Contexts.applicationContext.set( new ApplicationContext(getApplication()) );
   }

   public static void cleanupApplication()
   {
      Contexts.applicationContext.set(null);
   }

   public static Context beginMethod()
   {
      Context result = Contexts.methodContext.get();
      Contexts.methodContext.set( new BasicContext(ScopeType.METHOD) );
      return result;
   }

   public static void endMethod(Context context)
   {
      Contexts.methodContext.set(context);
   }
   
   public static void endRequest() 
   {
      log.debug("After request, destroying contexts");  
      try
      {
         Contexts.flushAndDestroyContexts();
      }
      finally
      {
         clearThreadlocals();
         log.debug( "<<< End web request" );
      }
   }

   static void clearThreadlocals() 
   {
      Contexts.eventContext.set(null);
      Contexts.pageContext.set(null);
      Contexts.sessionContext.set(null);
      Contexts.conversationContext.set(null);
      Contexts.businessProcessContext.set(null);
      Contexts.applicationContext.set(null);
   }
   
   public static void destroyConversationContext(Map<String, Object> session, String conversationId)
   {
      Contexts.destroyConversationContext(session, conversationId);
   }

   public static void beginSession(Map<String, Object> session)
   {
      log.debug("Session started");
      
      //Normally called synchronously with a JSF request, but there are some
      //special cases!

      boolean applicationContextActive = Contexts.isApplicationContextActive();
      boolean eventContextActive = Contexts.isEventContextActive();
      boolean conversationContextActive = Contexts.isConversationContextActive();

      if ( !applicationContextActive )
      {
         Context tempApplicationContext = new ApplicationContext( getApplication() );
         Contexts.applicationContext.set(tempApplicationContext);
      }
      Context oldSessionContext = Contexts.sessionContext.get();
      Contexts.sessionContext.set( new SessionContext(session) ); //we have to use the session object that came in the sessionCreated() event
      Context tempEventContext = null;
      if ( !eventContextActive )
      {
         tempEventContext = new BasicContext(ScopeType.EVENT);
         Contexts.eventContext.set(tempEventContext);
      }
      Context tempConversationContext = null;
      if ( !conversationContextActive )
      {
         tempConversationContext = new BasicContext(ScopeType.CONVERSATION);
         Contexts.conversationContext.set(tempConversationContext);
      }

      Contexts.startup(ScopeType.SESSION);
      
      if ( !conversationContextActive )
      {
         Contexts.destroy(tempConversationContext);
         Contexts.conversationContext.set(null);
      }
      if ( !eventContextActive ) 
      {
         Contexts.destroy(tempEventContext);
         Contexts.eventContext.set(null);
      }
      Contexts.sessionContext.set(oldSessionContext); //replace the one from sessionCreated() with the one from JSF, or null
      if ( !applicationContextActive ) 
      {
         Contexts.applicationContext.set(null);
      }
      
   }

   public static void endSession(Map<String, Object> session)
   {
      log.debug("End of session, destroying contexts");
      
      //This code assumes that sessions are only destroyed at the very end of a  
      //web request, after the request-bound context objects have been destroyed,
      //or during session timeout, when there are no request-bound contexts.
      
      if ( Contexts.isEventContextActive() || Contexts.isApplicationContextActive() )
      {
         throw new IllegalStateException("Please end the HttpSession via org.jboss.seam.web.Session.instance().invalidate()");
      }
      
      Context tempApplicationContext = new ApplicationContext( getApplication() );
      Contexts.applicationContext.set(tempApplicationContext);
   
      //this is used just as a place to stick the ConversationManager
      Context tempEventContext = new BasicContext(ScopeType.EVENT);
      Contexts.eventContext.set(tempEventContext);
   
      //this is used (a) for destroying session-scoped components
      //and is also used (b) by the ConversationManager
      Context tempSessionContext = new SessionContext(session);
      Contexts.sessionContext.set(tempSessionContext);
   
      Set<String> conversationIds = ConversationEntries.instance().getConversationIds();
      log.debug("destroying conversation contexts: " + conversationIds);
      for (String conversationId: conversationIds)
      {
         Contexts.destroyConversationContext(session, conversationId);
      }
      
      //we need some conversation-scope components for destroying
      //the session context...
      Context tempConversationContext = new BasicContext(ScopeType.CONVERSATION);
      Contexts.conversationContext.set(tempConversationContext);
   
      log.debug("destroying session context");
      Contexts.destroy(tempSessionContext);
      Contexts.sessionContext.set(null);
      
      Contexts.destroy(tempConversationContext);
      Contexts.conversationContext.set(null);
   
      Contexts.destroy(tempEventContext);
      Contexts.eventContext.set(null);
   
      Contexts.applicationContext.set(null);
   }

}

node:Contexts的外观,生命周期的预前后处理,例如application start时调用BeginApplication对上下文进行设置,他同时保存一个服务器级变量application,同时以保持一个与线程相关的destory标记,用来标记context是否被destory.例如.startDestory将destory set true,stopDesotry set false,可以用来判断某些Context是否destory,从而进行选择性处理.
分享到:
评论

相关推荐

    第二十章 Spring 应用上下文生命周期(ApplicationContext Lifecycle)1

    总结全文,强调Spring应用上下文生命周期的重要性以及理解其工作原理对于开发和维护Spring应用的意义。 了解Spring应用上下文的生命周期有助于我们更好地管理和控制Bean的行为,以及优化应用的性能和稳定性。在...

    fragment生命周期

    在实际开发中,应合理利用这些生命周期方法来处理各种场景,例如在`onCreateView()`中初始化视图,在`onStart()`或`onResume()`中启动定时器或监听器,在`onPause()`中停止可能占用资源的操作,在`onDestroy()`中...

    上下文应用

    7. **请求生命周期(Request Lifecycle)**:从请求到达服务器到响应返回客户端,RequestContext如何在整个过程中发挥作用,包括初始化、处理请求、响应生成和清理等阶段。 8. **自定义RequestContext**:开发者可能...

    spring-lifecycle:一个用于试验 spring 生命周期的小示例应用程序

    让我们深入了解一下Spring框架的生命周期及其相关的知识点。 在Spring中,bean的生命周期是指从创建到销毁的整个过程,它包括初始化、正常运行以及销毁三个阶段。这个小示例应用程序很可能是为了演示这些阶段的各种...

    基于AndroidStudio的activity-lifecycle示例,Google网站上外国人写的,真是好!

    这个"activity-lifecycle"示例可能包含了一个或多个Activity,每个Activity对应生命周期的不同阶段,并通过日志打印或可视化方式显示状态变化。开发者可以调试这些Activity,观察每个方法的调用顺序,以便更好地理解...

    Android Lifecycle for application developers Guidelines and Tips

    - 初始化和删除EGL、上下文、表面和渲染资源的操作应在适当的生命周期阶段执行。 - 在渲染过程中,需要注意同步问题,确保UI线程和其他线程之间的通信不会导致应用崩溃或卡顿。 ### 用户操作和回调序列 用户操作会...

    前端大厂最新面试题-lifecycle.docx

    生命周期钩子会自动绑定 this 上下文到实例中,因此你可以访问数据,对 property 和方法进行运算。这意味着你不能使用箭头函数来定义一个生命周期方法(例如 created: () =&gt; this.fetchTodos())。 Vue 生命周期...

    jsf 详细 原理介绍 内容讲解

    JavaServer Faces(JSF)...总的来说,JSF提供了一个强大的框架,通过组件、上下文、生命周期管理和事件处理机制,简化了Web应用程序的开发。理解这些基本概念是掌握JSF的关键,也是开发高效、可维护的应用程序的基础。

    Spring学习笔记之bean生命周期

    - `ApplicationContextAware`: 提供了对ApplicationContext的访问,使得Bean可以获取上下文信息,如其他Bean或资源。 2. 初始化阶段: 在Bean实例化并设置了所有依赖属性之后,Spring允许通过两种方式执行自定义...

    AutoDispose.zip

    在这个例子中,`AndroidLifecycleScopeProvider.from(this)` 将当前的上下文(可能是 Activity 或 Fragment)与 AutoDispose 连接,这样当这个上下文结束时,disposable 就会被自动清理。 AutoDispose 还支持 ...

    jstree-3.0.0.zip

    至于压缩包内的文件"Lifecycle-master",这通常表明这是一个Git仓库的主分支克隆,可能包含了生命周期框架的源代码、文档、测试用例和其他相关资源。在Git仓库中,“master”分支通常代表项目的主线开发,是所有其他...

    tomcat工作原理(中文版)

    6. **第6章:生命周期(Lifecycle)** - **Lifecycle接口**:定义了组件生命周期的方法。 - **LifecycleEvent类**:用于触发生命周期事件。 - **LifecycleListener接口**:监听组件的生命周期变化。 通过以上...

    React-Contact-Manager-CONTEXT-API-:使用React,上下文API,生命周期方法和管理仪表板构建的React联系人管理器

    This is a react contact manager built with react, context API, lifecycle methods and an admin dashboard. 入门git克隆这个项目进入项目npm安装npm开始会费嗨,要添加或删除功能,请创建一个PR `此处托管了该...

    ISO-21434.pdf

    文档的某个部分提到了生命周期(Lifecycle)和生产后阶段(post-production phase)的各个阶段,这表明ISO/SAE 21434标准重点关注于车辆产品的整个生命周期内的网络安全管理,从产品开发到售后服务的每个阶段都需要...

    tomcat work machion

    这一职责由实现了Service接口和Lifecycle接口的StandardService类承担,它能够控制其组件的启动、停止等生命周期状态。 StandardService类中包含了对事件监听器的支持,这是设计模式中的Observer模式的应用,允许...

    how tom cat works中文PDF+源码

    2. **请求处理**:当一个HTTP请求到达,Tomcat通过连接器(Connector)接收到请求,解析请求头和请求体,然后将请求转发给对应的Context(应用上下文)。 3. **路由到Servlet**:根据请求的URL,Tomcat查找匹配的...

    Eclipse-OSGi内核源码分析.pdf

    Eclipse OSGi内核源码分析会涉及到OSGi规范的多个方面,例如服务注册(Service Registry)、生命周期管理(Lifecycle Management)、模块化和依赖解析(Modularity and Dependency Resolution)、以及动态化...

    JavaServer Faces in Action(英文版)

    4. **生命周期(Lifecycle)**:JSF有六个阶段,从初始化到渲染响应,每个阶段都有特定的任务,如应用请求值、处理事件、更新模型值等。 5. **表达式语言(EL,Expression Language)**:JSF使用EL来访问后台bean的...

    Tomcat的系統架構與設計模式

    请求首先到达Engine(顶级Container),然后根据域名映射到Host,接着到Context(应用上下文),最后到Wrapper(Servlet实例)。\n\n2. 请求分发与处理\n\n当Connector接收到请求时,它会将请求对象封装成一个...

    myfaces-core-1.2.2-src.zip

    3. **Lifecycle**:JSF生命周期包括6个阶段:恢复视图、应用请求值、处理验证、更新模型值、调用应用逻辑和渲染响应。在每个阶段,MyFaces Core都会执行特定的任务,如解析请求参数、验证用户输入、更新模型对象等。...

Global site tag (gtag.js) - Google Analytics