Java EE调度程序

Java EE应用程序服务器具有本机调度支持,并且在大多数应用程序中,不需要包括外部依赖项,例如著名的Quartz调度程序库。

Java EE 6和7完整配置文件中提供的Java EE 6计时器服务为我们提供了许多选项来定义调度间隔,以及如果停止并重新启动包含调度程序的应用程序会发生什么情况。

Java EE调度程序可以是:

  • 持久的 :应用程序服务器在应用程序关闭时保存计划事件,以免丢失事件
  • 自动 :简单的调度程序定义,大多数细节由应用程序服务器处理
  • 程序化的 :我们可以完全控制所有调度程序参数。

为了确定哪个是最佳选择,我们应该首先回答以下问题:

1.是否可以错过一些调度事件?

如果我们停止或重新启动应用程序(例如在更新过程中),则调度程序将停止,并且某些调度事件可能会丢失。

可以将调度程序配置为保存错过的事件,并在应用程序再次启动时执行它们。 应用程序服务器使用内部数据库(通常是Derby之类的Java DB)来存储丢失的事件。

这是一个持久的调度程序。

注意 :应用程序服务器将在应用程序(重新)启动时生成所有丢失的事件。 事件突发的频率和延迟是可配置的。 有关详细信息,请参见应用程序服务器文档。

我们还可以选择不保留计划事件,如果应用程序未运行,则计划事件将丢失。

在非持久性情况下,调度程序生命周期与应用程序相同:它在应用程序启动时创建,然后在应用程序关闭时销毁。

相反,持久性调度程序可以保留到应用程序重新启动; 当应用程序未运行时,它只是在休眠。

如何选择?

如果计划的功能对业务至关重要,并且我们不能错过任何事件,那么持久性计划程序就是您的理想之选。

在所有其他情况下,非持久性调度程序更轻便(不使用数据库)并且易于管理(更新应用程序时的障碍更少,因为在应用程序重新启动时不会出现调度事件;在应用程序启动时始终会创建新的调度程序)。

2.该应用程序将在群集中运行吗?

在集群中,我们的应用程序有多个实例正在运行(每个集群节点一个实例),并且所有实例都有自己的调度程序副本。

但是我们只需要在所有群集节点之间运行一个调度程序,否则我们将拥有同一事件的多个副本。

每个应用程序服务器都有自己的方式来处理“多个调度程序实例”问题(例如,请参阅WebSphere的[link 2]),但是通常,当我们使用集群时,要求调度程序应该是持久的。

3.调度间隔在生产时是否可以编程?

要回答的另一个重要问题:在部署应用程序后,我们是否应该能够更改调度?

如果调度参数(它的频率)是固定的,则自动调度程序是最佳解决方案,因为它的编码非常简单:只需一个注释(如果您喜欢旧方法,则可以少写XML行)。

相反,如果调度程序应该以某种方式可配置,则最好的解决方案是编程调度程序,它使我们能够在应用程序启动期间定义所有调度程序参数,并从属性文件,数据库或我们正在使用的任何配置解决方案中读取它们。

记得:

  • 自动调度程序计划是在构建时定义的
  • 在应用程序启动时定义了程序化调度程序计划

自动排程器

定义自动调度程序非常容易:

  1. 创建在启动时执行的单例EJB
  2. 创建一个将在每次调度事件时调用的方法

注意:完整的代码可以在文章项目中找到[请参见链接3]。

第一步:

@Startup
@Singleton
public class MyScheduler

@ javax.ejb.Startup批注要求EJB容器在应用程序启动时创建EJB(以及我们的调度程序)。

@ javax.ejb.Singleton批注强制EJB容器仅创建一个实例。

重要提示:调度程序由应用程序服务器(EJB容器)使用; 应用程序代码的其余部分永远不要实例化它。

然后,我们需要在安排事件时调用的方法:

@Schedule(/** scheduling parameters */)
public void doSomeThing() {..}

该方法应为public,并返回void。

@ javax.ejb.Schedule注释定义:

  • 计划间隔,以cron格式[请参见链接4]
  • 调度程序的名称(应用程序中可以有许多调度程序)
  • 一个持久的布尔标志,它定义调度程序是否持久

例如:

@Schedule(minute = "*/15",hour = "*",info = "15MinScheduler",persistent = false )

它定义了每15分钟运行一次的非持久性调度程序。

有关完整示例,请参见文章项目[链接3]中的AutomaticPersistentSchedulerAutomaticNonPersistentScheduler类。

注意 :还有@Schedules批注[请参见链接1],该批注允许定义多个@Schedule定义。

当存在无法在单个cron定义中表达的计划要求时,此功能很有用。

程序调度器

程序化调度程序的构建更为复杂,但是它为我们提供了定义调度程序参数的完全自由。

