java ee的小程序_Java EE调度程序

java ee的小程序

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

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

Java EE调度程序可以是:

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

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

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

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

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

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

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

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

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

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

如何选择?

如果调度的功能对业务至关重要,而我们不能错过任何事件,那么持久调度器就是您的理想之选。

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

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

java ee的小程序

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

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

相关文章

MyEclipse for Mac快捷键

文章目录编辑查询/替换导航调试重构其他编辑 快捷键功能说明Command1快速修复,比如与Syso配合,与main配合可快速构造方法签名(最经典的快捷键,就不用多说了,可以解决很多问题,比如import类、try catch包围等&#xff…

不同坐标系下角速度_最伟大的数学发明,坐标系的诞生,是人类史上的方向盘...

【想要了解更多精彩文章、视频,欢迎关注创鹏科学堂】人生最大的意义,莫过于过得更方便;数学最大的意义,莫过于帮助人类过得更方便。几千年来,自从数学出现之后,它就一直以人类生活为导向,以宇宙…

c++ double 截取_c选择double小数点后自动截取3位,不...

2016-09-01 01:05辛培兵 客户经理printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是用%c 符号.这些符号被称为转换说明&#…

dynamodb分页查询_使用DynamoDBMapper查询DynamoDB项目

dynamodb分页查询在上一篇文章中,我们使用底层Java api在DynamoDB数据库上发出了查询。 使用DynamoDBMapper进行查询非常简单。 使用哈希键发出查询非常简单。 这样的查询的最佳候选者是通过使用电子邮件哈希键进行搜索的Users表。 public User getUser(String e…

python字典编码_python中包含UTF-8编码中文的列表或字典的输出

>>> dict {"asdf": "我们的python学习"} >>> print dict {asdf: \xe6\x88\x91\xe4\xbb\xac\xe7\x9a\x84python\xe5\xad\xa6\xe4\xb9\xa0} 在输出处理好的数据结构的时候很不方便,需要使用以下方法进行输出: >…

php中的ol标签,html5中ol标签的用法详解

这篇文章主要介绍了详解HTML5中ol标签的用法,是HTML5入门学习中的基础知识,需要的朋友可以参考下定义和用法标签定义有序列表。HTML 4.01 与 HTML 5 之间的差异在 HTML 4.01 中,不赞成使用 "start" 属性,在 HTML 5 中是允许的。在 HTML 4.01 中…

portlet_平台策略:从Portlet到OpenSocial小工具再到渐进式Web应用程序:最新技术

portlet介绍 由于世界仍在Java的掌控之中,因此我们经常定义所谓的基于组件的平台 。 我在2000年拥有OpenUSS(开放大学支持系统)的经验。 当时我有一个想法,就是开发一个可以使用组件体系结构和J2EE技术​​( OpenUSS C…

MySQL JDBC URL各参数详解

通常MySQL连接URL可以设置为: jdbc:mysql://localhost:3306/test?userroot&password123456&useUnicodetrue&characterEncodinggbk &autoReconnecttrue&failOverReadOnlyfalse&serverTimezoneUTC&drivercom.mysql.cj.jdbc.Driver注&am…

keil5函数 默认返回值_C++ 函数的定义

“ C对于函数的基本用法”01—函数的定义//函数声明:[返回值类型] [函数名称] (参数列表)int Function(int a, int b);//函数定义int Function(int a, int b){ //函数体 return a b;}02—函数的默认参数定义函数时可以在参数列表中为形参指定默认值int Function2…

apc php7,深入解析php之apc

apc定义:apc是一个开放自由的php opcode缓存。它的目标是提供一个自由、开放和健全的框架,用于缓存和优化php中间代码。apc常用函数:1.apc_clear_cache() 清楚apc缓存内容2.apc_define_constants(string key,array constants,[,bool case_sen…

Apache NetBeans?

在JavaOne之前的几天和几周内发布有关Java世界的重要公告是很常见的。 考虑到这一点,不足为奇的是,我们在下周开始的JavaOne 2016之前看到了一些与Java有关的重要公告。 马克莱因霍尔德 ( Mark Reinhold )的JDK 9计划变更提案是一…

已经创建了AWS EC2实例,Linux系统默认没有root用户,那么如何创建root用户并更改为root用户登录呢?

文章目录1. 如何创建ROOT及设置密码2.更改登陆方式,采用ROOT用户登陆a. 编辑EC2实例的ssh登录方式b. 再编辑authorized_keys文件,将ssh-rsa 前面的文字全部删除,确保ssh-rsa没有任何文字,包括空格。3. 重新登陆对于刚创建AWS EC2实…

输入一个正整数求所有素数因子_一起来聊聊素数的两个性质

素数(prime number),又称质数,有无限个。定义:在大于1的自然数中,除了1和它本身以外不再有其他因数。来介绍两个简单的性质:质数的个数是无穷的。欧几里得的《几何原本》曾有一经典证明,用的是反证法。当然…

基于docker微服务架构_使用基于微服务的流架构更好地进行大规模的复杂事件处理(第1部分)...

基于docker微服务架构基于微服务的流架构与开源规则引擎相结合,使实时业务规则变得容易 这篇文章旨在详细介绍我将OSS业务规则引擎与Kafka风格的现代流消息传递系统集成在一起的项目。 该项目的目标(即众所周知的复杂事件处理(CEP&#xff0…

php怎样下载网上的文件,php怎样实现文件下载

用head() 和 fread()函数把文件直接输出到浏览器。具体代码&#xff1a;<?php $file_name "down";$file_name "down.zip"; //下载文件名$file_dir "./down/"; //下载文件存放目录//检查文件是否存在if (! file_exists ( $file_dir . $fil…

Windows 系统下,移动硬盘无法识别怎么修复?

方案1&#xff1a;移动硬盘没有驱动器号 有时移动硬盘插入计算机&#xff0c;但无法在我的计算机上显示。此时&#xff0c;可能只是因为移动硬盘没有驱动器号。 右键单击此计算机&#xff08;计算机&#xff09;&#xff0c;然后单击[管理]将其打开。 点击左边的[磁盘管理]&a…

欢乐鼠标自动点击器_使用ESP32 DIY蓝牙自动点击器,滑屏器

前言因为爱薅羊毛&#xff0c;然后正好最近免费车一趟接一趟&#xff0c;咪咕开完&#xff0c;京东开&#xff0c;京东开完掌阅开&#xff0c;下一个不知道是谁&#xff0c;&#xff0c;&#xff0c;&#xff0c;可我又不是什么很有耐心的人&#xff0c;虽然我喜欢看书&#xf…

java单词按字典排序_最终Java日志字典:开发人员最常记录的单词是什么?

java单词按字典排序最终的记录字典&#xff0c;或者&#xff1a;我们记录的最常见单词是什么&#xff1f; 日志文件是调试应用程序的最常用方法&#xff0c;当解决错误时&#xff0c;它们肯定可以引导我们朝正确的方向发展。 但是&#xff0c;大多数日志文件每天都会增加一百万…

winscp使用密钥登录远程linux系统

说明&#xff1a; WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时putty也是一个开源连接ssh的windows客户端&#xff0c;本文介绍puttyWinSCP密钥对登录linux服务器。 1. 创建密钥对 安装openssl yum –y install openssl #openssl一般服务器都会预装 创建密…