Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在非spring管理的bean中启动事务?_Java_Spring_Transactions_Spring Transactions - Fatal编程技术网

Java 如何在非spring管理的bean中启动事务?

Java 如何在非spring管理的bean中启动事务?,java,spring,transactions,spring-transactions,Java,Spring,Transactions,Spring Transactions,我有一个Spring3.2.8应用程序,在这个应用程序中,我有一个特殊的例子,我想在上下文侦听器中启动一个事务 我知道并意识到侦听器不是spring管理的bean,因此我不完全确定如何将我的方法标记为@Transactional。我试着将bean标记为可配置的,但这似乎不起作用;我猜b/c应用服务器在加载spring上下文之前实例化了这个bean 我已使用TransactionSpectSupport.currentTransactionStatus()检查了事务状态,但在没有托管打开的事务时引

我有一个Spring3.2.8应用程序,在这个应用程序中,我有一个特殊的例子,我想在上下文侦听器中启动一个事务

我知道并意识到侦听器不是spring管理的bean,因此我不完全确定如何将我的方法标记为
@Transactional
。我试着将bean标记为可配置的,但这似乎不起作用;我猜b/c应用服务器在加载spring上下文之前实例化了这个bean

我已使用
TransactionSpectSupport.currentTransactionStatus()
检查了事务状态,但在没有托管打开的事务时引发了
NotTransactionException

Spring中是否有任何东西允许我将此方法标记为事务的一部分

@Configurable
public class PatchEngineContextListener implements ServletContextListener{

    // SLF4J logger
    private static final Logger logger = LoggerFactory.getLogger(PatchEngineContextListener.class);


    // HELPERS
    private ApplicationContext appContext;
    @Autowired private PatchService patchService;
    @Autowired private PatchEngine patchEngine;

    @Override
    @Transactional
    public void contextInitialized(ServletContextEvent sce) {

        // get the app context
        appContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
        appContext.getAutowireCapableBeanFactory().autowireBean(this);

        logger.info( TransactionAspectSupport.currentTransactionStatus().toString() );

        try {
            setPatchEngineUser();
            patchEngine.execute();
            clearPatchEngineUser();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
堆栈跟踪错误:

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
    at org.springframework.transaction.interceptor.TransactionAspectSupport.currentTransactionStatus(TransactionAspectSupport.java:110)
    at com.ia.system.patch.engine.PatchEngineContextListener.contextInitialized(PatchEngineContextListener.java:92)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
Web.xml:

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Patch Engine launched after spring finishes setting up its context -->
<listener>
    <listener-class>com.ia.system.patch.engine.PatchEngineContextListener</listener-class>
</listener> 

org.springframework.web.context.ContextLoaderListener
com.ia.system.patch.engine.PatchEngineContextListener
applicationContext.xml:

<context:spring-configured/>


您可以将TransactionManager连接到您的bean,然后手动管理事务。为什么它必须是
ServletContextListener
?你不能用适当的事件将它变成一个Spring
ApplicationListener
;我不知道Spring的ApplicationListener。我很难找到关于它的文档;谷歌搜索并没有立即向我指出优秀的spring文档——只有博客才知道如何实现它。你知道我在哪里可以找到关于Spring事件机制的相关文档吗?@jakub.petr-谢谢;我没有想到这一点。虽然我想我会先研究索蒂里奥斯的概念,从最开始。查看
ApplicationEvent
的实现类(及其子类)。国际奥委会的文件也应该有解释。