EJB @Schedule 等待方法完成

2024-03-24

我想编写一个每分钟执行一次的后台作业(EJB 3.1)。为此,我使用以下注释:

@Schedule(minute = "*/1", hour = "*")

工作正常。

但是,有时该作业可能需要一分钟以上的时间。在这种情况下,计时器仍然会被触发,从而导致线程问题。

如果当前执行未完成,是否有可能终止调度程序?


如果只有 1 个计时器同时处于活动状态,则有几种解决方案。

首先@Timer可能应该出现在@Singleton。在单例中,方法默认是写锁定的,因此当容器中仍然有活动时尝试调用计时器方法时,容器将自动被锁定。

以下内容基本上就够了:

@Singleton
public class TimerBean {

    @Schedule(second= "*/5", minute = "*", hour = "*", persistent = false)
    public void atSchedule() throws InterruptedException {

        System.out.println("Called");
        Thread.sleep(10000);
    }
}

atSchedule默认情况下是写锁定的,并且其中只能有一个线程处于活动状态,包括容器发起的调用。

被锁定后,容器可能会重试计时器,因此为了防止这种情况,您可以使用读锁并委托给第二个 bean(需要第二个 bean,因为 EJB 3.1 不允许将读锁升级为写锁)。

计时器豆:

@Singleton
public class TimerBean {

    @EJB
    private WorkerBean workerBean;

    @Lock(READ)
    @Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
    public void atSchedule() {

        try {
            workerBean.doTimerWork();
        } catch (Exception e) {
            System.out.println("Timer still busy");
        }
    }

}

工人豆:

@Singleton
public class WorkerBean {

    @AccessTimeout(0)
    public void doTimerWork() throws InterruptedException {
        System.out.println("Timer work started");
        Thread.sleep(12000);
        System.out.println("Timer work done");
    }
}

这可能仍然会在日志中打印一个嘈杂的异常,因此更详细但更安静的解决方案是使用显式布尔值:

计时器豆:

@Singleton
public class TimerBean {

    @EJB
    private WorkerBean workerBean;

    @Lock(READ)
    @Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
    public void atSchedule() {
        workerBean.doTimerWork();
    }

}

工人豆:

@Singleton
public class WorkerBean {

    private AtomicBoolean busy = new AtomicBoolean(false);

    @Lock(READ)
    public void doTimerWork() throws InterruptedException {

        if (!busy.compareAndSet(false, true)) {
            return;
        }

        try {
            System.out.println("Timer work started");
            Thread.sleep(12000);
            System.out.println("Timer work done");
        } finally {
            busy.set(false);
        }
    }

}

还有一些可能的变化,例如您可以将忙碌检查委托给拦截器,或者将仅包含布尔值的单例注入到计时器 bean 中,然后检查那里的布尔值,等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EJB @Schedule 等待方法完成 的相关文章

  • 方法返回类型前的 是什么意思?

    下面的方法返回一个List组成T类型元素 public
  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 如何更改 Swagger-ui URL 前缀?

    我正在使用 Springfox Swagger2 和 Spring boot 1 5 9 我可以通过此链接访问 swagger UI http localhost 8090 swagger ui html http localhost 80
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上

