使用SPANN方式將Spring&Quartz與自定義注釋集成

在上一篇文章中 ,我們演示了如何在Spring容器中創建和配置帶批注的Quartz作業。 我們使用了一個類級別的注釋將一些元數據添加到實現Quartz Job的bean中。 批注定義了作業的名稱,組及其cron表達式。 后來,大部分代碼專用于處理該批注:查找Bean,讀取批注,創建JobDetailCronTrigger ,應用它們的屬性并將它們傳遞給調度程序。

如果您正在從事中等規模的大型Spring項目,那么您可能很快就會開始看到樣板配置和代碼,可以通過將其封裝在批注中來進行重構; @QuartzJob注釋是一個很好的例子。

在masetta中,我們嘗試使用Polyforms項目使用注釋來實現DAO方法(該方法通常由圍繞JPA查詢的一些樣板代碼組成)。 很快,我們發現它并沒有像我們所需要的那樣可配置和可擴展,在處理命名查詢參數和初始化順序問題方面存在問題(因為Polyforms如何使用方面來實現抽象方法)。 此外,我們使用了自定義注釋并“手動”處理了它們,但是它們的數量太多了……

我們想到的是span 。 Spann是spring框架的開源擴展,它允許使用注釋對spring bean進行高級配置。 為了窺探spann的功能之一,我將依靠我們之前的文章并實現類似的功能。 我將使用spann而不是編碼。 如您所見,實現非常簡短。

總覽

該代碼使用Spring的本地Quartz調度實現(如spring參考中所述 )。 Spring的MethodInvokingJobDetailFactoryBean用于創建JobDetail bean,它將作業執行委托給另一個bean的方法。 作為觸發器,我使用spring的CronTrigger實現。

為了創建和配置JobDetailCronTrigger Bean,我將使用spann的@BeanConfig注釋創建方法級別的注釋。

編碼

可以使用以下命令將示例代碼作為跨項目的Maven項目檢出:

svn co http://spann.googlecode.com/svn/trunk/spann-quartz-example

它包括一個帶有所有必需的依賴項坐標的pom和一個功能測試用例。

1.創建注釋以配置MethodInvokingJobDetailFactoryBean

package com.masetta.spann.quartzexample.annotations;import java.lang.annotation.*;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import com.masetta.spann.metadata.common.Artifact;
import com.masetta.spann.spring.base.beanconfig.*;
import com.masetta.spann.spring.base.beanconfig.factories.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@BeanConfig(create=MethodInvokingJobDetailFactoryBean.class,attached=@Attached(role="quartzJob",scope=Artifact.METHOD),explicit=true,wire={@WireMeta(property="targetObject",scope=Artifact.CLASS,factory=BeanReferenceFactory.class),@WireMeta(property="targetMethod",scope=Artifact.METHOD,factory=MetadataNameFactory.class)})
public @interface QuartzJob {String name();String group();boolean concurrent() default true;}

@BeanConfig注釋創建和使用QuartzJob的注釋的屬性( 名稱并發 )配置一個MethodInvokingJobDetailFactoryBean中

已配置的bean通過“ quartzJob ”角色“附加”到帶注釋的方法。 稍后將使用它來將JobDetail bean注入觸發器。 “連接”是內部跨度概念。 它允許通過指定工件(例如類或方法)和語義角色(此處為“ quartzJob”)而不是按名稱來引用Bean。 這將啟用spanning最強大的功能注釋合成 ,此處也將進行演示。

wire屬性使用給定工廠從當前工件的元數據 (在本例中為MethodMetadata ), ScanContext和Annotation填充的值設置targetObjecttargetMethod屬性。

2.創建一個cron觸發器注釋

package com.masetta.spann.quartzexample.annotations;import java.lang.annotation.*;
import org.springframework.scheduling.quartz.CronTriggerBean;
import com.masetta.spann.metadata.common.Artifact;
import com.masetta.spann.spring.base.beanconfig.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@BeanConfig(create=CronTriggerBean.class,attached=@Attached(role="quartzTrigger",scope=Artifact.METHOD), explicit=true,references=@SpannReference(property="jobDetail",role="quartzJob", scope=Artifact.METHOD)
)
public @interface Cron {String cronExpression();String timeZone() default "";String misfireInstructionName() default "";String[] triggerListenerNames() default {}; }

再次使用@BeanConfig批注,這次創建和配置CronTriggerBean

