在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在某种程度上需要首先初始化这些线程池,如果我使用依赖,我会颠倒顺序并使它们不起作用.
我有一个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$$$
,并再次在服务器端进行替换.但是有很多地方我不得不改变......