当前位置: 首页 > news >正文

网站建设需要用到哪些软件有哪些品牌建设工作纪实

网站建设需要用到哪些软件有哪些,品牌建设工作纪实,新闻头条最新消息,用万网建设网站教程视频Quartz Scheduler是Java世界中最流行的调度库之一。 过去#xff0c;我主要在Spring应用程序中使用Quartz。 最近#xff0c;我一直在研究要在云中部署的JBoss 7.1.1上运行的JEE 6应用程序中的调度。 我考虑的一种选择是Quartz Scheduler#xff0c;因为它提供了与数据库的集… Quartz Scheduler是Java世界中最流行的调度库之一。 过去我主要在Spring应用程序中使用Quartz。 最近我一直在研究要在云中部署的JBoss 7.1.1上运行的JEE 6应用程序中的调度。 我考虑的一种选择是Quartz Scheduler因为它提供了与数据库的集群。 在本文中我将展示在JEE应用程序中配置Quartz并在JBoss 7.1.1或WildFly 8.0.0上运行它使用MySQL作为作业存储以及利用CDI在作业中使用依赖注入是多么容易。 所有这些都将在IntelliJ中完成。 让我们开始吧。 创建Maven项目 我使用org.codehaus.mojo.archetypes:webapp-javaee6原型来引导应用程序然后我稍微修改了pom.xml 。 我还添加了slf4J依赖项因此生成的pom.xml如下所示 project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdpl.codeleak/groupIdartifactIdquartz-jee-demo/artifactIdversion1.0/versionpackagingwar/packagingnamequartz-jee-demo/namepropertiesendorsed.dir${project.build.directory}/endorsed/endorsed.dirproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdjavax/groupIdartifactIdjavaee-api/artifactIdversion6.0/versionscopeprovided/scope/dependency!-- Logging --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.7/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-jdk14/artifactIdversion1.7.7/version/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion2.3.2/versionconfigurationsource1.7/sourcetarget1.7/targetcompilerArgumentsendorseddirs${endorsed.dir}/endorseddirs/compilerArguments/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-war-plugin/artifactIdversion2.1.1/versionconfigurationfailOnMissingWebXmlfalse/failOnMissingWebXml/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-dependency-plugin/artifactIdversion2.1/versionexecutionsexecutionphasevalidate/phasegoalsgoalcopy/goal/goalsconfigurationoutputDirectory${endorsed.dir}/outputDirectorysilenttrue/silentartifactItemsartifactItemgroupIdjavax/groupIdartifactIdjavaee-endorsed-api/artifactIdversion6.0/versiontypejar/type/artifactItem/artifactItems/configuration/execution/executions/plugin/plugins/build/project 接下来是将项目导入到IDE。 在我的情况下这是IntelliJ并使用JBoss 7.1.1创建运行配置。 值得注意的是在运行配置中的VM Options中我添加了两个变量 -Djboss.server.default.configstandalone-custom.xml -Djboss.socket.binding.port-offset100 standalone-custom.xml是标准standalone.xml的副本因为需要修改配置请参见下文。 配置JBoss服务器 在我的演示应用程序中我想将MySQL数据库与Quartz一起使用因此需要将MySQL数据源添加到我的配置中。 这可以通过两个步骤快速完成。 添加驱动程序模块 我创建了一个文件夹JBOSS_HOME/modules/com/mysql/main 。 在这个文件夹中我添加了两个文件 module.xml和mysql-connector-java-5.1.23.jar 。 模块文件如下所示 ?xml version1.0 encodingUTF-8? module xmlnsurn:jboss:module:1.0 namecom.mysql resources resource-root pathmysql-connector-java-5.1.23.jar/ /resources dependencies module namejavax.api/ /dependencies /module 配置数据源 在datasources子系统的standalone-custom.xml文件中我添加了一个新的数据源 datasource jtafalse jndi-namejava:jboss/datasources/MySqlDS pool-nameMySqlDS enabledtrue use-java-contexttrueconnection-urljdbc:mysql://localhost:3306/javaee/connection-urldrivercom.mysql/driversecurityuser-namejeeuser/user-namepasswordpass/password/security /datasource 和驱动程序 driversdriver namecom.mysql modulecom.mysql/ /drivers 注意就本演示而言数据源不是由JTA管理的以简化配置。 使用集群配置Quartz 我使用官方教程通过集群配置Quarts http : //quartz-scheduler.org/documentation/quartz-2.2.x/configuration/ConfigJDBCJobStoreClustering 将Quartz依赖项添加到pom.xml dependencygroupIdorg.quartz-scheduler/groupIdartifactIdquartz/artifactIdversion2.2.1/version /dependency dependencygroupIdorg.quartz-scheduler/groupIdartifactIdquartz-jobs/artifactIdversion2.2.1/version /dependency 将quartz.properties添加到src/main/resources # # Configure Main Scheduler Properties #org.quartz.scheduler.instanceName MyScheduler org.quartz.scheduler.instanceId AUTO# # Configure ThreadPool #org.quartz.threadPool.class org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount 1# # Configure JobStore #org.quartz.jobStore.class org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClassorg.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.useProperties false org.quartz.jobStore.dataSourceMySqlDSorg.quartz.jobStore.isClustered true org.quartz.jobStore.clusterCheckinInterval 5000org.quartz.dataSource.MySqlDS.jndiURLjava:jboss/datasources/MySqlDS 创建供Quartz使用MySQL表 可以在Quartz发行版中找到该模式文件 quartz-2.2.1\docs\dbTables 。 演示代码 完成配置后我想检查Quartz是否正常工作因此我创建了一个没有作业和触发器的调度程序。 package pl.codeleak.quartzdemo;import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.matchers.GroupMatcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.Singleton; import javax.ejb.Startup;Startup Singleton public class SchedulerBean {private Logger LOG LoggerFactory.getLogger(SchedulerBean.class);private Scheduler scheduler;PostConstructpublic void scheduleJobs() {try {scheduler new StdSchedulerFactory().getScheduler(); scheduler.start();printJobsAndTriggers(scheduler);} catch (SchedulerException e) {LOG.error(Error while creating scheduler, e);}}private void printJobsAndTriggers(Scheduler scheduler) throws SchedulerException {LOG.info(Quartz Scheduler: {}, scheduler.getSchedulerName());for(String group: scheduler.getJobGroupNames()) {for(JobKey jobKey : scheduler.getJobKeys(GroupMatcher.JobKeygroupEquals(group))) {LOG.info(Found job identified by {}, jobKey);}}for(String group: scheduler.getTriggerGroupNames()) {for(TriggerKey triggerKey : scheduler.getTriggerKeys(GroupMatcher.TriggerKeygroupEquals(group))) {LOG.info(Found trigger identified by {}, triggerKey);}}}PreDestroypublic void stopJobs() {if (scheduler ! null) {try {scheduler.shutdown(false);} catch (SchedulerException e) {LOG.error(Error while closing scheduler, e);}}} } 运行应用程序时您应该能够从Quartz中看到一些调试信息 Scheduler class: org.quartz.core.QuartzScheduler - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool org.quartz.simpl.SimpleThreadPool - with 1 threads.Using job-store org.quartz.impl.jdbcjobstore.JobStoreTX - which supports persistence. and is clustered.让Quartz利用CDI 在Quartz中作业必须实现org.quartz.Job接口。 package pl.codeleak.quartzdemo;import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException;public class SimpleJob implements Job {Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {// do something} } 然后使用JobBuilder创建一个Job JobKey job1Key JobKey.jobKey(job1, my-jobs); JobDetail job1 JobBuilder.newJob(SimpleJob.class).withIdentity(job1Key).build(); 在我的示例中我需要将EJB注入到我的作业中以便重新使用现有的应用程序逻辑。 因此实际上我需要注入EJB参考。 Quartz如何做到这一点 简单。 Quartz Scheduler有一种提供JobFactory的方法该方法将负责创建Job实例。 package pl.codeleak.quartzdemo;import org.quartz.Job; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.spi.JobFactory; import org.quartz.spi.TriggerFiredBundle;import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject; import javax.inject.Named;public class CdiJobFactory implements JobFactory {InjectAnyprivate InstanceJob jobs;Overridepublic Job newJob(TriggerFiredBundle triggerFiredBundle, Scheduler scheduler) throws SchedulerException {final JobDetail jobDetail triggerFiredBundle.getJobDetail();final Class? extends Job jobClass jobDetail.getJobClass();for (Job job : jobs) {if (job.getClass().isAssignableFrom(jobClass)) {return job;}}throw new RuntimeException(Cannot create a Job of type jobClass);} } 到目前为止所有作业都可以使用依赖项注入和注入其他依赖项包括EJB。 package pl.codeleak.quartzdemo.ejb;import org.slf4j.Logger; import org.slf4j.LoggerFactory;import javax.ejb.Stateless;Stateless public class SimpleEjb {private static final Logger LOG LoggerFactory.getLogger(SimpleEjb.class);public void doSomething() {LOG.info(Inside an EJB);} }package pl.codeleak.quartzdemo;import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import pl.codeleak.quartzdemo.ejb.SimpleEjb;import javax.ejb.EJB; import javax.inject.Named;public class SimpleJob implements Job {EJB // Inject will work tooprivate SimpleEjb simpleEjb;Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {simpleEjb.doSomething();} } 最后一步是修改SchedulerBean package pl.codeleak.quartzdemo;import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.matchers.GroupMatcher; import org.quartz.spi.JobFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.inject.Inject;Startup Singleton public class SchedulerBean {private Logger LOG LoggerFactory.getLogger(SchedulerBean.class);private Scheduler scheduler;Injectprivate JobFactory cdiJobFactory;PostConstructpublic void scheduleJobs() {try {scheduler new StdSchedulerFactory().getScheduler();scheduler.setJobFactory(cdiJobFactory);JobKey job1Key JobKey.jobKey(job1, my-jobs);JobDetail job1 JobBuilder.newJob(SimpleJob.class).withIdentity(job1Key).build();TriggerKey tk1 TriggerKey.triggerKey(trigger1, my-jobs);Trigger trigger1 TriggerBuilder.newTrigger().withIdentity(tk1).startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10)).build();scheduler.scheduleJob(job1, trigger1);scheduler.start();printJobsAndTriggers(scheduler);} catch (SchedulerException e) {LOG.error(Error while creating scheduler, e);}}private void printJobsAndTriggers(Scheduler scheduler) throws SchedulerException {// not changed}PreDestroypublic void stopJobs() {// not changed} } 注意在运行应用程序之前将bean.xml文件添加到WEB-INF目录。 ?xml version1.0 encodingUTF-8? beansxmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsdbean-discovery-modeall/beans 现在您可以启动服务器并观察结果。 首先创建作业和触发器 12:08:19,592 INFO (MSC service thread 1-3) Quartz Scheduler: MyScheduler 12:08:19,612 INFO (MSC service thread 1-3) Found job identified by my-jobs.job1 12:08:19,616 INFO (MSC service thread 1-3) Found trigger identified by m 我们的工作正在运行大约每10秒运行一次 12:08:29,148 INFO (MyScheduler_Worker-1) Inside an EJB 12:08:39,165 INFO (MyScheduler_Worker-1) Inside an EJB 还要查看Quartz表内部您将看到其中已填充数据。 测试应用 我要检查的最后一件事是在多个实例中如何触发作业。 为了进行测试我只是在IntelliJ中克隆了两次服务器配置并为每个新副本分配了不同的端口偏移。 我需要做的其他更改是修改作业和触发器的创建。 由于所有Quartz对象都存储在数据库中因此创建相同的作业和触发器使用相同的键将引发异常 Error while creating scheduler: org.quartz.ObjectAlreadyExistsException: Unable to store Job : my-jobs.job1, because one already exists with this identification. 我需要更改代码以确保如果作业/触发器存在请对其进行更新。 此测试的scheduleJobs方法的最终代码为同一作业注册了三个触发器。 PostConstruct public void scheduleJobs() {try {scheduler new StdSchedulerFactory().getScheduler();scheduler.setJobFactory(cdiJobFactory);JobKey job1Key JobKey.jobKey(job1, my-jobs);JobDetail job1 JobBuilder.newJob(SimpleJob.class).withIdentity(job1Key).build();TriggerKey tk1 TriggerKey.triggerKey(trigger1, my-jobs);Trigger trigger1 TriggerBuilder.newTrigger().withIdentity(tk1).startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10)).build();TriggerKey tk2 TriggerKey.triggerKey(trigger2, my-jobs);Trigger trigger2 TriggerBuilder.newTrigger().withIdentity(tk2).startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10)).build();TriggerKey tk3 TriggerKey.triggerKey(trigger3, my-jobs);Trigger trigger3 TriggerBuilder.newTrigger().withIdentity(tk3).startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10)).build();scheduler.scheduleJob(job1, newHashSet(trigger1, trigger2, trigger3), true);scheduler.start();printJobsAndTriggers(scheduler);} catch (SchedulerException e) {LOG.error(Error while creating scheduler, e);} } 除了上述内容之外我还添加了在SimpleJob中记录JobExecutionContext的信息因此可以更好地分析结果。 Override public void execute(JobExecutionContext context) throws JobExecutionException {try {LOG.info(Instance: {}, Trigger: {}, Fired at: {},context.getScheduler().getSchedulerInstanceId(),context.getTrigger().getKey(),sdf.format(context.getFireTime()));} catch (SchedulerException e) {}simpleEjb.doSomething(); } 运行所有三个服务器实例后我观察了结果。 工作执行 我观察到在所有三个节点上都执行trigger2并且在三个节点上执行了trigger2如下所示 Instance: kolorobot1399805959393 (instance1), Trigger: my-jobs.trigger2, Fired at: 13:00:09 Instance: kolorobot1399805989333 (instance3), Trigger: my-jobs.trigger2, Fired at: 13:00:19 Instance: kolorobot1399805963359 (instance2), Trigger: my-jobs.trigger2, Fired at: 13:00:29 Instance: kolorobot1399805959393 (instance1), Trigger: my-jobs.trigger2, Fired at: 13:00:39 Instance: kolorobot1399805959393 (instance1), Trigger: my-jobs.trigger2, Fired at: 13:00:59 对于其他触发器类似。 复苏 断开kolorobot1399805989333instance3的连接后一段时间后我在日志中看到以下内容 ClusterManager: detected 1 failed or restarted instances. ClusterManager: Scanning for instance kolorobot1399805989333s failed in-progress jobs. 然后我断开了kolorobot1399805963359instance2的连接这也是我在日志中看到的内容 ClusterManager: detected 1 failed or restarted instances. ClusterManager: Scanning for instance kolorobot1399805963359s failed in-progress jobs. ClusterManager: ......Freed 1 acquired trigger(s). 到目前为止由kolorobot1399805959393instance1执行的所有触发器 在Wildfly 8上运行 无需任何更改我就可以在WildFly 8.0.0上部署相同的应用程序。 与JBoss 7.1.1相似我添加了MySQL模块WildFly 8上modules文件夹的位置不同– modules/system/layers/base/com/mysql/main 。数据源和驱动程序的定义与上图完全相同。我为WildFly 8创建了运行配置 然后我运行该应用程序结果与JBoss 7相同。 我发现WildFly似乎为持久EJB计时器提供了基于数据库的存储 但是我尚未对其进行调查。 也许是另一篇博客文章的内容。 源代码 请在GitHub上找到此博客文章的源代码 https : //github.com/kolorobot/quartz-jee-demo 翻译自: https://www.javacodegeeks.com/2014/05/how-to-quartz-scheduler-with-clustering-in-jee-application-with-mysql.html
http://www.sadfv.cn/news/76576/