顯式屬性指示如何處理默認的注釋屬性值。 當explicit為true時,默認屬性值將被忽略。 例如, 時區 ,所述CronTriggerBeanmisfireInstructionNametriggerListenerNames屬性將僅在相應的注解的屬性值集合; 默認值將被靜默忽略。

使用references屬性,將jobDetail屬性設置為在步驟1中創建的bean:s??pann將查找附加到具有“ quartzJob ”角色的帶注釋方法的bean。

請注意, timeZone注釋屬性類型為String ,而CronTriggerBeantimeZone屬性的類型為TimeZone 。 該值由Spring本地處理,使用Spring的PropertyEditor工具透明地轉換為TimeZone 。 您甚至可以使用Spring的$ {…}語法進行表達式替換。

簽入的代碼包含用于創建間隔觸發器的第三個注釋,此示例稍后將使用它。

3.配置spann和spring的SchedulerFactoryBean

我們的applicationContext.xml非常簡短:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:spann="http://os.masetta.com/spann/schema/spann-1.0"xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://os.masetta.com/spann/schema/spann-1.0 http://os.masetta.com/spann/schema/spann-1.0.xsd"><context:component-scan base-package="com.masetta.spann.quartzexample"/><spann:scan base-package="com.masetta.spann.quartzexample"/><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire=”byType”/></beans>

如果您知道spring,那么這里就沒有什么魔術了:如spring參考中所述,我配置了spring的組件掃描,spann掃描和SchedulerFactoryBean ,只是在這里,我讓spring將所有觸發bean自動裝配到相應的屬性,因此autowire ='byType'

4.使用注釋

package com.masetta.spann.quartzexample.test;import java.util.concurrent.atomic.AtomicInteger;import org.springframework.stereotype.Component;import com.masetta.spann.quartzexample.annotations.*;
import com.masetta.spann.spring.core.annotations.VisitMethods;@Component
@VisitMethods
public class Savana {private AtomicInteger newElemphants = new AtomicInteger();private AtomicInteger newZebras = new AtomicInteger();@QuartzJob(name="zebraBorn",group="savana")@Interval(repeatInterval=200)public void zebraBorn() {newZebras.incrementAndGet();}@QuartzJob(name="elephantBorn",group="savana")@Cron(cronExpression="0/2 * * ? * * *")public void elephantBorn() {newElemphants.incrementAndGet();}public int getNewZebras() {return newZebras.get();}public int getNewElephants() {return newElemphants.get();}}

該bean是通過spring的@Component注釋配置的。 它是一個普通的Spring bean,并且任何Spring或方面注釋(@ Autowired@Resource ,@ Transactional )都將由Spring本地處理。

默認情況下,spann僅處理類級別的注釋。 @VisitMethods指示spann也訪問此類的方法并處理其注釋(如果存在)。

新注釋的使用很簡單:每個計劃的方法都應使用@QuartzJob (創建委托的JobDetail )和@Cron@Interval注釋(此處未顯示,但在svn中可用)進行注釋。 。

這也演示了spann的批注組合 ,該批注組合允許批注是粒狀和可插入的: @QuartzJob可以與配置觸發器 bean的任何注釋一起使用,而@Cron@Interval可以與配置JobDetail bean的任何注釋一起使用。

摘要

Spann是Spring框架的開源擴展,它允許使用注釋進行高級bean配置。 該代碼演示了spann的@BeanConfig注釋如何使用注釋創建Quartz計劃的作業。

該示例使用spann的高級API(即@BeanConfig批注),該API在spann項目本身中實現。 Spann的高級API包括其他允許方法替換(用于在運行時實現抽象方法,內部使用cglib進行實現的方法),合成適配器創建和全面的JPA Query支持的注釋。

Spann與spring的集成非常緊密:它創建了“普通的老式spring bean”,就像用XML或@Component批注定義的那樣。 這使您可以利用spring的所有bean功能:可以通過spring的ApplicationContext檢索bean,具有正常的bean生命周期,可以進行后處理(例如,用于表達式替換),自動裝配,使用方面進行攔截,通過JMX管理等等。上。 您不需要黑客和變通辦法,也不需要重新實現或復制和調整現有的Spring代碼。 此外,您的樣板代碼更少,樣板配置也更少。

@BeanConfig和spann的其他注釋一樣靈活,在某些用例中它們沒有涵蓋范圍。 但是spann的低級API允許從頭開始創建新的注釋,從而為開發人員提供了對bean定義的創建和配置的精細控制。 您甚至可以通過實現自己的MetadataVisitor來使用spann處理任何其他類元數據 ,可以選擇全部忽略注釋。