随机推荐

  • 包含闭包的 swift 函数的空返回值

    我创建了一个函数 该函数应该返回一个字典 其中填充了在线检索的数据 使用 json 基于 Ray Wenderlich tut 该代码位于闭包中 问题是首先返回一个空字典 然后才填充它 不知道这是否与获取远程数据的延迟有关 但显然我需要在返
  • Clang-Tidy 找不到我的头文件

    这里是 clang 和 clang tidy 的新手 我有一个具有这种结构的项目 project build cmake component1 src someFile cpp someFile2 cpp someFile hpp some
  • grunt-terser 给出语法错误:“VARIABLE_NAME”被重新声明

    我在用着咕噜语 https www npmjs com package grunt terser缩小我的 es6 文件 我有两个文件 文件1 js 文件2 js 在这两个文件中 我需要一个具有相同变量名称的模块 如下所示 const VAR
  • 如何使用group-concat mysql创建json格式?

    如何使用group concat mysql创建json格式 我使用MySQL 示例1 table1 email name phone email protected cdn cgi l email protection Ben 65553
  • OS X 崩溃日志符号

    我无法使用 XCode 4 6 来符号化来自测试人员和用户的 OS X 不是 iOS 崩溃日志 崩溃日志无法拖到管理器中 并且管理器不会显示 Library Logs DiagnosticReports 中的任何崩溃日志 尽管某些日志位于该
  • Linux/Windows 中的 C/C++ 内存使用 API

    我想获取每个进程和系统范围的内存使用信息 在 Windows 中 这非常简单 GetProcessMemoryInfo 和 GlobalMemoryStatusEx 可以非常轻松地完成这些工作 例如 GetProcessMemoryInfo
  • 有没有人找到一种方法来合并 Xcode 项目或 Core Data 模型文件中的更改?

    有没有办法使用 VCS 我正在使用 git 并让它与 Xcode 文件合并 例如 如果我的同事向项目添加了一个新组 当我合并他的更改时 我会合并该组吗 或者 如果他向核心数据实体添加一个属性 我会在我的核心数据模型中获得该属性吗 核心数据和
  • 无法在 Android Studio 中解析符号 HttpGet、HttpClient、HttpResponce

    我只是复制所有的jar文件Http but Android Studio无法导入所有这些 jar 文件 它给出一个错误 Cannot resolve symbol HttpGet HttpClient HttpResponse My Act
  • 浮点精度显示(Android)

    我正在尝试制作一个程序 它接受一些用户输入 运行一些计算并输出答案 我的问题是 这个答案有时会长很多小数位 这会导致一些美观和布局问题 我只需要显示小数点后 4 位的数据 是否有办法在输出时限制这些数字的精度 数字存储在浮点数中 我正在为
  • 如何创建可滚动的结果集?

    我得到了这个简单的代码来从 MSSQL Server 2008 检索记录集 由于我设置了 ResultSet TYPE SCROLL INSENSITVE 该记录集必须是可滚动的 与 Javadocs 中的示例相同 String qry S
  • 带有私有标识符参数的符号

    我想创建一个与私有 MethodMirror 的简单名称相同的符号 但是 Symbol 的文档指出 new Symbol 的参数必须是有效的公共标识符 如果我尝试创建一个const Symbol privateIdentifier dart
  • Python 浮点除法不精确[重复]

    这个问题在这里已经有答案了 可能的重复 Python float str 浮动怪异 https stackoverflow com questions 1778368 python float str float weirdness Pyt
  • Redis CLI 未通过 Laravel 显示最近存储的密钥

    我正在尝试使用缓存我的结果redis in Laravel通过做这个 result Cache remember orders cache 10 function use orders return orders return result
  • 我有一个 contentEditable="true" 的 div,需要对输入的数字进行着色

    这是我的代码 非常适合为可编辑 div 中的数字着色 但光标将转到 div 的开头 当我按键盘箭头按钮遍历字符串时 以及当我单击 home 和 end 按钮 光标应该按预期移动 jQuery document ready function
  • 具有数据成员语法的零成本属性

    我 重新 发明了这种使用数据成员语法实现零成本属性的方法 我的意思是用户可以写 some struct some member var var some struct some member 并且这些成员访问以零开销重定向到成员函数 虽然初
  • 对话框中标题分隔符的样式

    我想知道如何摆脱 或更改颜色 对话框中的标题分隔符 它是蜂窝设备上显示的对话框标题下方的一条蓝线 我猜这是 SDK 中的相关布局 但由于没有样式属性 我不知道如何设置它的样式 如果我尝试使用 findViewById 则没有 android
  • 使用 HTTPoison 初始化模块属性

    我正在尝试像这样初始化模块属性 response HTTPoison get url ok response Poison decode response body attr response 我以前用一个文件做过这样的事情 externa
  • 转换给定时区的日期/时间 - java

    我想将此 GMT 时间戳转换为 GMT 13 2011 10 06 03 35 05 我尝试了大约 100 种不同的 DateFormat TimeZone Date GregorianCalendar 等组合来尝试完成这个非常基本的任务
  • Android提供的onKey()、OnKeyDown()和dispatchKeyEvent()方法之间的区别?

    Android提供的onKey OnKeyDown 和dispatchKeyEvent 方法有什么区别 我想知道这些都可以在何时何地使用 请对此进行一些说明 追踪源代码5 1 视图类的源码 http grepcode com file re
  • EJB @Schedule 等待方法完成

    我想编写一个每分钟执行一次的后台作业 EJB 3 1 为此 我使用以下注释 Schedule minute 1 hour 工作正常 但是 有时该作业可能需要一分钟以上的时间 在这种情况下 计时器仍然会被触发 从而导致线程问题 如果当前执行未