Java EE中的长生命线程

时间:2011-05-13 04:40:14

标签: java multithreading java-ee

我需要编写具有这些特性的Java系统。

- 当系统启动时,它需要创建一些在系统运行时需要永久​​生存的对象。同样在对象的构造函数上,将创建新线程,并且这些线程也需要在系统运行时生存。

- 系统需要公开将使用在启动时创建的对象的Web服务。

为了给出我需要做什么的上下文,我需要对应用程序进行编码,该应用程序在启动时会创建一些负责执行轮询任务的对象。此外,我需要一个使用这些对象来处理其请求的Web服务。

如何在Java中实现这些?我正在考虑使用Java EE来实现Web服务,还因为我计划实现一个使用Web服务的Web界面。但是我遇到的大问题是,如何在Java EE中实现自应用程序启动以来永久存在的线程?

4 个答案:

答案 0 :(得分:2)

如果您真的不需要应用程序服务器,可以provide the webservice also in a J2SE environment。对于线程问题,您可能需要查看the Executor framework,您可以通过线程池轻松备份线程并安排Runnable重新开始工作(比如说每5秒)。但是,这通常不会与Java EE容器混合得很好,因为不鼓励自己产生线程。

答案 1 :(得分:2)

您可以编写一个实现Thread的类,稍后使用Singleton范围从该类创建一个对象,只要系统正在运行,它就会存在。 Spring是实现这一目标的一个很好的框架。

http://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-factory-scopes-singleton

答案 2 :(得分:2)

如果您使用Java EE方式,则应考虑EJB Timer Service

答案 3 :(得分:2)

您可以使用Spring Timer任务来处理轮询功能。声明弹出计时器任务很简单 -

<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
  <!-- wait 10 seconds before starting repeated execution -->
  <property name="delay" value="10000"/>
  <!-- run every 50 seconds -->
  <property name="period" value="50000"/>
  <property name="timerTask" ref="sendEmail"/>
</bean>
<bean id="sendEmail" class="examples.CheckEmailAddress">
  <property name="emailAddresses">
    <list>
      <value>jdoe@test.test</value>
     </list>
  </property>
</bean>

此处,您希望在启动时初始化的任何对象都可以定义为Spring Singleton bean。这应该解决您的目的,而无需太多复杂的编码。