參考: Spring&Quartz與自定義注釋的集成,這是我們W4G合作伙伴 Ron Piterman的SPANN方法 。

相關文章 :

  • Spring,Quartz和JavaMail集成教程
  • 在運行時交換出Spring Bean配置
  • Spring MVC3 Hibernate CRUD示例應用程序
  • 使用Spring將POJO公開為JMX MBean
  • Java教程和Android教程列表

翻譯自: https://www.javacodegeeks.com/2011/10/spring-quartz-integration-with-custom_31.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373886.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python opencv旋轉_Python opencv實現與rotatedrect類似的矩形旋轉,pythonopencv,RotatedRect

本文原理&#xff1a;先旋轉矩形到指定角度&#xff0c;然后提取矩形外輪廓&#xff0c;從而獲取旋轉后的矩形坐標點。#&#xff01;/usr/bin/env python3# -*- coding: utf-8 -*-# Author: tcy# Date: 2020-5-2 21:00:53# Version:V1.01# Last Modified by: tcy shanghai song…

關于string轉整數

又是leetcode的easy級別題&#xff0c;很基本的題目&#xff0c;卻漏考慮很多情況&#xff0c;動手前一定要考慮清楚呀&#xff01;&#xff01;&#xff01; 就當做鍛煉寫作能力吧&#xff0c;先上題目&#xff01; 將文本轉換成整數&#xff0c;注意一下幾點&#xff1a; 1.文…

數字三角形——遞歸、遞推、記憶化搜索

數字三角形 描述: 有一個由非負整數組成的三角形&#xff0c;第一行只有一個數&#xff0c;除了最下行之外每個數的左下方和右下方各有一個數。 問題&#xff1a; 從第一行的數開始&#xff0c;每次可以往左下或右下走一格&#xff0c;直到走到最下行…

Java 7功能概述

前面我們討論了所有未納入Java 7的內容&#xff0c;然后回顧了將其納入Java 7的有用的Fork / Join框架 。 今天的帖子將帶我們了解Project Coin的每個功能-一系列小的語言增強功能&#xff0c;這些功能雖然不是開創性的&#xff0c;但是對于任何能夠使用JDK 7的開發人員來說都是…

緩存技術

提升系統性能的主要方式之一就是緩存。它可以擋掉大部分的數據庫訪問的沖擊&#xff0c;如果沒有它&#xff0c;系統很可能會因為數據庫不可用導致整個系統崩潰。 但是緩存帶來了另外一些棘手的問題&#xff1a; 數據的一致性和實時性。 例如&#xff0c;數據庫中的數據狀態已經…

水晶報表分組分欄_web報表可視化設計器工具推薦

古往今來&#xff0c;信息就是決勝的關鍵。在科技時代的今天亦是如此。企業的數據管理在幫助企業加強管控、提高競爭力等方面具有不可或缺的作用。這就不得不說到報表工具。企業想要將儲存于各種商業信息系統中的數據轉化成有用的信息&#xff0c;最終幫助決策者做出更快、更好…

嵌套矩形——DAG上的動態規劃

有向無環圖&#xff08;DAG,Directed Acyclic Graph&#xff09;上的動態規劃是學習動態規劃的基礎。很多問題都可以轉化為DAG上的最長路、最短路或路徑計數問題。 題目描述&#xff1a; 有n個矩形&#xff0c;每個矩形可以用兩個整數a,b描述&#xff0c;表示它的長和寬。矩形…

Twisted

Twisted定義Twisted是一個基于事件驅動的網絡引擎框架網絡框架&#xff0c;別人預先定義好的一個框架&#xff08;一個項目&#xff09;&#xff0c;如.net某個web框架有25個class&#xff0c;從BeginRequest依次執行類里的process方法&#xff0c;程序員自己定義一個類&#x…

從Spring到Java EE 6

我最近在一個非常復雜的項目中工作&#xff0c;其中融合了許多Java EE 6技術&#xff08;例如JPA&#xff0c;JAXB&#xff0c;JMS&#xff0c;JTA&#xff0c;JAX-RS等&#xff09;。 出于生產力和計劃方面的原因&#xff0c;將原型應用程序設計為獨立的純Spring應用程序。 當…

Centos 6.5 搭建php環境(nginx+mariadb+php7)

