gpt4 book ai didi

java - 如何在websphere宕机之前执行java中的特定方法?

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:10 24 4
gpt4 key购买 nike

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

处理完每条记录后,记录状态更改为“Z”。现在,如果在处理记录时出现问题(例如 outOfMemory 错误)并且 WebSphere 出现故障,记录状态将保持为“Y”。

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

最佳答案

如果应用程序遇到 OutOfMemoryError,那么您实际上没有可靠的方法来确保在停止运行之前执行某些代码(实际上,OutOfMemoryError 实际上不会使进程自行终止,但这并不重要 - 如果内存不足,您将无法确定在该进程中是否能够执行任何操作)。

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

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

执行此操作的另一种方法(如果由于某些特定原因需要“Y”状态)是在启动时检查“Y”记录,例如在用 @PostConstruct

注释的方法中

关于java - 如何在websphere宕机之前执行java中的特定方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24659748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com