相关文章:

  • 江门市建设工程投标网站郑州西区做网站
  • 南昌网站设计怎么选企业名录搜索软件免费
  • 什么网站能找到做展览的工人做哪种网站流量上的快
  • 学会wordpress建站厦门成交型网站建设公司
  • wordpress可以做淘宝网站建设优化解析
  • 阿里巴巴网站建设分析做网站的用什么软件呢
  • 公司网站建设管理制度网站申请微信支付接口
  • 上传网站安装教程视频wordpress大前端主题怎么样
  • 教育网站开发方案一个人0资金怎么创业
  • 网站设计模板网站静态单页网站wordpress
  • 个人网站的设计和建设男做基视频网站
  • 西宁建设公司网站潍坊网站建设8年
  • 建立网站怎么搞做套现网站
  • 手机版网站模板 免费下载劳务派遣许可证
  • 电商网站建设在哪里找设计师兰州市城市建设设计院
  • 如何写作网站网站建设方案书阿里云模板
  • 网站排名不稳定怎么办三生团队网站找谁做的
  • 试述网站建设的流程石家庄24号解封通知
  • 彩票网站链接怎么做网站没排名怎么办
  • 网站建设不用备案的网站追踪如何做
  • 网站开发商问花店老板北京市建设教育协会网站
  • 山西利用模板建站外贸网站论文
  • 制作营销网站公司烟台网站建设哪家便宜
  • 网站地图插件南京建网站公司
  • 3月网站备案白名单箱包 东莞网站建设
  • 浙江省建设行政主管部门网站营销型外贸网站定制
  • 手机怎么创网站免费下载新开传奇网站站
  • 广 做网站蓝光电影下载28创业商机网
  • 企业的网站建设策划书遵义网约车平台
  • 做汽车英文网站中国房地产app下载安装最新版