我们还有更多步骤:

  1. 创建在启动时执行的单例EJB
  2. 查找TimerService资源
  3. 在EJB初始化时创建调度程序
  4. 创建一个@Timeout方法

第一步与自动调度程序相同:

@Startup
@Singleton
public class MyScheduler

然后(第二步),我们需要查找应用程序服务器计时器服务,但是注入可以帮助我们:

@Resource
private TimerService timerService;

在应用程序启动时,EJB容器将注入一个TimerService实例,该实例允许我们与Timer服务进行交互。 例如,我们可以列出(甚至删除)为应用程序定义的所有调度程序。

在我们的例子中,Timer服务将用于创建新的调度程序,如下所示(第三步):

String minuteSchedule = "*/15";
String hourSchedule = "*";
ScheduleExpression schedule = new ScheduleExpression().minute(minuteSchedule).hour(hourSchedule);

javax.ejb.ScheduleExpression定义cron [参见链接4]时间表,例如@Schedule批注。

@ScheduleScheduleExpression之间非常重要的区别在于,第一个固定在构建时:要更改调度参数(例如,从每15分钟更改为每30分钟),我们需要更改类代码,然后再次构建和部署应用程序。

在后一种情况下(SchedulerExpression),可以在应用程序启动时定义和更改计划参数(在示例中变量minutesSchedule和hourSchedule上方)并进行更改,例如,从以下示例中读取minutesSchedule和hourSchedule:
属性文件或连接的DBMS。

TimerConfig timerConfig = new TimerConfig();
timerConfig.setInfo("ProgrammaticPersistentScheduler");
timerConfig.setPersistent(true);

javax.ejb.TimerConfig让我们可以选择定义调度程序的名称(setInfo(String)),以及是否为持久性名称(setPersistent(boolean))。

通过使用ScheduleExpression和TimerConfig实例,我们可以使用Timer服务创建调度程序(更精确地说是日历计时器)。

timerService.createCalendarTimer(schedule, timerConfig);

createCalendarTime()方法返回一个javax.ejb.Timer实例,该实例可用于查询计时器,例如下一个将来的事件何时发生甚至破坏。
调度程序。

最后一步是在类中定义一个方法,该方法将在每次调度事件时调用

@Timeout
public void doSomeThing() {..}

该方法应为public,并返回void。

我们已经启动并运行了调度程序。

结论

Java EE标准为我们提供了许多选择来定义计划程序,该计划程序以周期性和重复的方式运行我们的代码。 不需要其他项目依赖项。

链接

  1. 计时器服务API上的Oracle Java EE6教程
  2. IBM WebSphere 8.x使用EJB计时器服务为企业bean创建计时器
  3. GitHub上的文章项目
  4. Cron在Wikipedia上

翻译自: https://www.javacodegeeks.com/2016/10/java-ee-schedulers.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Simulink工作区无法保存To workspace模块的数据解决办法

1.首先要搞清楚Workspace概念。包括基本工作区(base workspace)和函数工作区。默认条件下在命令窗口中输入命令使用的是base workspace,但对于每个函数,都有自己独立的工作区。 2.GUI回调函数作为function有独立的工作区。 3.使…

对KVM虚拟机进行cpu pinning配置的方法

这篇文章主要介绍了对KVM虚拟机进行cpu pinning配置的方法,通过文中的各种virsh命令可进行操作,需要的朋友可以参考下首先需求了解基本的信息1 宿主机CPU特性查看 使用virsh nodeinfo可以看到一些基本信息 #virsh nodeinfo CPU model: x86_64 CPU(s): 32 CPU frequency: 1200 M…

1千条数据平均分配给15人_5项数据挂零!但5犯太吓人!CBA第1狠人场均干1人

昨天CBA常规赛第26轮:山东西王89-86北京首钢。上半场,双方打得非常激烈,比分交替领先。第3节北京抓住机会,顺势拉开比分(68-57)。李慕豪接方硕助攻,轻松扣篮得分。首钢替补席一片欢声笑语,方巨头和翟晓川笑…

redhat/centos 搭建svn服务器环境

subversion支持3种服务配置1、apache mod_dav_svn2、svnserve 3、穿越ssh隧道的svnserve教程选择的是最简单的svnserve的服务1、安装svnservyum install subversion2、建立一个仓库 respository$ mkdir /home/svn$ mkdir /home/code$ svnadmin create /home/svn/repository3、…

win10插入耳机没声音解决办法

之前重装了win10系统,装完系统后,发现插入耳机没有声音,非常令人难受!经过一番探索,终于解决了这个问题,在此与大家分享。 1.点击左下角搜索框,输入控制面板,点击enter打开 2.打开…

js如何获取服务器端时间?

用js做时间校正,获取本机时间,是存在bug的。 使用js也可获取到服务器时间,原理是使用 ajax请求,返回的头部信息就含有服务器端的时间信息,获取到就可以了。以下: 1、依赖jQuery 代码: function …

