小编tvi*_*alw的帖子

如何在销毁Web应用程序中的所有其他bean之前关闭Spring任务执行程序/调度程序池?

在Spring Web应用程序中,我有几个DAO和服务层bean.一个服务层bean具有带注释的@Async/@Scheduled方法.这些方法依赖于其他(自动装配的)bean.我在XML中配置了两个线程池:

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
     <property name="corePoolSize" value="2" />
     <property name="maxPoolSize" value="5" />
     <property name="queueCapacity" value="5" />
     <property name="waitForTasksToCompleteOnShutdown" value="true" />
     <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
        </property>
    </bean>

<bean id="taskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
     <property name="poolSize" value="10" />
     <property name="waitForTasksToCompleteOnShutdown" value="true" />
     <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
        </property>
    </bean>

    <task:annotation-driven executor="taskExecutor" scheduler="taskScheduler"/>
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.我的问题是我无法完全关闭任务池.任务在数据库和文件系统上运行.当我停止Web应用程序时,它需要一些时间才能停止.这表明该waitForTasksToCompleteOnShutdown物业有效.但是,我在日志中得到IllegalStateExceptions,表明某些bean已经被销毁但是一些工作任务线程仍在执行,并且它们因为依赖项被破坏而失败.

有一个JIRA问题可能是相关的:SPR-5387

我的问题是:有没有办法告诉Spring最后初始化任务执行程序/调度程序bean还是有办法告诉Spring先破坏它们吗?

我的理解是,销毁是以颠倒的初始顺序进行的.因此,最后初始化的bean将首先被销毁.如果首先销毁线程池bean,则所有当前正在执行的任务都将完成,并且仍然可以访问依赖bean.

我还尝试在引用我的服务bean的线程池上使用depends-on属性,该服务bean具有@Async和@Scheduled注释.好像它们从未执行过,我没有得到上下文初始化错误.我假设带注释的服务bean在某种程度上需要首先初始化这些线程池,如果我使用依赖,我会颠倒顺序并使它们不起作用.

java spring threadpool

43
推荐指数
2
解决办法
9万
查看次数

如何在URL参数中提交哈希键?

我有一个Spring-MVC应用程序,Freemarker作为视图组件.

在我的模板中,生成了几个指向我的应用程序的链接,其中包含包含哈希键(#)的URL参数.

例:

参数: Q#106368 11

Freemarker使用编码的参数生成的URL: testurl.html?key=Q%23106368%2011

我使用JavaScript重定向到这个URL(原因:我使用JS来同时管理2帧的加载).

重定向方法很简单:

    function redir(url) {
        window.location.href = url;
    }
Run Code Online (Sandbox Code Playgroud)

Freemarker生成的JS调用看起来像

<a href="javascript:redir('http://localhost:8080/testappp/testurl.html?key=Q%23106368%2011');">test</a>
Run Code Online (Sandbox Code Playgroud)

我的问题是浏览器/ Javascript转换回URL编码参数,认为有一个#并切断那里.

当我window.location.href='http://...'直接使用它的工作原理.只有在使用方法参数时,它似乎是神奇的URL解码,然后重定向失败,因为URL被切断了#.

有没有一种简单的方法来正确传输参数?

我知道我可以在模板中替换#例如with $$$hash$$$,并再次在服务器端进行替换.但是有很多地方我不得不改变......

javascript urlencode

5
推荐指数
2
解决办法
1万
查看次数

标签 统计

java ×1

javascript ×1

spring ×1

threadpool ×1

urlencode ×1