程序中新建Thread部署到WebSphere中产生的问题

Thread replayReqProducerThread=new Thread(new AdjustmentReplayRequestProducer(...);

replayReqProducerThread.start();

public class AdjustmentReplayRequestProducer implements Runnable{

public void run() {

while(true){...}

} }

以上代码希望在整个context中创建单例的Producer,不停地从database获取数据,放入队列,供消费者获取。但是部署到Websphere后,每次重启application后,都会多处一个Producer。原因是停止Webapplication时,由于该Thread没有纳入到Spring Context或任何其他Websphere管理的容器中,所以没有被销毁。

正确的做法是:1)由Spring管理的ThreadPool来创建该Thread

<bean id="replayProducerTaskExecutor"

class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">

<property name="corePoolSize" value="1"/>

<property name="maxPoolSize" value="1"/>

<property name="queueCapacity" value="1"/>

</bean>

replayProducerTaskExecutor.execute(new AdjustmentReplayRequestProducer(...));

2)在代码中加入

while(true){

if (Thread.currentThread().isInterrupted()) {

logger.info("producerTask is interrupted, will exit ...");

break; }  ...

}

Thread.sleep(retrieveFcstAdjmtFromDBInterval);

} catch (InterruptedException e) {

logger.info("error occured: ", e);

Thread.currentThread().interrupt();

}

因为WebSphere在Stop application时,会stop Spring contxt.

com.ibm.ws.runtime.component.ApplicationMgrImpl AUDIT WSVR0217I: Stopping application: ruby-ae-replay_war

com.ibm.ws.webcontainer.webapp INFO com.ibm.ws.webcontainer.webapp.WebApp log SRVE0292I: Servlet Message - [ruby-ae-replay_war#ruby-ae-replay.war]:.Closing Spring root WebApplicationContext

Spring 会调用replayProducerTaskExecutor的destroy的this.executor.shutdownNow()

ThreadPoolExecutor的shutdownNow中有interruptWorkers

for (Worker w : workers) w.interruptIfStarted();->t.interrupt();

整个流程过后,该Produer会退出loop 循环。进而被回收

时间: 2024-10-07 10:38:42

程序中新建Thread部署到WebSphere中产生的问题的相关文章

myeclipse新建项目部署到tomcat中,点击finish键没反应

解决方案: 1.查看properties -->web,是WebRoot 和/项目名 2.检查tomcat是否配置jdk, 版权声明:本文为博主原创文章,未经博主允许不得转载.

Umbraco -- 在Visual Studio中新建一个View 如何在Umbraco back office 中显示出来

在使用Umbraco中的过程中,遇到一个问题. 我在项目中(Visual Studio),添加了一个View---Test.cshtml. 然后进入到该Umbraco项目的back office, 在back office 的 Templates中,刷新之后,并没有发现这个view(Template). 为什么呢? 因为Umbraco back office 中的Template,是有一些相关的信息保存在数据库中的, 加载时,会根据数据表中的相关信息来加载这个Umbraco back offic

Java Web开发Tomcat中三种部署项目的方法

一般情况下,开发模式下需要配置虚拟主机,自动监听,服务端口,列出目录文件,管理多个站点等功能 准备工作: 软件包:apache-tomcat-6.0.20.rar 将软件包解压至硬盘一分区,进入%TOMCAT_HOME%/conf目录 一:server.xml 配置 1.配置端口,修改server.xml. <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000"

JBoss AS7中进行项目部署

AS7的项目部署方式与原有版本相比有了较大变化,本文通过实例来讲解AS7中的项目部署方式. 有关JBoss AS7的下载和安装,请参考蓝点上面的另一篇文章: http://bluedash.net/spaces/JBoss%20AS%207%20快速上手 部署一个简单的Web项目 下载安装完成后,我们用standalone方式来启动JBoss AS7: liweinan@smart:~/projs/jboss-7.0.0.CR1/bin$ ./standalone.sh 启动后,我们试着向AS7

(转)WebSphere 中池资源调优 - 线程池、连接池和 ORB

WebSphere 中池资源调优 - 线程池.连接池和 ORB 来自:https://www.ibm.com/developerworks/cn/websphere/library/techarticles/1106_zhuxl_websphereenhancement/1106_zhuxl_websphereenhancement.html IBM WebSphere Application Server (以下简称 WAS)能支持的应用程序越来越多,而这些应用程序有各自的独特特性.需求和服务

ELK部署和过程中的报错汇总

一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 1.1.2 elasticsearch几个重要术语 NRT elasticsea

python-pycharm中使用anaconda部署python环境

pycharm中使用anaconda部署python环境 今天来说一下python中一个管理包很好用的工具anaconda,可以轻松实现python中各种包的管理.相信大家都会有这种体验,在pycharm也是有包自动搜索和下载的功能,这个我在前面的一篇博客中有相关的介绍(详情请查看点击打开链接),但是这种功能对于一些包是可以使用的,但是总是会遇到有些包下载失败或查询不到的时候,这个时候就会让人很苦恼了.这里我们就来说一下anaconda的好处. 下面是我从别的地方贴来的说辞: Anaconda的

Java中继承thread类与实现Runnable接口的区别

Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. Java代码   package com.threadtest; class MyThread e

在Azure中新建Linux

开始学习Linux,这里开个系列用来记录Linux的学习笔记,这些是在实验楼:https://www.shiyanlou.com/的学习笔记. 这一篇是在Azure中新建一个Ubuntu的服务器用于练手,Ubuntu是Linux的一个发行版本. 一.打开Azure portal,新建->计算->Ubuntu Server->创建 随后会弹出一些配置供用户填写 1.基本 名称是在Azure中用来区分不同资源的名字,随便填个,这主要你自己记得就好. 下面的用户名就是用来登陆的服务器的用户名,