如何在websphere出现故障之前在java中执行特定方法?

时间:2014-07-09 17:05:32

标签: java spring websphere

我在java应用程序中有一份工作,它每隔5分钟就使用spring JDBC从Oracle数据库中读取数据。 Java应用程序正在WebSphere Application Server上运行。它加载状态为“X”的记录,在加载记录后,它将记录的状态更改为“Y”。我们一次读取10k记录,并为10个线程内的每个线程提供1k记录以进行特定处理。

处理完每条记录后,记录状态变为“Z”。现在如果在处理outOfMemory错误和WebSphere等记录时出现问题,记录状态仍为“Y”。

因此,当下次Server启动时,作业开始读取状态为“X”的记录。但是未处理状态为“Y”的记录现在永远不会被加载。那么当WebSphere发生故障时,有没有办法调用方法?在其中我可以编写一段代码以使未处理的记录的状态为“X”,以便下次服务器启动时可以选择它们。

2 个答案:

答案 0 :(得分:1)

如果应用程序遇到OutOfMemoryError,那么确实没有可靠的方法可以确保在关闭之前执行某些代码(实际上,OutOfMemoryError实际上不会使进程死于本身,但没关系 - 如果你内存不足,你不能确定在这个过程中你能做任何事情。)

你应该做的是摆脱'Y'状态。只需确保读取项目的作业不会执行多次(见下文)。然后,您应该能够只读取项目,将它们发送出去进行处理,并在完成时将状态设置为“Z”(最好在与每个项目的处理相同的事务中)。

现在,您没有指定每五分钟如何启动您的工作,所以我只是假设您正在使用Spring的调度功能。如果是这种情况,只要它仍然在运行,作业将永远不会被激活。这意味着您的工作需要跟踪已发送的项目,并在退出之前等待它们完成。这可以使用ExecutorCompletionService来完成。只要还剩下更多任务,就将每个子任务(即1k记录的块)发送到同一ExecutorCompletionService并轮询已完成的任务。当所有子任务都返回后,您可以安全地退出父作业。

另一种方法(如果出于某种特殊原因需要'Y'状态)将在启动时检查'Y'记录,例如在使用@PostConstruct

注释的方法中

答案 1 :(得分:0)

当您使用spring标记问题时,您应该只使用带有destroy-method方法的单例bean:它将在应用程序上下文关闭时销毁,并在应用程序本身停止时发生

XML:<bean class="..." destroy-method="destroy"/>

JavaConfig:

@Bean(destroy-method = "destroy")
public class ... {
    public void destroy() {
        // do you cleanup
    }
}