java 堆转储快照_Java堆转储:您可以完成任务吗?

java 堆转储快照如果您像我一样对Java性能充满热情,那么堆转储分析对您来说应该不是一个谜。 如果是这样,那么好消息是您将有机会增加您的Java故障排除技能和JVM知识。 JVM现在已经发展到这样的程度:与旧的JDK 1.0 – JDK 1.4天相比&#xf…

电池供电的电容麦_太阳能航空障碍灯供电机制设计

南京徐航航空设备有限公司是以产销GPS航空障碍灯,led航空障碍灯,LED智能航空障碍灯,交流航空障碍灯,航空障碍灯品牌,智能型航空障碍灯,GPS航空障碍灯,led航空障碍灯,LED智能航空障碍灯,交流航空障碍灯,航空障碍灯品牌,智能型航空障碍灯等方面产品获得民航认证航空障碍灯品牌,是…

simulink如何从goto模块快速找到相应的from模块

有时候,Simulink搭建的模型中模块过多,很难找到goto模块所对应的from模块。下面将举例说明如何从goto模块快速找到相应的from模块。 方法1 双击goto模块会弹出下图图框,点击图框的链接即可找到对应的from模块。如下图所示。 对应的from模块…

aac fhg lc哪一个模式_旅游没电别发愁,一个充电头,助你游遍全球

我朋友汪伦。最近在计划出国旅游,我问他都准备了啥,他说根据网上的攻略,带了现金泡面老干妈还有一万个充电宝。现金我懂,国外还没普及扫码支付;泡面是怕外国菜吃不惯;老干妈是夹汉堡吃的;一万个…

11 字节码执行

转载于:https://www.cnblogs.com/likevin/p/10183151.html

在Junit上使用Kafka

除了在原始Kafka Producer和Consumer上更易于使用的抽象之外,优秀的Spring Kafka项目提供的简洁功能之一是在测试中使用Kafka的方法。 它通过提供可轻松设置和拆卸的Kafka嵌入式版本来实现此目的。 一个项目需要包括此支持的全部就是“ spring-kafka-test”模块&am…

补码原理一个字节存储数值的范围如何计算

为什么二进制负数在计算机中的存储需要使用补码?一个字节存储数值范围为什么是-128~127?下面我们开始学习。 1.了解补码 什么是原码、反码和补码?负数在计算机中的二进制表示是怎样的?(戳这里查看) 2.补…

laravel API开发,使用dingo/api

1、composer添加 "dingo/api": "1.0.*dev" composer require dingo/api:1.0.xdev2、配置文件app.php添加注册 Dingo\Api\Provider\LaravelServiceProvider::class,3、添加自定义配置(此时会在配置文件中生成api.php) php artisan ve…

【SVN】代码提交备注规范

一、格式 <type>: <subject> 例如 fix&#xff1a;解决用户点击登录无响应的问题 二、详细说明 1、type &#xff1a;用于说明提交类型 feat - 增加新功能、新需求 fix - 修复bug, 可以是测试发现的bug, 也可以是研发自己发现的bug style - 不影响…

StarUML使用说明-指导手册

StarUML使用说明-指导手册 原著&#xff1a;Stephen Wong 翻译&#xff1a;火猴 1.综述 StarUML是一种生成类图和其他类型的统一建模语言(UML)图表的工具。这是一个用Java语言描述的创建类图的简明手册。 StarUML(简称SU)&#xff0c;是一种创建UML类图&#x…

elif else if oracle_关于Oracle if elsif else

昨天被一同事问一问题&#xff0c;问题就是Oracle存储过程中的IF逻辑块告诉他大概是这样&#xff1a;create or replace procedure testIfElsif (numb number) ISbeginif numb 1 thenDBMS_OUTPUT.put_line(1);else if numb 2 thenDBMS_OUTPUT.put_line(2);elseDBMS_OUTPUT.pu…

自相关函数互相关函数

这个是信号分析里边的概念。为比较某信号与另一延时的信号之间的相似度&#xff0c;需要引入相关函数的概念。相关函数是鉴别信号的有力工具&#xff0c;被广泛应用于雷达回波的识别&#xff0c;通信同步信号的识别等领域。相关函数 也称为相关积分&#xff0c;它与卷积的运算方…

php 加密解密函数封装

算法一&#xff1a;  //加密函数 function lock_url($txt,$keyyang) {$chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-";$nh rand(0,64);$ch $chars[$nh];$mdKey md5($key.$ch);$mdKey substr($mdKey,$nh%8, $nh%87);$txt base64_e…

visio画uml类图添加自定义数据类型

类图&#xff08;Class Diagram&#xff09;: 类图是面向对象系统建模中最常用和最重要的图&#xff0c;是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。 类图的3个基本组件&#xff1a;类名、属性、方法。 1、打开vis…