1.mariaDb vim /etc/yum.repos.d/MariaDB.repo [mariadb] name MariaDB baseurl http://yum.mariadb.org/5.5/centos5-x86 gpgkeyhttps://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck1#如果服務器已經安裝了MariaDB-Galera-server包&#xff0c;你可能需要在安裝MariaDB-s…

MAC itunes無法驗證服務器s.mzstatic/itunes無法更新服務器解決方案

打開host文件&#xff1a; 一、用終端打開&#xff1a; sudo vi /etc/hosts 輸入完這行命令后需要輸入電腦密碼&#xff0c;然后確認&#xff0c;進入host文件 然后按i鍵進入編輯模式&#xff0c;在最后一行添加&#xff1a;23.214.233.166 s.mzstatic.com 如下圖 添加完后&…

硬幣問題——固定終點的最長路和最短路

問題描述&#xff1a; 有n種硬幣&#xff0c;面值分別為V1,V2...,Vn,每種都有無限多。給定非負整數S&#xff0c;可以選用多少個硬幣&#xff0c;使得面值之和恰好為S&#xff1f;輸出硬幣數目的最小值和最大值。0 < n < 100, 0 < S < 10000, 1 < Vi < S。 …

讀取nas_NAS怎么玩?除了存放小姐姐,它竟然還有這些功能

自從有了電腦&#xff0c;就一直在折騰"存儲那點事兒"&#xff0c;說到底&#xff0c;電腦的本質就是存儲&#xff0c;而自己弄家用存儲方面的東西算下來也有幾年了。單機的硬盤存儲比較簡單&#xff0c;但是隨著家里各種設備的增多&#xff0c;各個設備間的文件共享…

ZK Web框架思想

我曾多次被要求提出一些有關ZK的意見。 因此&#xff0c;根據我作為ZK用戶4年的經驗&#xff0c;以下是一些想法&#xff1a; 總體開發人員經驗&#xff0c;社區和文檔 “就是這樣” ZK提供的大多數東西都能很好地工作&#xff0c;并且如果您以前開發過任何桌面Java應用程序&…

OC第一講:類和對象

今天終于開始進行OC的學習了 一.首先講了NSLog NSLog是oc里面的輸出語句&#xff0c;其用法和printf差不多&#xff0c;但是還是有差別的 1&#xff0c;NSLog是自動換行的&#xff0c;不用像printf那樣還需要加\n&#xff1b; 2&#xff0c;NSLog在引號面前需要添加符號&#x…

【轉載】關于 Google Chrome 中的全屏模式和 APP 模式

【來源于】新浪微博&#xff1a;阿博 http://www.cnblogs.com/abel/p/3235839.html 全屏模式&#xff1a;kiosk 默認全屏打開一個網頁呢&#xff0c;只需要在快捷方式中加上 --kiosk [url] 就可以了。 關于全屏模式&#xff1a; 1、全屏模式下&#xff0c;廣告插件&#xff08;…

PL/SQL Developer跑在Oracle 64位數據庫上初始化錯誤

安裝完Oracle(64位)、PL/SQL Developer后運行PL/SQL出現如下的錯誤&#xff1a; 網上查資料說&#xff0c;我的PL/SQL Developer與ORACLE不兼容&#xff0c;即PL/SQL不支持64位的ORACLE&#xff0c;因此得下一個32位的ORCALE客戶端并配置相應的參數&#xff1a; 解決步驟小記&a…

gis 聯合 融合_GIS技術進化 | 我們為何需要跨平臺GIS技術體系?

10月30日&#xff0c;超圖在2019 GIS 軟件技術大會上發布了SuperMap GIS 10i系列產品。SuperMap GIS 10i全面融入人工智能(AI)技術&#xff0c;創新并構建了GIS基礎軟件“BitCC”五大技術體系&#xff0c;即大數據GIS、人工智能GIS、新一代三維GIS、云原生GIS和跨平臺GIS&#…

Spring陷阱:代理

作為Spring框架的用戶和發燒友多年&#xff0c;我遇到了一些關于此堆棧的誤解和問題。 另外&#xff0c;在某些地方抽象非常可怕地泄漏&#xff0c;以便有效&#xff0c;安全地利用開發人員需要意識到的所有功能。 這就是為什么我開始Spring陷阱系列的原因。 在第一部分中&…

UVa11925 Generating Premutations

留坑(p.254) 1 #include<cstdio>2 #include<cstring>3 #include<cstdlib>4 #include<algorithm>5 #include<iostream>6 7 using namespace std;8 9 void setIO(const string& s) { 10 freopen((s ".in").c_str(), "r&qu…