You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@storm.apache.org by ka...@apache.org on 2017/04/05 22:33:57 UTC
[01/14] storm git commit: STORM-2416 Release Packaging Improvements
Repository: storm
Updated Branches:
refs/heads/master c4170ab16 -> e84b39d1e
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/sampledata/randomwords.txt
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/sampledata/randomwords.txt b/storm-perf/src/main/sampledata/randomwords.txt
deleted file mode 100644
index 1b800cf..0000000
--- a/storm-perf/src/main/sampledata/randomwords.txt
+++ /dev/null
@@ -1,14049 +0,0 @@
-Hester starosta Bassaris guanajuatite pinulus debromination
-outhue pamphlet Socraticism tomorrowness masa Bertat Vichyite
-epauliere magnificently Mormyrus circumzenithal sapphiric Homoiousian misthread
-Pithecolobium saguran hemimelus epauliere symbiogenetically
-chronist cervisial euphemious topline sandbox pneumonalgia Babylonism sawdust by
-figured impressor theologicopolitical scrat arsenide cockal roughcast introducer playfellowship
-potentness Tsonecan ovopyriform inertly Bertat acocotl whitlowwort
-Gothish Pishquow corona interruptedness glossing molecule preagitate
-seelful unscourged swangy Mycogone bogydom nummi homotransplant unburnt
-guitarist cockal Coniferae cylindric ovopyriform nonmanufacture monilioid hypochondriacism
-underogating impairment genii Ludgatian palaeotheriodont marten
-euphonym zoonitic cervisial Bertat guanajuatite Vaishnavism nonsuppressed subsequentially
-scotale semiangle epididymitis bestill nonutilitarian lifter pyrocatechol obolus
-scrat unpremonished ungrave undeterring winterproof zanyism Itea tonsure
-antideflation rivethead seeingness snare refasten repealableness monstership bacillite
-biodynamics antiadiaphorist strander undangered Hester
-overwoven fallacious yawler seelful helminthagogic
-quad putative whittle placatory vinny nebular sialadenitis
-epauliere elemicin greave relaster pyroacetic nectopod nonexecutive weism dunkadoo
-sarcologist tetragynian cubit frictionlessly magnetooptics undangered glyphography vinny
-bladderwort unobservantness unswanlike terrestrially botchedly ultraobscure
-papery mesymnion embryotic Bulanda pumpkinification Bassaris cromlech ungrave
-Semecarpus commotion familist uncontradictableness manny vinny
-eurythermal enation oratorship cretaceous hypoid
-biopsic yote ineunt subangulated mutter barkometer
-manny signifier brag heavenful Homoiousian undeterring michigan
-ultratense Protestantize angina zenick swearingly unexplicit
-monstership unrepealably shibuichi enhedge pachydermous bozal rechar lineamental
-thermochemically nonutilitarian uninterpleaded Florissant ineunt jharal aneurism stachyuraceous
-neuromimesis reperuse magnificently scyphostoma manganosiderite
-merciful becomma unrealize Vaishnavism superindifference trillium soorkee rechar
-lienteria Orbitolina Protestantize Gothish molossic nonsuppressed nonutilitarian
-cyanoguanidine feasibleness unstipulated thermoresistant slait Inger characinoid
-transudatory seizing ungreat almud monander abstractionism socioromantic
-sequestrum sequestrum widdle angina bacillite
-tum beatable seraphism bozal cattimandoo skyshine sombreroed emir
-circular strander diplomatize veterinarian inertly prolificy prepavement
-taver sequestrum corbel classificational mangonism strander swacking
-unrevolting Sebastian spiranthic hepatorrhaphy oflete subangulated subtransverse
-unharmed myesthesia trophonema bozal immatchable
-uninhabitedness eristically Eryon allegedly daytime periclitation phallaceous
-phytonic yote Serrifera nonmanufacture Animalivora
-bozal gunshop ornithodelphous Tamil chorograph Quakerishly outwealth laryngic hepatorrhaphy
-pinulus uninhabitedness endotheliomyoma unachievable Confervales ladhood chilblain
-unachievable nonmanufacture rave Prosobranchiata dermorhynchous minniebush oinomancy overinstruct ventricous
-precostal ununiformly mastication figured idiotize antihero
-Kenipsim beneficent blurredness Dawsonia twinling phallaceous impugnation dermorhynchous
-packsack zanyism breadwinner Megaluridae uncarefully zenick dishpan squdge
-dialoguer theologicopolitical subfoliar mangonism mustafina champer
-Consolamentum exploiter imperceptivity nectopod breadwinner floatability
-heavenful theologicopolitical pyrocatechol ferrogoslarite infestation dermorhynchous lampyrine
-shallowish crystallographical uninhabitedness cocksuredom yawler hysterolysis genii bromic
-antalgol chronographic chasmy proboscidiform craglike stiffish
-marshiness Scanic adz uninterpleaded trailmaking stormy impairment Dunlop pinulus
-mechanist helminthagogic semantician ununiformly incomprehensible equiconvex adatom transcorporeal sertularian
-migrainoid bacillite wandoo sapience counteralliance preparative unpeople aurothiosulphuric
-deindividualization astucious rede schoolmasterism boor alveolite bogydom unaccessible tendomucoid
-glyphography antihero furacious centrifugalization eurythermal atlantite counteractively metaphonical
-Hydrangea spermaphyte canicule impugnation meloplasty introducer
-lithotresis Effie saccharogenic arsenide porencephalous speckedness
-bought patroller uvanite unevoked basto dehairer bought
-posterishness overstaid exploiter mesymnion angina oratorize winterproof Ochnaceae iniquitously
-jharal gallybeggar marshiness subdentate twinling redecrease ramosopalmate
-chronist underskin wandoo diurnalness haply helpless chilblain unforkedness
-epididymitis archesporial uncompromisingly mesymnion karyological yawler
-ventricous horsefly bespin autobiographist deaf Lemuridae Caphtor misexposition
-abscission masa scyphostoma pentafid nonlustrous lebensraum
-posttraumatic uninductive sloped transude enation lithograph pachydermous papery
-weism proacquittal greave Scorpaenidae arrowworm
-velaric doubtingness Swaziland unstressedly coracomandibular
-iniquitously suspend relaster dunkadoo Glecoma larklike uncompromisingly unscourged
-macropterous reappreciate countergabion immatchable ovopyriform Russifier thiodiazole rizzomed sequacity
-neuromimesis balladmonger bladderwort furacious nonpoisonous tetchy pumpkinification laryngic Effie
-opacousness cacuminal unleavened lithotresis metaphonical antideflation feasibleness subfebrile
-underskin unpatched Gothish stradametrical yeat
-Dawsonia counteractively merciful doubtingness Spencerism havoc involatile precostal
-Mormyrus calabazilla tomorn valvula glandularly supraoesophageal ungrave
-overstaid throbless lampyrine phallaceous experientialist blurredness okonite
-subdrainage periarthritis unrepealably enation pansophism
-helminthagogic digitule quarried metastoma molecule Uraniidae harr mediateness slipped
-Aktistetae diminutively cresylite antihero spiciferous ascitic
-dehairer mangonism Lincolnlike prescriber templar
-Ophiosaurus plerome tantivy diplomatize squdge venialness
-imprescribable angiolymphoma seeingness exprobratory Glecoma mechanist avengeful diopside uncontradictableness
-decidable parodist unexplicit physiologian Munychian parabolicness propheticism
-homotransplant reperuse antiabolitionist sialadenitis plerome Dunlop uncontradictableness
-pachydermous preoral chargeably sterilely aneurism cubby yeelaman
-migrainoid totaquina benthonic centrifugalization pyroacetic nonutilitarian corona
-interruptor diatomaceous oxyterpene beneficent returnability molecule
-tantivy comism misthread cubby cretaceous ungrave
-eristically waird overcontribute totaquina proboscidiform tramplike
-counteralliance ungreat unchatteled bucketer bespin parastas defensibly chasmy
-calabazilla cubit synovial bacterioblast neurodegenerative apopenptic asparaginic
-inductivity undinted thermochemically antiabolitionist pendulant
-pachydermous tum Pishquow inertly ventricous
-manganosiderite skyshine Bishareen tailoress transcortical homeotypical glacierist
-devilwise enhedge pendulant cervisial preagitate yote eucalypteol cornberry clanned
-subfoliar impairment bromic Eryon centrifugalization mericarp folious
-dithery exploiter liquidity imaginary bismuthiferous archididascalian monstership eer
-astucious triradiated uncontradictableness pneumatotherapy overstudiousness fetlocked counteralliance Aplacentalia
-ticktick antideflation larklike Macraucheniidae nonlustrous Confervales nonlustrous antideflation
-extraorganismal apopenptic subdentate pachydermous metastoma abusiveness
-Zuludom insatiately Passiflorales oinomancy antideflation fetlocked Consolamentum
-dishpan cromlech sapphiric putative unreprimanded cumbrousness lifter agglomeratic karyological
-laubanite Cephalodiscus Zuludom unbashfulness obispo tonsure incalculable
-periclitation approbation imperceptivity sequentially wingable
-arsenide feasibleness spiciferous choralcelo manilla undinted Jerusalem goladar stewardship
-Bulanda visceral orthopedical antideflation epauliere codisjunct poleax kerykeion
-by misexposition benzothiofuran macropterous gallybeggar sviatonosite
-heliocentricism unpeople unlapsing chorograph transcortical unlapsing
-sawdust byroad iniquitously omega subfoliar ethnocracy jajman aprosopia
-Hester foursquare Helvidian diwata reformatory putative louse unscourged
-Quakerishly prolificy avengeful commotion temporomastoid
-cacuminal hypochondriacism cornberry brooky terrificness iniquitously undeterring
-terrestrially seelful parabolicness benzoperoxide approbation
-Machiavel subangulated overcrown yeat involatile
-nummi stachyuraceous Mormyrus lebensraum chronist subfebrile barkometer
-unpredict meloplasty characinoid hemimelus velaric aconitine figureheadship
-impugnation sturdied Hester alen zanyism consumptional
-horsefly enhedge projecting tomorrowness eer debromination doubtingness unpatched gemmeous
-metrocratic gemmeous uncombable slait papery depressingly
-flutist deindividualization scapuloradial perculsive selectivity Spencerism
-equiconvex pamphlet cervisial micromembrane paleornithology serosanguineous cuproiodargyrite
-reperuse quailberry diopside rivethead meloplasty incomprehensible
-sangaree pelvimetry ploration dithery amplexifoliate Ludgatian
-flatman enation cubit componental inventurous botchedly
-autobiographist flushgate stiffish allectory ambitus triakistetrahedral unprovided chargeably
-heavenful parquet equiconvex outwealth Pyrales unpeople diatomaceous canicule
-Megaluridae twinling bucketer sertularian metaphrastical
-breadwinner imaginary lithotresis selectivity Hysterocarpus Triconodonta steprelationship
-uniarticular angiopathy laryngic preagitate synovial scabbardless socioromantic swoony inventurous
-Vichyite liquidity bogydom autoschediastical scotale debellator
-sequentially omega characinoid unisexuality parodist
-cubit Alethea unevoked photoelasticity Ophiosaurus acidophile redesertion
-depravity Homoiousian analgize venialness archistome orthopedical quadrennial affaite
-technopsychology seeingness ambitus kerykeion abusiveness enterostomy pansophism appetible swearingly
-paleornithology Vichyite corelysis affaite sesquiquintile incomprehensible
-pompiloid saguran isopelletierin okonite tramplike signifier trip
-jharal frenal playfellowship neuromimesis jirble cumbrousness depravity
-splenauxe hypoplastral collegian nectopod metrocratic erythremia precostal
-brooky gunshop Consolamentum Isokontae Shiah biopsic Savitar sturdied
-sangaree sesquiquintile Ochnaceae ungrave whittle
-parquet diatomaceous detractive flutist transcorporeal enterostomy
-templar decardinalize undecorated parodist noreast sturdied noreast furacious uninductive
-regardful unaccessible parabolicness Bishareen peptonate pseudohalogen velaric bacillite componental
-impressor antineuritic waird winterproof expiscate
-porriginous boser catabaptist pyrocatechol intuition
-helpless bubble depressingly taver comism catabaptist
-unleavened serosanguineous upcushion Fameuse groundneedle masa rivethead
-amplexifoliate thiodiazole apocalypst enterostomy uvanite
-catabaptist Aktistetae bladderwort inertly unforkedness Hester socioromantic
-uncompromisingness sural piquantness appetible frameable waird diopside tricae
-triakistetrahedral semantician aquiline Filipendula heavenful danseuse Tsonecan jajman waird
-strander enhedge outwealth epauliere depravity calabazilla
-yeat interruptor balanocele homotransplant upswell analgic Uraniidae
-Dodecatheon equiconvex adatom knob soorkee cubby shola pleasurehood
-unswanlike unpatched overcultured shola shellworker bucketer transude foursquare
-tristich pneumonalgia velaric Aplacentalia sheepskin umangite lineamental zenick acidophile
-ferrogoslarite ununiformly analgize rehabilitative tambo upswell Scorpaenidae
-meriquinoidal yeelaman photoelasticity refasten embryotic guitarist metrocratic
-pneumonalgia hackneyed gallybeggar foursquare valvula
-preaffiliate diathermacy pyrocatechol brag parodist sandbox agglomeratic prescriptible sturdied
-disilane ell scapuloradial havoc inferent sandbox galbulus Pithecolobium erythrodextrin
-interfraternal masa whittle expiscate brutism oinomancy bucketer depravity
-antideflation swacking cuproiodargyrite jajman Macraucheniidae temporomastoid
-decardinalize louse coracomandibular bunghole velaric emir tambo Russifier trisilicic
-classificational trillion diplomatize uncontradictableness subangulated arrowworm hemimelus marshiness penult
-adz thermanesthesia Munnopsidae paranephros emir basto choralcelo Bulanda
-autobiographist kerykeion symbiogenetically repealableness stroking stradametrical
-overbuilt periclitation Pincian nonsuppressed warlike helpless
-ineunt tramplike corona bucketer corona
-superindifference pictorially aneurism chrysochrous comism jirble percent arsenide
-Tamil vesperal bought pseudoxanthine danseuse unlapsing
-sapphiric Mesua starosta wandoo antalgol kerykeion
-raphis Dictograph unswanlike larklike hondo slangy subfebrile cuproiodargyrite
-dispermy okonite circular terrestrially componental chrysochrous stronghearted sandbox adz
-hepatorrhaphy superindifference inventurous tonsure wherefrom Orbitolina codisjunct
-experientialist preagitate metoxazine mesymnion diwata regardful prolificy
-diminutively heavenful octogynous unrevolting nonsuppressed
-archistome idiotize sterilely neurodegenerative evictor
-Sphenodontidae swearingly monilioid squit nonuple flatman
-pentosuria strammel fossilism parastas characinoid
-trillion semiangle hymnic trillium subsequentially ell cyanophilous farrantly balladmonger
-sapphiric vesperal ethmopalatal dehairer intrabred Pyrales Homoiousian
-louse ungrave ascitic bestill topline
-potentness thorite repealableness antalgol pompiloid overcontribute orthopedical valvula
-feasibleness Pincian appetible preoral ten Hysterocarpus Orbitolina undangered
-erlking ornithodelphous bromate starer ventricous flutist Harpa folious
-elastivity oversand heavenful ladhood eucalypteol havoc Fouquieria dosseret chooser
-mutter reappreciate topsail heavenful archididascalian
-spermaphyte untongued upcushion naught clanned
-chilblain metrocratic jajman astucious chargeably beatable
-nonpoisonous idiotize groundneedle ultraobscure dastardliness interfraternal giantly
-sural spiciferous intuition lophotrichic pope mastication jharal chronist
-circular twinling sud bestill trunnel proauction
-paunchy pansophism overbuilt stroking electrotechnics
-meriquinoidal leucophoenicite socioromantic impairment nummi
-yeelaman spot pachydermous bot theologicopolitical pelvimetry unaccessible sloped
-oxyterpene instructiveness trophonema nonexecutive critically decidable
-ascitic paradisean corelysis noreast seeingness arduousness acocotl friarhood becomma
-iniquitously cervisial octogynous inductivity Edo
-Thraupidae Russifier prolificy stronghearted ununiformly
-visceral visceral involatile introducer hyocholic
-noncrystallized angiopathy preoral unpredict marshiness
-Mycogone immatchable bogydom palaeotheriodont diathermacy laurinoxylon stroking saccharogenic arsenide
-retinize Christianopaganism cacuminal cloy atlantite becomma vesperal nonpoisonous stentorophonic
-canicule tum constitutor authorling antihero superindifference
-toplike flatman bot saccharogenic swearingly
-unlapsing docimastical arval laryngic characinoid technopsychology weism
-Pishquow balladmonger coracomandibular glyphography merciful tingly Caphtor ungrave
-leucophoenicite Effie prepavement angiolymphoma Confervales weism
-decardinalize manilla endotheliomyoma Dawsonia japanned scrubbed unevoked boor
-mangonism vinny plugger thiodiazole immatchable Spencerism seelful
-warlike vinny pondside pondside Bermudian inventurous unurban pachydermous oratorship
-pseudoxanthine ethnocracy theologal meriquinoidal saccharogenic sialadenitis tetrahedral pyxie
-synovial predisputant ten unprovided Saponaria seeingness toplike
-pondside fallacious enation valvula noreast bathysphere infestation
-mammonish gymnastic deepmost widdle atlantite antivenin
-Munnopsidae dunkadoo overstaid redescend uncombable foursquare thermoresistant gymnastic
-introducer laurinoxylon decardinalize Joachimite cylindric subsequentially
-orthopedical relaster generalizable trophonema coadvice eristically Vaishnavism
-rosaniline Thraupidae monilioid extraorganismal predebit hypochondriacism marten mericarp
-biventer undiffusive pendulant transcortical sombreroed cumbrousness pinulus ovoviviparous
-asparaginic Machiavel lithograph parmelioid unleavened
-warlike overcontribute Helvidian aurothiosulphuric dinical gallybeggar pamphlet swoony
-coldfinch percent paleornithology Protestantize diwata
-imaginary aurothiosulphuric cervisial prescriber rizzomed skyshine Socraticism Cimmerianism seelful
-parquet poleax unevoked coadvice repealableness Munychian endotheliomyoma apopenptic eucalypteol
-quintette pneumatotherapy ornithodelphous sirrah hoove
-nonuple Swaziland planosubulate bromic potentness skyshine eulogization
-smokefarthings stormy ineunt nonexecutive Ophiosaurus greave bonze raphis boser
-elemicin ell hackneyed Haversian tomorrowness nonsuppressed embryotic daytime boser
-heliocentricism antiscolic gelatinousness scrubbed overstudiousness lifter periclitation
-tingly shellworker aneurism prospectiveness unefficient uninductive Spatangoidea culm
-taurocolla adscendent inexistency quarried trabecular oratorship
-vitally topsail raphis parastas eristically chordacentrum
-Lincolnlike cornberry mammonish mesophyte overcrown quadrennial swacking mendacity macropterous
-Tamil diopside pneumatotherapy comprovincial uncontradictableness Mormyrus
-uninterpleaded starosta rosaniline triradiated prolificy
-aquiline waird saccharogenic pachydermous Macraucheniidae neurodegenerative speckedness overcrown
-infrastapedial percent thermanesthesia ticktick periclitation sequacity
-agglomeratic centrifugalization unaccessible gelatinousness angiolymphoma Pithecolobium reeveland unfurbelowed beadroll
-culm unrevolting theologicopolitical soorkee gemmeous avengeful
-marten deindividualization bathysphere bettermost saccharogenic Passiflorales seditious mendacity erlking
-bromate deepmost stachyuraceous characinoid floatability obolus
-overcultured triradiated oblongly adatom stronghearted patroller Jerusalem
-commotion cheesecutter semiangle uninterpleaded monander danseuse
-bromate scyphostoma reeveland doina commotion parquet tonsure
-antiadiaphorist Swaziland twinling stiffish exploiter
-arrowworm uncontradictableness furacious pomiferous Harpa pope
-yeat deindividualization monander wandoo subangulated Filipendula oxyterpene prepavement Christianopaganism
-benzoperoxide Bushongo slangy larklike overstudiousness pentosuria unfulminated
-mangonism mangonism overstudiousness bogydom ungrave oxyterpene repealableness
-instructiveness balladmonger cattimandoo karyological magnetooptics misthread
-roughcast theologal bucketer angiopathy theologicopolitical
-spot seminonflammable hondo Eleusinian metaphonical elastivity predisputant
-pentafid eer tailoress pictorially phlogisticate ploration nummi thiodiazole Joachimite
-slait unstressedly bucketer Spencerism outguess tingly chasmy
-depravity unscourged corona Gothish allegedly frenal
-interruptor benzoperoxide mammonish slipped immatchable
-impairment havoc plugger intuition equiconvex interruptedness guitarist diatomaceous dinical
-constitutor Protestantize circular edificator sequestrum hogmace
-reciprocation saguran Arneb cacuminal arval prepavement eulogization
-toxihaemia seelful frameable Swaziland counteractively bacillite
-gelatinousness uncombable sonable seraphism thorite byroad
-oversand authorling umangite tartrous verbid
-beneficent neurodegenerative toplike scyphostoma perculsive
-airfreighter Alethea bucketer tonsure Confervales
-feasibleness omega flatman throbless tomorn returnability diatomaceous
-balladmonger epidymides sirrah terrificness disilane unurban
-Confervales involatile overcultured astronomize Munnopsidae chrysochrous foursquare
-seraphism preagitate helminthagogic benzoperoxide Glecoma Yannigan umangite veterinarian subofficer
-overcultured airfreighter jirble thiodiazole stradametrical ipomoein cuproiodargyrite templar ambitus
-umbellic toxihaemia Llandovery apopenptic jajman pope doubtingness pleasurehood Coniferae
-abthainry Vaishnavism patroller verbid terrificness
-apopenptic stewardship precostal Yannigan limpet weism Animalivora greave
-Munnopsidae proacquittal extraorganismal undeterring drome
-apocalypst entame benthonic bettermost proauction photoelasticity
-dosseret eucalypteol liquidity scabbiness quintette velaric totaquina
-splenauxe deaf asparaginic unefficient Auriculariales Thraupidae relaster harr preparative
-pinulus jharal propodiale frameable angiopathy biventer harr
-plugger propheticism speckedness Cercosporella slipped hymnic
-lineamental strammel Filipendula monstership comprovincial sialadenitis sesquiquintile warlike
-golem splenauxe dehairer gymnastic imaginary
-cocksuredom impairment Uraniidae Uraniidae apocalypst phytonic Auriculariales osteopaedion Florissant
-stormy sequentially introducer suspend Ochnaceae nonsuppressed Whilkut bromic antalgol
-chronist umbellic speckedness discipular Dunlop sturdied scabbiness
-sandbox phlogisticate endotheliomyoma hypoplastral tambo subtransverse
-phallaceous pony obispo pony acidophile preparative semiangle depthwise brooky
-exprobratory involatile prescriptible counterappellant ovoviviparous
-seizing Llandovery seeingness wherefrom liquidity tetrahedral arrendation
-emir larklike biventer proacquittal Swaziland unsupercilious Machiavel decidable rainproof
-tartrous imperceptivity amylogenesis devilwise reappreciate pondside ultratense pleasurehood periclitation
-enterostomy elastivity archesporial antiscolic drome unpremonished strander bladderwort sapphiric
-serphoid pope potentness angiolymphoma cromlech photoelasticity
-symbiogenetically metrocratic monstership diurnalness eucalypteol laurinoxylon
-Orbitolina yawler Shiah metoxazine ovopyriform tricae thermanesthesia
-nonexecutive elemicin pleurotropous cocksuredom reformatory knob projecting tomorn
-Sebastian sandbox trisilicic nonlustrous morphiomania monilioid guanajuatite strander
-ineunt upswell cromlech airfreighter sud liberatress speckedness digitule Serrifera
-paradisean sarcologist manny rosaniline ungrave cocksuredom greave
-Tsonecan whittle soorkee astronomize peristeropode
-karyological rehabilitative pterostigma gala neurotrophic Cimmerianism Aplacentalia collegian clanned
-signifier Hysterocarpus projecting patroller Scanic stiffish glossing starosta
-parodist deaf diurnalness taurocolla gala goodwill golem undangered zanyism
-nonrepetition beadroll spot yeelaman Sebastian circumzenithal Christianopaganism debellator cubby
-rebilling omega eer apocalypst aurothiosulphuric proauction imperceptivity cinque chooser
-fallacious cubby defensibly pompiloid participatingly archesporial trip defensibly
-breadwinner cattimandoo abscission winterproof ultraobscure
-isopelletierin Llandovery hysterogen preparative Bermudian
-bugre unfulminated redesertion arteriasis frameable cockal Protestantize
-calabazilla intuition pope naprapath porriginous Dictograph posttraumatic
-japanned arrowworm laurinoxylon eristically defensibly toxoplasmosis pentafid
-circumzenithal dastardliness basto Bertat oflete
-guanajuatite redecrease experientialist thermochemically molossic
-frameable rede Pithecolobium chasmy meriquinoidal regardful
-evictor planosubulate testa entame orthopedical
-scrat friarhood Spencerism Ghent pomiferous magnificently Triconodonta
-reeveland gul omega valvulotomy sloped
-lifter spermaphyte dithery experientialist unharmed ungreat seeingness Bertat Dawsonia
-aneurism involatile pomiferous homeotypical archistome
-overwoven anta stradametrical countergabion Aktistetae unsupercilious benzoperoxide
-Ludgatian Kenipsim bought adz glacierist Christianopaganism
-trabecular counterappellant outguess kerykeion counteractively Endomycetaceae exploiter
-inventurous bettermost undiffusive nummi bespin
-goladar macropterous clanned pinulus dipsomaniacal
-frontoorbital analgic oblongly feasibleness Hester
-laubanite dosseret phoenicochroite redecrease ungreat nonexecutive lyrebird redecrease
-refasten airfreighter myesthesia heavenful whitlowwort depressingly scrat Aplacentalia antiscolic
-testa aneurism cornberry Semecarpus Passiflorales
-counteractively cromlech osteopaedion engrain uloid metopon euphemious metapolitics
-cromlech chorograph tum undinted wherefrom nebular
-Dictograph stronghearted Yannigan paradisean rebilling photoelasticity
-physiologian scapuloradial interruptor unforkedness intuition
-pachydermous eurythermal hondo chalcites outguess
-bromic blurredness familist erythrodextrin bought ramosopalmate
-returnability rivethead chasmy Arneb phoenicochroite oblongly
-undeterring bozal counterappellant pictorially Pishquow
-templar valvulotomy nummi valvulotomy Homoiousian limpet unschematized
-brooky rotular proacquittal predebit componental thermochemically
-rivethead lampyrine unsupercilious brooky ell coadvice Harpa
-biopsic sesquiquintile coldfinch isopelletierin ultratense tickleproof propheticism misexposition
-embryotic docimastical beadroll cubby champer groundneedle archistome devilwise autobiographist
-generalizable Machiavel unpatched licitness abthainry vinegarish
-Endomycetaceae characinoid atlantite elastivity Dawsonia mericarp stewardship dermorhynchous horsefly
-Sphenodontidae dishpan farrantly almud glossing
-archesporial monogoneutic upswell scrubbed opacousness drome lampyrine Ochnaceae
-quad trillium veterinarian circumzenithal hypoid
-choralcelo beneficent pamphlet epauliere lyrebird impairment
-uncombable oratorship nonprofession osteopaedion Harpa
-unpeople Tamil Pishquow helpless cacuminal
-hemimelus omega metaphonical Chiasmodontidae ethmopalatal euphonym totaquina
-manilla Scorpaenidae knob saccharogenic bestill tramplike
-incomprehensible foursquare constitutor serosanguineous warriorwise brutism
-flushgate prolificy spiciferous uncombable glossing
-Inger deaf Aktistetae frenal chooser meriquinoidal hoove Pyrales
-blightbird digitule guitarist chargeably Pithecolobium
-ungouged Hydrangea veterinarian widdle patroller myesthesia sportswomanship ovopyriform elastivity
-overwoven shibuichi volcano quadrennial bestill biventer michigan Aplacentalia bespin
-gemmeous pachydermatoid corelysis umangite metoxazine enhedge unpatched
-Russifier seizing louse componental morphiomania socioromantic infestation downthrust
-affaite unrevolting obolus swoony circular kerykeion sertularian saguran
-Uraniidae subtransverse pinulus scrat pumpkinification physiologian cylindric metaphonical masa
-tambo pumpkinification Haversian brooky temporomastoid gymnastic octogynous Aktistetae skyshine
-mesophyte scrubbed nonlustrous hysterogen seminonflammable volcano chrysochrous zanyism
-japanned Eryon uncompromisingness corona sturdied relaster equiconvex agglomeratic undeterring
-impressor oratorize outwealth stewardship marshiness pachydermatoid stiffish blurredness bugre
-uloid limpet ambitus archididascalian parabolicness leucophoenicite
-sombreroed blightbird uncarefully Eryon unrepealably dipsomaniacal overcultured
-sedentariness tailoress tantivy ultrasystematic pelvimetry lithotresis rainproof meloplasty cyanoguanidine
-authorling archistome parastas Bassaris eternal obolus unisexuality
-ramosopalmate prezygapophysial manganosiderite mangonism hellbender volcano oflete
-snare saguran chorograph brooky Protestantize cuproiodargyrite experientialist
-gymnastic rehabilitative constitutor Pithecolobium signifier bonze Christianopaganism
-affaite tomorn bismuthiferous airfreighter hypoid decardinalize boor asparaginic
-unharmed pendulant allotropic infravaginal Serrifera hysterogen antiabolitionist mesymnion liquidity
-quailberry blurredness chronist diopside spherulitic subdrainage subofficer pompiloid sequestrum
-selectivity leucophoenicite serpentinic enation merciful Bishareen thermanesthesia
-outwealth scrat knob marten Vichyite byroad endotheliomyoma
-neurodegenerative Christianopaganism arrendation dinical plerome
-Gothish sapphiric homotransplant manilla counteralliance experientialist hogmace tonsure
-unleavened phoenicochroite glossing soorkee unexplicit uncarefully myesthesia shola cumbrousness
-tomorrowness inductivity interruptedness golem metoxazine greave gul
-warriorwise raphis antalgol monander brooky nonutilitarian slipped veterinarian by
-retinize Arneb antalgol Cephalodiscus taver gemmeous
-Vaishnavism intrabred smokefarthings Edo tambo tambo scyphostoma folious guanajuatite
-Dadaism aprosopia psychofugal thermoresistant undeterring
-impairment macropterous trillium cretaceous stiffish astucious piquantness
-Megaluridae impugnation neuromimesis Scorpaenidae porriginous
-Hysterocarpus sequacity antiscolic corbel scotching tomorn collegian
-reconciliable semiangle manilla serphoid Dictograph codisjunct smokefarthings Isokontae
-coldfinch triradiated circumzenithal reconciliable farrantly cuproiodargyrite prepavement leucophoenicite
-gala becomma mastication reconciliable laurinoxylon provedore
-untongued culm hellbender diplomatize japanned
-exploiter thorite thorite trisilicic mesymnion undecorated toplike metopon scotching
-cattimandoo rainproof reciprocation perfunctory Cephalodiscus generalizable undeterring proboscidiform Isokontae
-flatman hemimelus papery valvula playfellowship carposporangial Spatangoidea tomorn
-chorograph Confervales Haversian scyphostoma reperuse feasibleness paradisean
-seelful subirrigate reappreciate signifier triradiated stachyuraceous pansophism uninductive
-countergabion tantivy obolus unreprimanded trunnel genii
-diatomaceous jajman Vichyite pumpkinification neurotrophic
-planispheric groundneedle hackneyed parabolicness frontoorbital
-taurocolla brutism sloped dermorhynchous imprescribable
-lammy insatiately unlapsing countergabion neuromimesis
-golem projecting ungouged Zuludom oxyterpene thermochemically throbless projecting
-infestation rave silicize Alethea peptonate
-unaccessible Sebastian Hydrangea debromination tartrous Oryzorictinae
-subangulated characinoid valvula Prosobranchiata omega experientialist tartrous
-Orbitolina inventurous phoenicochroite Quakerishly Haversian basto
-angiolymphoma swearingly autoschediastical merciful Coniferae parodist
-constitutor overcultured diurnalness expiscate undiffusive moodishness tonsure Munychian
-tendomucoid ethmopalatal spookdom hogmace idiotize
-bromic weism carposporangial imprescribable orthopedical ultrasystematic sesquiquintile
-perculsive metaphonical byroad unrepealably disilane taurocolla prescriber wingable pony
-angina uniarticular decidable uniarticular figured calycular
-canicule unpredict tailoress scrubbed admissory
-yote oversand agglomeratic proauction allegedly chacona
-larklike swoony macropterous diopside Eryon spiciferous pentafid
-spiranthic unfeeble Protestantize hellbender ell knob pamphlet
-unpeople unurban Uraniidae inertly proacquittal seeingness
-debellator trabecular hoove pneumatotherapy Arneb atlantite
-perculsive intrabred pneumatotherapy infravaginal ineunt reperuse
-valvulotomy autoschediastical homeotypical nebular infrastapedial angiolymphoma percent
-ineunt coadvice Tamil ell autobiographist prefatorial
-pamphlet mammonish unforkedness qualminess peristeropode upswell
-paranephros proacquittal danseuse upcushion stroking
-larklike interfraternal rede paunchy metaphrastical pamphlet
-quadrennial perfunctory upswell kenno prescriber Itea crystallographical Gothish
-enhedge chacona calycular dialoguer underskin subangulated Triphora antineuritic
-sonable bismuthiferous ovoviviparous unstipulated predebit
-meriquinoidal aurothiosulphuric reconciliable testa stroking temporomastoid
-golem semantician massedly preagitate concretion sturdied centrifugalization subdentate clanned
-scrat plerome Aplacentalia warlike rosaniline terrificness
-repealableness sural omega piquantness uninductive liquidity sleigher subfebrile
-unpremonished subfebrile lienteria laubanite Bertat valvulotomy sturdied
-nonrepetition cresylite nectopod opacousness apocalypst unpeople
-propheticism retinize pachydermatoid obispo familist bettermost mechanist repealableness technopsychology
-phytonic posttraumatic biventer supraoesophageal transudatory
-larklike nonprofession instructiveness culm Chiasmodontidae culm greave endotheliomyoma ultraobscure
-autobiographist wingable poleax reappreciate tambo balladmonger louse ethmopalatal
-monander archididascalian meriquinoidal undiffusive spiranthic gunshop ultraobscure Hu
-figured perfunctory Yannigan preaffiliate eurythermal Florissant umbellic extraorganismal
-roughcast Vaishnavism patroller playfellowship acidophile balanocele brag Ghent cyanoguanidine
-centrifugalization playfellowship pompiloid blightbird hypochondriacism
-photoelasticity pyxie tambo paranephros times deepmost
-nebular minniebush unaccessible squit excerpt refective
-incalculable Llandovery mesymnion comprovincial socioromantic reperuse Pishquow uloid molossic
-winterproof redescend obolus galbulus subdentate
-circular starosta unrealize Pyrales stentorophonic
-trailmaking asparaginic templar instructiveness diopside misexposition misexposition
-prescriptible exploiter autobiographist culm abscission goladar japanned porencephalous Haversian
-biventer weism anta Gothish phoenicochroite
-frontoorbital quarried saccharogenic Fouquieria unimmortal Lincolnlike
-orthopedical asparaginic yawler pinulus unswanlike adatom
-idiotize unbashfulness toxoplasmosis champer unchatteled inferent
-nonrepetition metoxazine speckedness lifter pyroacetic hyocholic reformatory cyanoguanidine cretaceous
-Zuludom scotale unsupercilious appetible omega seraphism
-cumbrousness pachydermous Sphenodontidae Confervales retinize putative Christianopaganism unanatomized
-squdge diurnalness louse lammy scrubbed
-cumbrousness intuition incalculable parabolicness parmelioid pentagamist
-prescriber cheesecutter frontoorbital psychofugal parabolicness overstaid ineunt quadrennial gymnastic
-tailoress haply stroking provedore corbel parabolicness mendacity balanocele proacquittal
-trip tristich Hester metopon cretaceous pelvimetry noreast Quakerishly tambo
-pseudoxanthine spot seizing reformatory Spatangoidea Vaishnavism pleasurehood spiciferous
-overstaid velaric Megaluridae Triconodonta subdrainage flatman
-uncarefully glacierist botchedly orgiastic shola throbless
-noncrystallized nigh golem ell impressor benthonic
-subtransverse unleavened folious homeotypical dunkadoo oblongly
-reperuse diatomaceous unefficient marten farrantly sandbox
-Triconodonta rechar totaquina toplike Isokontae overstudiousness rebilling detractive
-leucophoenicite abstractionism lithotresis balanocele sedentariness sonable
-insatiately columniform Consolamentum aprosopia abscission ordinant cyanophilous centrifugalization
-pseudohalogen cockal furacious antideflation pyroacetic quad
-electrotechnics immatchable silverhead seizing adscendent
-exploiter amylogenesis ungrave counteralliance planispheric
-amylogenesis unpremonished wingable templar toxoplasmosis blightbird
-shallowish acidophile Bertat superindifference Endomycetaceae squdge sirrah
-eucalypteol silicize bought mangonism potentness reappreciate fossilism
-mangonism nigh Filipendula cretaceous oflete pope unevoked
-Bulanda hepatorrhaphy rede doina limpet erythrodextrin pterostigma pamphlet stereotypography
-upswell sportswomanship tristich stachyuraceous quintette endotheliomyoma chooser noreast
-spherulitic interruptor galbulus scrat hysterogen wandoo ventricous sandbox
-infrastapedial choralcelo overwoven relaster Uraniidae flippantness undiffusive suspend
-doubtingness silverhead bespin swoony generalizable consumptional
-defensibly prepavement tristich glandularly ineunt charioteer yeelaman
-omniscribent parmelioid archesporial slait oratorize toplike bacillite
-entame redescend Chiasmodontidae terrificness temporomastoid calycular deaf socioromantic
-bicorporeal metaphonical tambo Spatangoidea transcorporeal barkometer amender insatiately Lemuridae
-Tsonecan craglike counterappellant Dodecatheon unprovided euphemize
-yeelaman by stiffish adz mericarp knob autoschediastical redescend rave
-mendacity porriginous metoxazine minniebush devilwise bettermost Dictograph abthainry archesporial
-commotion homotransplant comprovincial ambitus unscourged mastication lophotrichic
-rizzomed Hydrangea placatory arrendation brag antideflation eulogization
-exprobratory eurythermal hyocholic Yannigan parodist prefatorial
-docimastical overcontribute electrotechnics sombreroed inductivity scotale testa chacona retinize
-Orbitolina acocotl enterostomy electrotechnics pope
-noreast toxoplasmosis Inger docimastical metastoma antiadiaphorist
-licitness weism veterinarian licitness homotransplant larklike Bassaris Aplacentalia
-pterostigma aconitine aurothiosulphuric diopside Eleusinian Aktistetae isopelletierin
-venialness ungouged yeat knob arrendation naprapath edificator uncontradictableness pachydermous
-docimastical monogoneutic antineuritic sialadenitis cobeliever sedentariness
-glacierist Pithecolobium avengeful meloplasty widdle cartful posttraumatic lyrebird
-Animalivora involatile leucophoenicite Joachimite antideflation phallaceous Consolamentum overcontribute glacierist
-pseudoxanthine pseudohalogen parastas bathysphere roughcast almud hysterogen
-balanocele precostal adz hackneyed umbellic stroking starosta
-vesperal elemicin supermarket sequacity provedore Florissant euphemize pachydermatoid
-pony leucophoenicite piquantness infrastapedial retinize triradiated Caphtor Helvidian corona
-pyxie unfeeble Yannigan slipped provedore figured selectivity dipsomaniacal Pincian
-subofficer sequentially constitutor masa laryngic genii supermarket floatability
-critically goodwill goladar Fameuse balladmonger
-helminthagogic tingly propheticism predisputant tickleproof docimastical homotransplant valvula squit
-unpredict chooser sloped lithotresis serosanguineous
-raphis precostal electrotechnics deepmost parquet gunshop diplomatize propheticism subfoliar
-uniarticular plerome uninhabitedness unevoked genii scrubbed
-unanatomized chordacentrum archistome putative nigh Ludgatian
-sapphiric concretion subtransverse sural arval laurinoxylon agglomeratic exprobratory ploration
-projecting alen orchiocatabasis ovoviviparous Scorpaenidae
-angiolymphoma rave Dawsonia entame terrificness undecorated yote okonite
-Ghent mangonism lampyrine spiranthic absvolt marshiness
-tendomucoid interfraternal Tamil bacillite thermochemically predisputant biodynamics mesymnion projecting
-visceral diopside archididascalian repealableness rebilling
-unaccessible friarhood basto proboscidiform Cephalodiscus rave triradiated overstaid
-diatomaceous besagne molecule yeelaman overstaid imprescribable
-impairment thermoresistant provedore diplomatize dermorhynchous atlantite adz
-steprelationship reeveland boor Sphenodontidae cockstone
-redesertion abthainry quarried diatomaceous Dadaism lifter quailberry Coniferae
-unfurbelowed pumpkinification parquet vitally benzothiofuran autoschediastical
-posttraumatic potentness Gothish bubble oversand glacierist obolus
-karyological unobservantness scyphostoma subfebrile lithograph cobeliever biventer
-nonpoisonous cervisial flutist cubby glacierist
-yeat cresylite Zuludom packsack allegedly laurinoxylon
-licitness untongued asparaginic manny hogmace throbless
-molecule stroking ungreat Bishareen emir macropterous yeat entame tickleproof
-alen unleavened prefatorial spermaphyte Arneb
-sviatonosite sud Hu euphonym arval harr
-metoxazine catabaptist cacuminal cromlech inertly slangy anta Florissant
-figured Machiavel Fouquieria tartrous pachydermous cyanoguanidine perculsive
-spermaphyte Dictograph thermoresistant paunchy hyocholic
-lammy corona unrealize Eryon impugnation cyanoguanidine cockstone Pithecolobium Joachimite
-trillium unfeeble subdrainage strammel liberatress
-eristically frameable disilane ornithodelphous orthopedical amender omniscribent
-comparability physiologian triakistetrahedral Hydrangea ethmopalatal cubby eulogization topsail
-reperuse subdentate preparative Helvidian dosseret Yannigan phallaceous centrifugalization
-helpless Savitar bacillite stereotypography counteractively Bertat
-jajman psychofugal periclitation experientialist dermorhynchous pictorially atlantite undangered antiadiaphorist
-electrotechnics Passiflorales unrevolting pelvimetry danseuse amender
-myesthesia pneumatotherapy phytoma nonrepetition refasten jajman Munnopsidae speckedness michigan
-tailoress gelatinousness cacuminal Ochnaceae sedentariness reeveland
-eristically generalizable taver tomorrowness catabaptist endotheliomyoma terrestrially
-Hydrangea tonsure Animalivora charioteer porriginous wingable
-aprosopia unefficient sapphiric Lentibulariaceae trillium arteriasis allegedly prescriber
-deaf dehairer antiabolitionist focaloid tantivy totaquina tailoress
-monander squit extraorganismal classificational Triconodonta brag yote farrantly circular
-stentorophonic flippantness atlantite uniarticular zenick Scorpaenidae
-vinny testa Pishquow sheepskin osteopaedion Arneb jirble
-pompiloid Dodecatheon flippantness unpeople Caphtor overcultured
-limpet euphemize vinny seeingness unlapsing stiffish
-Llandovery warlike bonze valvula cheesecutter Ophiosaurus eer equiconvex
-Edo undeterring diopside Megaluridae octogynous vesperal serpentinic folious Babylonism
-unexplicit lifter biopsic culm furacious scabbardless Mesua approbation
-antineuritic hackneyed swacking discipular papery authorling tomorrowness orgiastic
-zoonitic subirrigate Pishquow Florissant unstressedly Confervales
-comprovincial overstaid engrain templar classificational imperceptivity
-Machiavel antiadiaphorist Joachimite undecorated hypoid bunghole thorite topline tetragynian
-jharal peristeropode triradiated excerpt doina seditious triradiated
-pyrocatechol Gilaki hackneyed classificational clanned louse pelf flatman
-Cephalodiscus plugger manganosiderite abstractionism scotale starosta fallacious
-Thraupidae skyshine throbless heliocentricism brag oratorize clanned parquet arteriasis
-ovoviviparous sapience toxihaemia generalizable aprosopia Ghent farrantly genii
-Chiasmodontidae diwata arrendation subfebrile hemimelus chasmy vesperal
-epidymides canicule pneumonalgia pompiloid acidophile ferrogoslarite weism beneficent
-speckedness porriginous tartrous antiscolic manilla patroller sloped
-friarhood temporomastoid trisilicic arrowworm pope clanned
-molossic intuition bromic airfreighter decardinalize cornberry prescriptible rechar spiranthic
-euphemize scrat quintette pansophism vitally brooky coracomandibular seminonflammable
-exploiter rizzomed aconitine sapience cumbrousness ascitic unisexuality zenick craglike
-approbation saponaceous quarried apopenptic frameable unbashfulness
-docimastical astronomize slait periclitation untongued Lentibulariaceae meriquinoidal
-Bishareen componental heavenful sonable unprovided proboscidiform
-volcano interfraternal thiodiazole Dictograph parodist
-sangaree unpeople subirrigate componental countergabion massedly abusiveness
-potentness engrain flutist provedore seizing epauliere besagne
-prolificy manganosiderite scrat subtransverse zanyism slipped pentosuria
-superindifference analgic heavenful perculsive deepmost supraoesophageal diathermacy oratorship
-Cephalodiscus toxihaemia astucious nonuple tetchy wemless Edo ambitus nigh
-craglike leucophoenicite deindividualization swoony omega antihero swoony unisexuality
-reformatory Machiavel danseuse spookdom nonprofession frictionlessly trunnel coadvice unaccessible
-Arneb widdle nectopod charioteer bonze antivenin valvulotomy cockal
-soorkee trailmaking overcontribute flushgate discipular hysterolysis
-counterappellant haply homeotypical ethnocracy floatability corona
-disilane generalizable quad sonable Dawsonia tetchy diatomaceous serpentinic mustafina
-theologal astucious ethnocracy quintette downthrust pleurotropous inventurous familist
-mediateness psychofugal Caphtor mangonism nectopod slait lifter
-transude arduousness Hysterocarpus centrifugalization boor refective vesperal abusiveness
-morphiomania botchedly sonable counteractively reeveland
-inductivity balanocele magnificently Vaishnavism laurinoxylon predebit toxoplasmosis
-Gothish visceral larklike Serrifera Ludgatian overcrown horsefly Prosobranchiata discipular
-imaginary sapphiric metaphonical trailmaking overcultured
-subtransverse monilioid gymnastic reappreciate brutism roughcast Bishareen
-slipped countergabion giantly eucalypteol technopsychology orgiastic trophonema
-inexistency roughcast approbation ventricous sertularian morphiomania plerome topline frictionlessly
-Filipendula rehabilitative undercolored hellbender whitlowwort preaffiliate
-brutism lithograph sturdied Christianopaganism coracomandibular scabbardless
-antihero ipomoein Zuludom micromembrane downthrust steprelationship tartrous vinny autoschediastical
-balanocele sesquiquintile japanned noreast moodishness preagitate
-nonprofession divinator vinny provedore upcushion vitally
-laubanite chrysochrous unevoked antalgol diminutively unleavened mastication unpredict
-trophonema tum chalcites oinomancy ventricous counterappellant
-pseudohalogen asparaginic toplike templar airfreighter Lemuridae timbermonger affaite
-papery pseudoxanthine manny Semecarpus dishpan vinegarish calabazilla doina putative
-velaric schoolmasterism sequestrum molossic sonable
-insatiately Muscicapa unexplicit overcontribute monander precostal
-piquantness squdge symbiogenetically divinator topsail
-antihero gallybeggar hysterogen drome palaeotheriodont unsupercilious
-pomiferous Zuludom gorilloid nonpoisonous gemmeous critically
-cockstone massedly metastoma cacuminal Socraticism symbiogenetically pneumatotherapy Babylonism
-porencephalous appetible scrubbed quailberry ambitus parabolicness phlogisticate
-neurotrophic goodwill tetragynian winterproof byroad
-Filipendula bunghole parabolicness Florissant cubby pseudohalogen redecrease stormy preparative
-unpredict flatman bozal havoc phytoma Alethea flatman visceral
-snare velaric bacterioblast chilblain reciprocation
-glyphography plugger unanatomized ribaldrous astronomize glacierist
-molecule unrealize rechar Fouquieria paradisean
-heliocentricism transude counteralliance antineuritic spermaphyte mediateness Pincian characinoid psychofugal
-hysterogen exprobratory aurothiosulphuric eer meriquinoidal subdentate tartrous wherefrom scyphostoma
-deindividualization manilla entame chalcites Whilkut
-atlantite nonprofession dispermy mediateness noncrystallized tomorrowness japanned
-craglike redescend tingly feasibleness unisexuality scapuloradial molossic shola waird
-unevoked shola serphoid nebular anta chronographic classificational verbid paradisean
-ladhood speckedness testa hyocholic bathysphere umangite
-trip saguran underogating euphemize generalizable avengeful sloped
-superindifference euphemious lifter yote tartrous
-drome mediateness Machiavel Yannigan antihero arrowworm
-heavenful provedore terrificness uncombable Russifier besagne Harpa ell
-lineamental parquet unobservantness bugre homotransplant alveolite mustafina
-pamphlet kerykeion Prosobranchiata massedly arsenide
-umangite mangonism Gilaki decardinalize heavenful bladderwort overcultured stiffish knob
-dastardliness chasmy kenno Dictograph Homoiousian inductivity glossing Haversian dipsomaniacal
-Dunlop glacierist Triphora imprescribable reformatory pyxie cretaceous paranephros
-parastas jajman overcultured transcortical bespin plerome migrainoid coldfinch
-sarcologist analgic dithery Triconodonta consumptional
-splenauxe manny crystallographical balanocele Chiasmodontidae
-endotheliomyoma winterproof chronographic orchiocatabasis enhedge unleavened hellbender countergabion
-unharmed hemimelus unschematized vinegarish sequentially
-hymnic impugnation trabecular Gothish undercolored macropterous
-hypoid bacterioblast cervisial vinegarish chronist
-gorilloid breadwinner abthainry pentosuria smokefarthings poleax paleornithology intrabred
-umbellic abthainry overstudiousness stachyuraceous imaginary cloy manilla
-hypochondriacism equiconvex tickleproof undecorated spiciferous frameable reformatory
-nonprofession technopsychology predebit thermochemically Kenipsim throbless knob depthwise
-pomiferous acocotl componental cresylite neuromimesis rechar benthonic Cimmerianism
-Thraupidae Serrifera trillion unscourged idiotize
-Edo terrificness aspersor subsequentially visceral
-dermorhynchous thermoresistant aurothiosulphuric frameable sleigher rotular
-uncompromisingness Pithecolobium afterpressure pseudoxanthine allectory chargeably sangaree pictorially glossing
-Oryzorictinae trailmaking brooky choralcelo nonlustrous
-Vaishnavism antineuritic snare pentosuria manny sterilely Jerusalem
-unprovided snare zenick unstressedly counteralliance Semecarpus Triconodonta counteractively
-manny slipped manny depthwise porencephalous
-Pishquow tomorn prefatorial ultratense antideflation authorling chilblain percent arteriasis
-silverhead terrificness allectory ten dermorhynchous ethnocracy
-bathysphere periarthritis Munychian benthonic undeterring eucalypteol outwealth wemless Swaziland
-experientialist dunkadoo noncrystallized allegedly glyphography pneumatotherapy bunghole toxoplasmosis
-thorite angiolymphoma undeterring diurnalness benzoperoxide
-chooser poleax totaquina wandoo sturdied paunchy pachydermatoid impugnation
-Lemuridae Lincolnlike hackneyed transude uninductive figureheadship Scanic
-pentosuria euphonym manny bacillite pyxie Inger helminthagogic
-limpet prescriptible Lincolnlike glandularly idiotize untongued vitally jharal unlapsing
-Joachimite bromate antivenin redescend folious
-plugger sawdust overbuilt refasten metaphonical
-twinling omega unobservantness Edo oflete helpless reeveland
-authorling twinling warlike eer Christianopaganism tartrous oxyterpene allectory scrat
-obolus suspend goodwill cockal inductivity scabbiness
-uncompromisingness Bertat overcontribute Cimmerianism tricae
-tramplike sarcologist larklike basto depressingly
-becomma calabazilla aprosopia Dawsonia pachydermatoid feasibleness
-cresylite ferrogoslarite decidable reformatory Triconodonta entame clanned
-uncompromisingly biopsic boser unexplicit sawdust noreast Effie veterinarian
-kenno halloo Munychian Harpa subangulated pansophism
-Filipendula doubtingness abstractionism aurothiosulphuric Bushongo Bulanda
-spiranthic Serrifera minniebush participatingly lifter outguess reperuse circumzenithal ultrasystematic
-limpet flushgate dastardliness codisjunct outwealth crystallographical tingly coldfinch perfunctory
-uncompromisingness dialoguer terrestrially adatom Scanic
-metastoma diminutively Swaziland isopelletierin preparative
-Hydrangea Caphtor omega scapuloradial pictorially supraoesophageal nonpoisonous elemicin
-totaquina trip hysterolysis winterproof Dodecatheon intuition familist
-bathysphere Passiflorales nonprofession botchedly eristically sturdied pelf pseudoxanthine Swaziland
-dishpan bismuthiferous periarthritis Russifier friarhood guanajuatite blurredness Hydrangea
-signifier blurredness reconciliable tetchy pendulant lithograph concretion antalgol
-canicule okonite infravaginal kenno saguran orthopedical
-Cercosporella golem mesymnion comism metaphrastical Triphora
-glyphography Consolamentum octogynous uvanite sequacity glacierist
-regardful Llandovery pleasurehood gorilloid diatomaceous velaric kenno outwealth slipped
-unaccessible depravity symbiogenetically nigh pseudohalogen yeelaman
-wherefrom patroller bestill eurythermal brag
-Italical minniebush outguess reconciliable bucketer componental
-thermochemically nonexecutive pamphlet zanyism manilla poleax Ludgatian antiabolitionist asparaginic
-botchedly cretaceous posttraumatic unbashfulness gelatinousness
-breadwinner Dadaism enhedge Prosobranchiata waird angina
-tautness Itea unburnt alveolite flippantness predisputant
-overinstruct retinize frameable vesperal underskin alen byroad adz
-thermoresistant bettermost prescriptible semantician lifter chilblain topsail
-planosubulate charioteer mechanist Eryon docimastical Aktistetae Helvidian trillion posterishness
-preoral transude epididymitis Machiavel golem scabbiness sud tartrous
-ultratense adz unexplicit Jerusalem appetible Machiavel cinque Quakerishly ultraobscure
-guitarist arsenide jharal nummi apocalypst metaphrastical
-arteriasis Cephalodiscus uninterpleaded Socraticism inventurous
-critically cresylite tomorrowness inferent merciful neurotrophic crystallographical supermarket debellator
-triradiated apopenptic pompiloid biodynamics merciful arrowworm volcano japanned participatingly
-atlantite ineunt codisjunct quadrennial misexposition strander quailberry papery
-mesophyte chordacentrum wemless adscendent chrysochrous marshiness
-edificator Consolamentum oflete Spencerism pterostigma paunchy uncarefully cyanophilous airfreighter
-manilla returnability pleasurehood columniform uncontradictableness
-uncarefully aconitine outhue rotular intuition signifier Confervales cartful templar
-winterproof doina timbermonger benzothiofuran zenick chacona steprelationship ascitic hypochondriacism
-hoove porriginous undecorated daytime galbulus hypochondriacism cinque redescend extraorganismal
-erythremia snare ungouged diplomatize charioteer regardful aspersor tendomucoid omega
-ungreat ramosopalmate spot Sphenodontidae balladmonger perfunctory noreast
-slangy gemmeous verbid opacousness mangonism eternal
-unstipulated nativeness unobservantness pony swoony diplomatize pentagamist
-thermanesthesia palaeotheriodont underskin boor posterishness
-outhue Glecoma affaite aprosopia angina naprapath quarried downthrust seelful
-reformatory tetragynian chargeably gallybeggar undeterring exploiter
-ethmopalatal benzothiofuran deaf by dispermy alveolite
-liquidity abstractionism lophotrichic trailmaking Endomycetaceae ungrave mustafina brutism vesperal
-prepavement verbid unefficient epauliere Triconodonta Yannigan signifier
-ungouged cromlech Pishquow spermaphyte Harpa overstaid charioteer
-comism inductivity floatability circumzenithal nonpoisonous arrendation
-wemless Joachimite mutter pondside antineuritic prescriptible
-refasten pyxie havoc rehabilitative canicule Russifier Scorpaenidae unscourged Christianopaganism
-stormy umbellic bromic bespin homeotypical posterishness
-mustafina lienteria prolificy arteriasis doubtingness
-aspersor shibuichi rainproof planispheric pleasurehood
-Hysterocarpus bought diopside whittle nonrepetition chronographic Cercosporella
-codisjunct diatomaceous relaster antiscolic pompiloid
-meriquinoidal infestation stradametrical unrealize saponaceous tartrous approbation infestation
-decardinalize diplomatize temporomastoid pondside spookdom toxoplasmosis fetlocked sangaree outguess
-scrubbed friarhood cartful benzoperoxide sterilely Tamil squit Ophiosaurus
-papery raphis pentosuria gunshop proacquittal mesophyte
-hondo transude scapuloradial trophonema bunghole serphoid characinoid
-unswanlike Fameuse inductivity columniform subirrigate unchatteled nonuple bugre extraorganismal
-limpet Chiasmodontidae valvula pictorially beadroll antiabolitionist
-frenal karyological diurnalness beadroll admissory
-okonite suspend iniquitously entame pelf
-homeotypical molossic molossic rave flatman atlantite nonutilitarian opacousness idiotize
-rehabilitative penult familist halloo focaloid jharal Munychian inventurous
-uninterpleaded temporomastoid whitlowwort pope imperceptivity wemless warriorwise ambitus quailberry
-transcortical insatiately antalgol velaric bacterioblast signifier terrestrially cheesecutter
-semantician benzoperoxide bogydom kerykeion fetlocked cockal Sphenodontidae Eleusinian
-Savitar preparative Uraniidae scrat slait pachydermatoid friarhood alen
-genii bubble unswanlike Inger vinny unlapsing Aplacentalia horsefly
-underogating snare blurredness hepatorrhaphy tickleproof supraoesophageal
-ascitic bromate unscourged unburnt playfellowship nonpoisonous elastivity larklike
-venialness beatable approbation cyanophilous Bassaris saponaceous rosaniline
-corbel scapuloradial apopenptic mustafina manilla prezygapophysial
-tantivy pneumonalgia arteriasis Spatangoidea ineunt nonmanufacture tartrous
-outhue sural biventer boser circumzenithal uninterpleaded lebensraum charioteer
-counterappellant frontoorbital infravaginal vitally metastoma omniscribent unchatteled
-abusiveness genii waird rechar uncontradictableness symbiogenetically snare
-serpentinic weism hypochondriacism subtransverse undercolored tonsure friarhood tetchy
-moodishness Auriculariales posterishness pentosuria componental Munnopsidae overstudiousness
-fallacious diurnalness discipular airfreighter jirble
-beatable cattimandoo arduousness trisilicic trillion twinling erythremia
-brutism Munychian quad Bassaris wingable scabbiness chacona friarhood
-rave coadvice sombreroed homotransplant splenauxe parodist
-antivenin Mycogone palaeotheriodont cumbrousness giantly Bushongo taurocolla Jerusalem
-ordinant strammel parmelioid paleornithology orthopedical
-bozal steprelationship havoc proauction proacquittal chronist heavenful
-refasten unsupercilious Sebastian pamphlet unstressedly
-moodishness pansophism affaite uniarticular parmelioid allectory erythrodextrin
-pyxie templar figureheadship serosanguineous octogynous
-placatory dishpan periarthritis scrubbed Semecarpus temporomastoid
-unreprimanded pentosuria temporomastoid emir imprescribable unpredict hackneyed uloid
-unschematized spookdom pondside Machiavel sertularian reciprocation
-reciprocation outwealth besagne hellbender monogoneutic adz aspersor pseudoxanthine emir
-angiolymphoma ornithodelphous codisjunct taurocolla zoonitic cretaceous
-quailberry venialness Glecoma besagne imprescribable
-metastoma hackneyed unanatomized nummi parabolicness elastivity
-undiffusive prescriptible Caphtor ungreat thiodiazole
-chargeably angiopathy unpeople debellator bot
-foursquare testa dehairer electrotechnics calabazilla interruptor vitally bozal
-chronist schoolmasterism unburnt trillion becomma
-unleavened hepatorrhaphy coldfinch cretaceous sequentially noncrystallized boor
-ambitus extraorganismal Hysterocarpus critically prospectiveness byroad
-prolificy phytonic sud magnificently autoschediastical insatiately unanatomized
-Dawsonia spiranthic hypochondriacism homeotypical psychofugal
-Hu diminutively Caphtor halloo stiffish
-Caphtor scrubbed propheticism planispheric dinical Ochnaceae cheesecutter
-Gothish blurredness danseuse stereotypography arrendation peristeropode lammy
-choralcelo spookdom counteralliance byroad Cephalodiscus almud
-projecting plugger boser arduousness infrastapedial chrysochrous Hydrangea
-overbuilt shallowish osteopaedion Mormyrus outguess stachyuraceous unimmortal uncarefully nonutilitarian
-sapphiric galbulus Bushongo piquantness idiotize
-manilla seelful aprosopia overcrown calycular Ophiosaurus
-phallaceous nigh ethnocracy concretion liberatress warriorwise rehabilitative adz electrotechnics
-boser dispermy seeingness sarcologist amylogenesis lithograph bacterioblast rizzomed heavenful
-daytime eternal decidable spiciferous docimastical interfraternal admissory
-orchiocatabasis marshiness starosta gorilloid counteralliance putative Lincolnlike
-uncompromisingness Semecarpus abthainry dehairer astucious cubit corona sesquiquintile zoonitic
-pentafid corelysis pyroacetic euphonym chilblain lienteria dunkadoo
-pyroacetic embryotic pneumonalgia unburnt mastication stronghearted
-abstractionism byroad Hydrangea manganosiderite scapuloradial decardinalize valvulotomy qualminess barkometer
-stewardship Isokontae ambitus Babylonism myesthesia uninductive imprescribable unstressedly
-regardful unrealize arval depravity gemmeous
-alen shallowish dishpan diplomatize insatiately
-bogydom laubanite prolificy Jerusalem testa meloplasty
-dinical tautness Scanic Chiasmodontidae trunnel epauliere
-champer sequentially porriginous porriginous enation glyphography mammonish
-parquet stewardship Orbitolina Ophiosaurus meloplasty starer
-louse focaloid minniebush imaginary sarcologist exprobratory discipular
-spiranthic unevoked Kenipsim rehabilitative unimmortal Eleusinian unpatched expiscate
-Endomycetaceae sarcologist sportswomanship frictionlessly rehabilitative Vaishnavism
-serpentinic antalgol Munnopsidae bonze angiolymphoma eristically stradametrical
-Alethea glacierist seeingness Munnopsidae pterostigma
-Bassaris rainproof bettermost diatomaceous Uraniidae neurodegenerative poleax
-Savitar meriquinoidal squdge prescriber groundneedle idiotize
-vinny ell tailoress goladar exprobratory qualminess mechanist
-hogmace reperuse astronomize vitally Cimmerianism eurythermal seizing
-golem calabazilla migrainoid bathysphere counteractively nonmanufacture pleasurehood knob Semecarpus
-glandularly Machiavel prepavement equiconvex prescriber iniquitously
-pondside monstership Mesua seelful winterproof
-reeveland imprescribable gala sonable figureheadship masa Megaluridae culm
-aspersor semantician Dawsonia erlking frictionlessly ungouged fetlocked pachydermous stormy
-guitarist sonable trailmaking champer sertularian prescriber balanocele prescriber
-comprovincial vesperal bacillite allectory ordinant
-tramplike dinical thorite byroad swacking
-pentafid beatable Harpa swacking tautness cumbrousness aconitine ultrasystematic inferent
-coracomandibular erythremia sportswomanship evictor transudatory stormy sirrah
-Muscicapa swangy cornberry stroking blightbird pyroacetic Cephalodiscus naprapath
-hemimelus homeotypical stapedius slipped subtransverse mammonish
-guanajuatite nectopod sirrah Llandovery eer guanajuatite bought
-saccharogenic Fouquieria archesporial quarried counteralliance adatom scotching balladmonger chronographic
-gorilloid timbermonger papery elastivity sural stereotypography
-cacuminal helpless Bertat untongued astronomize arteriasis proacquittal
-farrantly photoelasticity counteralliance saccharogenic focaloid gymnastic characinoid refective balladmonger
-pachydermatoid expiscate instructiveness obolus adatom gul chorograph antalgol
-sedentariness undinted unefficient disilane eurythermal abusiveness
-tetrahedral inventurous biodynamics cresylite interruptedness metaphrastical commotion dispermy
-metaphonical prezygapophysial concretion lebensraum bogydom upswell cockstone biopsic sviatonosite
-besagne infravaginal overwoven rechar snare
-divinator starosta unstressedly upswell Auriculariales cobeliever cuproiodargyrite
-liquidity bot vesperal palaeotheriodont stiffish Pyrales charioteer
-concretion rotular acidophile lithotresis mesophyte liberatress shellworker overcultured
-ethnocracy widdle fetlocked stroking mutter overbuilt
-ell infestation times Endomycetaceae unrealize genii sirrah kerykeion
-unurban reconciliable slangy unburnt Eryon metapolitics iniquitously serphoid lampyrine
-fallacious scabbardless angiolymphoma exploiter omniscribent avengeful
-Cercosporella paradisean enterostomy horsefly lampyrine furacious Quakerishly epididymitis
-naprapath ventricous omniscribent regardful ipomoein Ophiosaurus apocalypst Machiavel flushgate
-golem trillium templar autoschediastical almud catabaptist overstaid Bermudian manny
-nummi stormy pumpkinification pompiloid adatom metaphrastical unanatomized insatiately prescriber
-archesporial putative underskin uvanite Confervales Spencerism tingly Eryon
-trophonema lophotrichic antiscolic unharmed hyocholic ethmopalatal floatability yote
-engrain aprosopia sural molecule paradisean wherefrom Pithecolobium
-molecule morphiomania dosseret relaster paranephros concretion overbuilt interruptedness
-lifter brutism Sphenodontidae Uraniidae unrealize
-Whilkut airfreighter antalgol appetible Filipendula comparability
-phytonic laubanite Russifier subfebrile subdentate oversand
-propodiale sequacity goodwill mutter chargeably
-undercolored Macraucheniidae Chiasmodontidae quailberry lampyrine guanajuatite
-retinize parastas glandularly tetrahedral noncrystallized skyshine entame
-pneumonalgia cobeliever thermoresistant Savitar laubanite pyrocatechol
-uvanite karyological dispermy discipular pansophism endotheliomyoma Alethea
-bot myesthesia ploration archistome prezygapophysial wingable unswanlike cocksuredom corona
-okonite counteractively dunkadoo asparaginic lophotrichic
-pentafid hogmace cornberry rechar arrowworm Dadaism neuromimesis
-circumzenithal abusiveness pendulant quad Dunlop subofficer saccharogenic unstressedly stapedius
-trillion metrocratic amplexifoliate Vaishnavism Tsonecan
-besagne Oryzorictinae anta cocksuredom authorling trunnel allectory unisexuality
-refective bettermost valvulotomy unanatomized intuition Triconodonta
-sarcologist nonprofession mediateness nonuple constitutor subfoliar Pishquow
-endotheliomyoma Babylonism obolus tum feasibleness friarhood overstaid semantician
-cyanoguanidine doina serpentinic tartrous pseudohalogen predebit cacuminal pumpkinification
-helminthagogic tendomucoid abscission thorite unpredict cyanophilous aconitine cuproiodargyrite seraphism
-classificational hypoplastral figured merciful stiffish uncarefully prescriber
-redecrease Bertat Edo massedly impressor merciful whittle collegian erythrodextrin
-ventricous Gilaki tingly aspersor familist
-critically limpet jajman tailoress cinque Spatangoidea selectivity
-Bertat euphemize neurodegenerative sedentariness interfraternal monstership consumptional
-pleurotropous manny consumptional erythrodextrin mechanist manganosiderite
-posterishness Pishquow Pithecolobium ovopyriform Bishareen Coniferae thermanesthesia overwoven
-wemless penult frontoorbital alen pyxie subofficer licitness swangy leucophoenicite
-heliocentricism decidable qualminess potentness unaccessible frenal goodwill impugnation Triphora
-hondo parabolicness jajman dispermy danseuse oratorship Gothish antivenin
-unevoked ununiformly pterostigma gul inferent aquiline Gilaki
-angiopathy boser embryotic imprescribable selectivity bespin goodwill twinling divinator
-apocalypst pomiferous unefficient scrubbed gorilloid
-electrotechnics figured admissory photoelasticity slait pentagamist frameable
-metaphonical besagne cheesecutter Homoiousian bubble provedore deepmost
-counteralliance zanyism Bermudian thorite unchatteled whittle quailberry tetragynian analgic
-cockal serpentinic corona skyshine cattimandoo meriquinoidal slipped Aktistetae interfraternal
-returnability unfurbelowed allectory cattimandoo pope ununiformly
-skyshine Dadaism corelysis balladmonger toplike airfreighter magnificently tickleproof gemmeous
-affaite expiscate farrantly chronographic agglomeratic gemmeous
-piquantness plugger archistome Spatangoidea avengeful arval
-mangonism daytime visceral enation oratorize undercolored overwoven patroller pamphlet
-metopon metaphrastical nativeness eternal oratorship predebit toxihaemia bettermost
-Triconodonta subdrainage trabecular Tamil seraphism
-supermarket amylogenesis blurredness experientialist goladar Serrifera
-bucketer sawdust saccharogenic preoral Prosobranchiata Spencerism redescend byroad
-Llandovery reciprocation silverhead Dadaism sapphiric phoenicochroite tailoress
-sleigher mechanist sequestrum horsefly untongued trip cubit
-Hysterocarpus Bulanda octogynous pomiferous codisjunct paradisean Tamil circular seditious
-avengeful unscourged nonpoisonous subsequentially stronghearted Filipendula
-Munnopsidae throbless transudatory scabbiness feasibleness predebit
-ramosopalmate coldfinch bathysphere hackneyed steprelationship shellworker hogmace Mycogone
-karyological euphemious supermarket penult imaginary danseuse warriorwise abusiveness corona
-nonsuppressed peristeropode Lincolnlike rehabilitative crystallographical veterinarian
-uninhabitedness sialadenitis monstership acidophile sombreroed undinted shallowish inventurous airfreighter
-helpless swacking flatman putative unchatteled wherefrom sturdied reformatory
-cacuminal stachyuraceous Caphtor pelf rave crystallographical tramplike quad depravity
-bromate testa frontoorbital unscourged mangonism unreprimanded sapphiric frontoorbital vinegarish
-Cimmerianism impressor shallowish unobservantness ladhood placatory centrifugalization euphemize lammy
-comism pleurotropous critically perfunctory aquiline
-ambitus unschematized synovial pictorially undecorated
-unexplicit cromlech inductivity periarthritis hoove
-anta isopelletierin Homoiousian benzothiofuran transude tum hysterolysis
-trailmaking metrocratic toxoplasmosis apopenptic cloy Coniferae boser
-Confervales unexplicit rebilling uncontradictableness toxihaemia opacousness
-cacuminal chasmy imaginary aquiline valvulotomy endotheliomyoma
-Inger astronomize bettermost underogating fetlocked
-okonite squit oblongly Whilkut trisilicic
-glossing intrabred sheepskin shola nonrepetition
-kenno infrastapedial concretion nonutilitarian nonmanufacture rizzomed focaloid ethnocracy naprapath
-Tamil guanajuatite swangy benthonic rede
-cockstone antideflation mammonish metaphonical predebit Hydrangea
-uninterpleaded atlantite ovoviviparous acocotl overbuilt
-mendacity cobeliever besagne concretion balanocele
-antineuritic propheticism cyanophilous mangonism Eryon Sebastian collegian
-divinator exprobratory Hydrangea skyshine Megaluridae karyological agglomeratic
-prefatorial stormy transude comparability commotion endotheliomyoma subfoliar
-allectory myesthesia stapedius Macraucheniidae weism
-hoove starer guitarist limpet unpatched Spatangoidea projecting
-planosubulate subfebrile spermaphyte saccharogenic cyanophilous
-penult collegian uninductive Eleusinian Hester underskin sleigher Serrifera
-paranephros reformatory involatile Macraucheniidae Ghent triakistetrahedral atlantite antiadiaphorist
-spookdom diopside penult nigh spherulitic subangulated Muscicapa aspersor clanned
-agglomeratic prescriber embryotic comprovincial Socraticism introducer glyphography
-undinted euphemize diurnalness autoschediastical beatable imprescribable
-valvula seminonflammable chordacentrum dehairer mendacity projecting
-unimmortal piquantness myesthesia generalizable Coniferae misexposition preparative larklike unfulminated
-unimmortal monstership lifter retinize precostal glyphography
-bromate unschematized ferrogoslarite adatom pinulus
-uninterpleaded genii pentosuria verbid preaffiliate depravity Spencerism
-Hu thermanesthesia unfulminated componental Sebastian impairment
-Edo patroller autoschediastical tetchy shallowish
-Thraupidae visceral boser relaster whittle
-Savitar paranephros preaffiliate lampyrine macropterous predisputant deepmost
-warlike abusiveness Tamil stormy furacious leucophoenicite
-limpet experientialist Megaluridae tonsure misthread benzoperoxide strander hellbender uloid
-mangonism paranephros erythremia whittle emir impairment peristeropode
-choralcelo pondside hypoid mutter sud prescriber transcorporeal oratorship
-Russifier verbid Pithecolobium sud glossing epauliere abusiveness
-Dawsonia licitness oinomancy planosubulate cromlech visceral
-Cephalodiscus angina ambitus periarthritis Jerusalem unreprimanded Dictograph unprovided
-uninterpleaded drome stachyuraceous aprosopia unprovided eulogization spherulitic
-inventurous shallowish quadrennial iniquitously jharal provedore balladmonger
-predebit rechar experientialist infravaginal Saponaria refective
-folious bunghole bespin inductivity imperceptivity ladhood winterproof visceral
-pachydermatoid octogynous throbless overwoven licitness comism eternal kenno
-Aktistetae nonexecutive pseudohalogen glandularly aurothiosulphuric terrestrially Mesua codisjunct botchedly
-cresylite orgiastic iniquitously porriginous hypoplastral pope Whilkut gallybeggar uncontradictableness
-sapphiric comism authorling unpredict arrowworm symbiogenetically
-arteriasis cockal eristically nummi gorilloid overbuilt charioteer propodiale balanocele
-sandbox noncrystallized instructiveness Prosobranchiata antalgol refasten
-breadwinner timbermonger archistome authorling analgic
-trip Eleusinian stormy bicorporeal oinomancy Hysterocarpus lifter
-inertly daytime Ophiosaurus circumzenithal admissory concretion crystallographical coadvice counteralliance
-ell unurban lineamental interfraternal isopelletierin
-cretaceous exploiter uncarefully cubby rivethead uninhabitedness oversand uvanite mendacity
-almud boor widdle hogmace toxoplasmosis unharmed
-taurocolla repealableness ramosopalmate ascitic dastardliness Filipendula dunkadoo giantly lebensraum
-osteopaedion pseudoxanthine botchedly hepatorrhaphy redesertion Hysterocarpus diplomatize paradisean steprelationship
-allectory mericarp dipsomaniacal reconciliable pendulant subirrigate leucophoenicite deepmost misthread
-refective Tamil angina dastardliness swangy
-golem dialoguer hemimelus culm parmelioid
-sloped technopsychology seminonflammable pachydermatoid transude propheticism trip arrendation warriorwise
-peristeropode halloo consumptional ambitus nummi
-Vaishnavism liquidity involatile incalculable papery mutter starosta quadrennial figureheadship
-ornithodelphous paunchy prescriber decidable dermorhynchous exploiter ticktick lifter
-spot seizing benzothiofuran unisexuality laryngic infestation
-abthainry undercolored balladmonger chronographic saponaceous orthopedical infestation enterostomy unforkedness
-collegian alveolite templar wandoo osteopaedion barkometer frontoorbital serosanguineous mericarp
-transcortical pneumonalgia micromembrane diurnalness chargeably hysterolysis osteopaedion
-phlogisticate Scanic cumbrousness unachievable ten imprescribable jajman
-unurban antineuritic unefficient templar squdge Spencerism orchiocatabasis fetlocked
-stradametrical wherefrom subdentate Gothish impugnation componental
-eucalypteol jharal fallacious spermaphyte ultratense arrendation
-horsefly diathermacy dermorhynchous agglomeratic wemless Homoiousian
-amylogenesis knob Aplacentalia giantly pentafid genii
-by velaric proauction oratorship commandingness Haversian uncompromisingly
-toxihaemia provedore psychofugal bonze digitule
-orgiastic coldfinch danseuse introducer almud merciful manganosiderite chorograph
-chorograph planispheric plugger unpatched pyroacetic Alethea benzothiofuran counterappellant
-anta sapphiric benthonic allotropic gelatinousness
-gul pneumatotherapy bismuthiferous prospectiveness bromate unrealize hondo
-laurinoxylon lithotresis flippantness consumptional slipped
-overwoven Pincian stiffish aconitine seizing instructiveness endotheliomyoma halloo
-ultrasystematic instructiveness unimmortal Lemuridae basto groundneedle outwealth
-rivethead saccharogenic nigh scyphostoma balladmonger pachydermatoid
-gala fossilism ultratense ladhood orchiocatabasis upswell catabaptist Italical unprovided
-penult phallaceous cornberry Vaishnavism times Bulanda divinator
-licitness benzoperoxide Helvidian mesymnion acidophile
-brutism cubit dipsomaniacal oxyterpene ungouged Edo nonprofession
-chorograph Prosobranchiata unfulminated diwata symbiogenetically swearingly Sphenodontidae unrepealably
-bromic preoral stradametrical undercolored dithery
-electrotechnics scabbardless seminonflammable imprescribable infrastapedial nonsuppressed
-thermanesthesia angina okonite bestill authorling Scorpaenidae louse by
-waird deaf epauliere pentafid ethnocracy misthread scotale balladmonger bonze
-subdrainage piquantness impairment arrowworm vinegarish atlantite poleax
-manganosiderite perfunctory periclitation bicorporeal arteriasis embryotic Pithecolobium sturdied
-phoenicochroite unscourged sialadenitis whitlowwort terrestrially proacquittal almud Bassaris
-Mormyrus tartrous toplike vinegarish absvolt
-divinator gemmeous sapience laurinoxylon seizing orchiocatabasis benthonic depressingly quailberry
-sheepskin stapedius hypochondriacism sviatonosite preparative adatom docimastical
-overstudiousness barkometer benzoperoxide divinator masa chordacentrum scapuloradial
-omniscribent Hydrangea myesthesia lineamental Haversian
-Bassaris warlike doina overinstruct Animalivora
-vitally Florissant prepavement imaginary yeelaman outwealth
-potentness epididymitis doina overwoven sheepskin pendulant scabbardless ultrasystematic gelatinousness
-liberatress blurredness benzoperoxide predisputant throbless prolificy pomiferous
-unachievable ungouged gunshop bacterioblast photoelasticity mesymnion scabbardless misthread
-subfoliar aconitine corelysis undecorated acocotl sud
-ultraobscure oinomancy hemimelus seelful liberatress aquiline Dodecatheon clanned
-dipsomaniacal abthainry gorilloid dithery bot smokefarthings cloy
-uncombable brooky magnificently bought fossilism concretion technopsychology depravity subtransverse
-subofficer debellator angiolymphoma venialness Arneb pictorially warlike sarcologist
-Munychian neuromimesis sesquiquintile sportswomanship Dawsonia Socraticism incalculable bugre outhue
-figureheadship sviatonosite uninductive unstipulated planosubulate horsefly weism
-characinoid poleax benzoperoxide sedentariness Isokontae
-stormy oinomancy Edo stewardship ambitus technopsychology yeat sapience
-diatomaceous unrepealably rainproof transude nonprofession phlogisticate Glecoma scyphostoma
-discipular seelful nonuple neurotrophic coadvice pony zenick
-saccharogenic insatiately proboscidiform blurredness stormy dialoguer floatability
-becomma zoonitic whittle wingable phytonic
-cumbrousness weism componental bismuthiferous underogating Scanic sombreroed electrotechnics planosubulate
-glacierist octogynous dithery chacona monilioid overcrown friarhood unrepealably
-digitule trabecular projecting oratorize phlogisticate Fouquieria
-times atlantite sesquiquintile comism Scorpaenidae volcano
-reconciliable warlike raphis spookdom monilioid ventricous relaster migrainoid arduousness
-relaster subangulated evictor rave tartrous pumpkinification
-pictorially intrabred devilwise abstractionism calycular misexposition cockal uloid
-spot sturdied paunchy plerome Inger
-critically spherulitic Triconodonta balladmonger penult comparability aurothiosulphuric Itea
-saccharogenic greave inexistency horsefly cocksuredom
-afterpressure selectivity triakistetrahedral cacuminal shellworker Muscicapa
-mustafina prospectiveness horsefly sombreroed yawler reperuse pleasurehood blurredness
-inductivity unschematized neurodegenerative diurnalness subsequentially soorkee divinator Megaluridae
-arteriasis Mesua allectory farrantly toplike guitarist
-aquiline codisjunct squdge allectory pelf squit palaeotheriodont asparaginic
-Saponaria diminutively chooser Homoiousian eer dipsomaniacal impressor jajman
-approbation physiologian immatchable antiadiaphorist seminonflammable
-coldfinch psychofugal Animalivora ultrasystematic corelysis
-oinomancy Joachimite tartrous interruptedness pelf overwoven acocotl
-refective metopon proboscidiform overstudiousness pope nonrepetition
-chargeably giantly imprescribable unprovided clanned farrantly
-absvolt Shiah cockstone trillium absvolt planosubulate scotching cornberry throbless
-lyrebird constitutor pomiferous pneumatotherapy orthopedical potentness strammel porriginous seraphism
-unrepealably unburnt Endomycetaceae dehairer meriquinoidal isopelletierin tricae involatile
-diatomaceous scapuloradial epidymides tickleproof euphemize bunghole Triconodonta
-taurocolla collegian beneficent pony reformatory Yannigan orgiastic pope
-peptonate swangy pictorially obolus ploration benzothiofuran exploiter Scorpaenidae
-Spencerism bugre squdge ultratense uvanite approbation relaster
-Edo Eleusinian spiranthic pictorially countergabion bettermost tickleproof
-Fouquieria tetrahedral dishpan putative pictorially ambitus Effie unreprimanded
-bot metopon synovial undecorated preparative airfreighter
-sangaree pompiloid antiscolic coracomandibular epauliere
-undiffusive scabbardless vinny Bertat Passiflorales sloped undercolored
-lithograph Shiah erythrodextrin slipped peptonate larklike
-scotale various unstressedly relaster limpet
-stapedius ultratense sedentariness hellbender dipsomaniacal trunnel familist ovoviviparous stronghearted
-mastication impairment basto spiranthic tickleproof uncombable eurythermal various
-gala Alethea quad umbellic decidable orgiastic
-antihero enhedge jharal cumbrousness rede overstudiousness transude wingable
-gemmeous hypoid characinoid analgize Chiasmodontidae
-unharmed okonite merciful chacona jirble
-pentagamist acocotl seraphism cuproiodargyrite dermorhynchous debromination metrocratic
-shellworker atlantite doina paradisean circumzenithal stewardship scapuloradial
-regardful involatile bromic ladhood barkometer circular unpeople
-heliocentricism mechanist byroad Animalivora strammel veterinarian
-depthwise jirble nativeness marten preparative dosseret
-Zuludom floatability mangonism sesquiquintile thorite sertularian pleurotropous Prosobranchiata
-prezygapophysial terrestrially Prosobranchiata cresylite topline umangite lineamental
-coracomandibular counterappellant preagitate Confervales insatiately skyshine proauction
-omega Prosobranchiata deepmost subdrainage planosubulate
-Triphora debromination isopelletierin Aplacentalia monstership redesertion imprescribable sedentariness meriquinoidal
-Savitar uninhabitedness Eleusinian cubby Russifier propheticism beatable pterostigma prolificy
-pansophism focaloid eulogization impairment Hydrangea antineuritic
-gala decardinalize frameable lienteria seditious
-deepmost uncompromisingness Prosobranchiata Confervales Macraucheniidae classificational dunkadoo biodynamics returnability
-embryotic gymnastic toxoplasmosis anta analgize adscendent louse Hysterocarpus undinted
-divinator Jerusalem brooky flushgate saccharogenic ultratense ell
-Pishquow affaite putative supermarket schoolmasterism squit unisexuality centrifugalization lampyrine
-liberatress antivenin marten selectivity scapuloradial uninterpleaded scrubbed lithotresis
-gul avengeful licitness analgic rainproof schoolmasterism cresylite yote
-phoenicochroite euphemious hackneyed unprovided bucketer fallacious carposporangial repealableness jirble
-ticktick subdrainage biodynamics michigan comism
-sialadenitis vinegarish pterostigma debellator noncrystallized
-frenal bugre suspend pictorially parabolicness vinny pelf
-scotching skyshine homeotypical Fameuse Gilaki serosanguineous Hydrangea
-umbellic planosubulate dithery various reappreciate stroking rizzomed chrysochrous
-slangy uninterpleaded reciprocation unisexuality subirrigate Joachimite
-unimmortal undiffusive instructiveness chordacentrum Passiflorales
-overwoven timbermonger Protestantize slangy visceral concretion
-dithery commandingness Bassaris uncompromisingness redescend placatory myesthesia chrysochrous
-aspersor proacquittal raphis cylindric overstudiousness symbiogenetically
-wherefrom adatom undeterring marten centrifugalization trisilicic uncontradictableness
-Inger cocksuredom seminonflammable pompiloid concretion epauliere technopsychology peristeropode
-rizzomed metastoma basto imperceptivity canicule
-foursquare prescriptible Coniferae soorkee Yannigan unswanlike Aplacentalia
-bladderwort lyrebird boor trophonema embryotic
-raphis tristich impressor dunkadoo seditious insatiately chronist throbless
-bromic scotale migrainoid oblongly reperuse cervisial dialoguer Haversian
-Vaishnavism greave exprobratory saponaceous redesertion bozal
-unexplicit zenick liberatress Scorpaenidae transcortical componental Megaluridae naught
-provedore codisjunct intuition penult absvolt temporomastoid vinegarish monogoneutic
-vesperal peristeropode swangy unisexuality vesperal
-cocksuredom balanocele glossing participatingly liquidity lifter Fouquieria
-theologal archididascalian divinator impairment gymnastic characinoid topsail impressor
-metapolitics unschematized knob proauction peristeropode jajman glaumrie commandingness
-oflete generalizable frictionlessly overbuilt pseudohalogen cacuminal
-commandingness stereotypography oflete seditious nonuple arrowworm debellator rave
-twinling times unpatched dinical pneumonalgia mendacity
-Hysterocarpus pony massedly stachyuraceous unlapsing palaeotheriodont chorograph
-chronographic sapphiric cyanophilous tramplike laryngic
-putative figured euphemious Homoiousian dastardliness Bermudian
-verbid Llandovery papery pneumonalgia glossing ticktick constitutor plugger subdrainage
-Bermudian agglomeratic cylindric sawdust debellator periclitation becomma refasten
-pansophism laubanite pyxie Protestantize metoxazine horsefly repealableness
-basto componental repealableness whitlowwort eristically
-unpredict propodiale endotheliomyoma uvanite sombreroed
-intrabred thiodiazole autobiographist frameable outwealth Edo moodishness unswanlike phytonic
-chasmy phytoma subdrainage Italical amplexifoliate physiologian
-Haversian diplomatize omniscribent pleasurehood mangonism unaccessible
-metastoma unrealize cubby Tsonecan manilla diplomatize
-predebit Consolamentum metapolitics instructiveness familist topline squit Arneb
-slait generalizable unanatomized unreprimanded boor figureheadship omniscribent dialoguer
-flatman serpentinic orgiastic upswell unurban playfellowship ovoviviparous sertularian uncarefully
-lienteria Glecoma playfellowship trophonema subangulated iniquitously proauction
-migrainoid marten thermochemically frontoorbital japanned flutist
-rotular cockstone Edo stradametrical flushgate paranephros okonite
-oversand hymnic subofficer choralcelo sapphiric spiranthic
-unexplicit porriginous familist apocalypst Eleusinian
-yeelaman flutist starosta dunkadoo Spatangoidea Orbitolina Hester terrificness Pyrales
-monander transcorporeal hypochondriacism seeingness octogynous perculsive Shiah analgic
-uniarticular bladderwort Thraupidae bozal warriorwise
-unisexuality palaeotheriodont inventurous bromic dithery unrepealably erlking
-dermorhynchous serosanguineous Pithecolobium parabolicness seizing
-splenauxe impairment seizing magnificently doubtingness imprescribable
-consumptional orgiastic analgic neuromimesis seizing
-Bermudian subdentate quadrennial cylindric lithograph pony paleornithology
-interruptor starosta antiscolic goodwill euphemious
-subofficer avengeful Homoiousian timbermonger antiadiaphorist lient
<TRUNCATED>
[10/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/StringGenSpout.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/StringGenSpout.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/StringGenSpout.java
new file mode 100755
index 0000000..f9c665b
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/StringGenSpout.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.spout;
+
+
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.storm.spout.SpoutOutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichSpout;
+import org.apache.storm.tuple.Fields;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/** Spout pre-computes a list with 30k fixed length random strings.
+ * Emits sequentially from this list, over and over again.
+ */
+
+public class StringGenSpout extends BaseRichSpout {
+
+ private static final String DEFAULT_FIELD_NAME = "str";
+ private int strLen;
+ private final int strCount = 30_000;
+ private String fieldName = DEFAULT_FIELD_NAME;
+ private SpoutOutputCollector collector = null;
+ ArrayList<String> records;
+ private int curr=0;
+ private int count=0;
+
+ public StringGenSpout(int strLen) {
+ this.strLen = strLen;
+ }
+
+ public StringGenSpout withFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ return this;
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare( new Fields(fieldName) );
+ }
+
+ @Override
+ public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
+ this.records = genStringList(strLen, strCount);
+
+ this.collector = collector;
+ }
+
+ private static ArrayList<String> genStringList(int strLen, int count) {
+ ArrayList<String> result = new ArrayList<String>(count);
+ for (int i = 0; i < count; i++) {
+ result.add( RandomStringUtils.random(strLen) );
+ }
+ return result;
+ }
+
+ @Override
+ public void nextTuple() {
+ List<Object> tuple;
+ if( curr < strCount ) {
+ tuple = Collections.singletonList((Object) records.get(curr));
+ ++curr;
+ collector.emit(tuple, ++count);
+ }
+ }
+
+
+ @Override
+ public void ack(Object msgId) {
+ super.ack(msgId);
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/BasicMetricsCollector.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/BasicMetricsCollector.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/BasicMetricsCollector.java
new file mode 100755
index 0000000..686f9da
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/BasicMetricsCollector.java
@@ -0,0 +1,309 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.utils;
+
+import org.apache.storm.LocalCluster;
+import org.apache.storm.generated.Nimbus;
+import org.apache.storm.utils.NimbusClient;
+import org.apache.storm.utils.Utils;
+import org.apache.log4j.Logger;
+
+import java.io.PrintWriter;
+import java.util.*;
+
+
+public class BasicMetricsCollector {
+
+ private LocalCluster localCluster = null;
+ private Nimbus.Client client = null;
+ private PrintWriter dataWriter;
+ private long startTime=0;
+
+ public enum MetricsItem {
+ TOPOLOGY_STATS,
+ XSFER_RATE,
+ SPOUT_THROUGHPUT,
+ SPOUT_LATENCY,
+ ALL
+ }
+
+
+ /* headers */
+ public static final String TIME = "elapsed (sec)";
+ public static final String TIME_FORMAT = "%d";
+ public static final String TOTAL_SLOTS = "total_slots";
+ public static final String USED_SLOTS = "used_slots";
+ public static final String WORKERS = "workers";
+ public static final String TASKS = "tasks";
+ public static final String EXECUTORS = "executors";
+ public static final String TRANSFERRED = "transferred (messages)";
+ public static final String XSFER_RATE = "transfer rate (messages/s)";
+ public static final String SPOUT_EXECUTORS = "spout_executors";
+ public static final String SPOUT_TRANSFERRED = "spout_transferred (messages)";
+ public static final String SPOUT_ACKED = "spout_acks";
+ public static final String SPOUT_THROUGHPUT = "spout_throughput (acks/s)";
+ public static final String SPOUT_AVG_COMPLETE_LATENCY = "spout_avg_complete_latency(ms)";
+ public static final String SPOUT_AVG_LATENCY_FORMAT = "%.1f";
+ public static final String SPOUT_MAX_COMPLETE_LATENCY = "spout_max_complete_latency(ms)";
+ public static final String SPOUT_MAX_LATENCY_FORMAT = "%.1f";
+ private static final Logger LOG = Logger.getLogger(BasicMetricsCollector.class);
+ final MetricsCollectorConfig config;
+ // final StormTopology topology;
+ final Set<String> header = new LinkedHashSet<String>();
+ final Map<String, String> metrics = new HashMap<String, String>();
+ int lineNumber = 0;
+
+ final boolean collectTopologyStats;
+ final boolean collectExecutorStats;
+ final boolean collectThroughput;
+
+ final boolean collectSpoutThroughput;
+ final boolean collectSpoutLatency;
+
+ private MetricsSample lastSample;
+ private MetricsSample curSample;
+ private double maxLatency = 0;
+
+ boolean first = true;
+
+ public BasicMetricsCollector(Nimbus.Client client, String topoName, Map stormConfig) {
+ this(topoName, stormConfig);
+ this.client = client;
+ this.localCluster = null;
+ }
+
+ public BasicMetricsCollector(LocalCluster localCluster, String topoName, Map stormConfig) {
+ this(topoName, stormConfig);
+ this.client = null;
+ this.localCluster = localCluster;
+ }
+
+ private BasicMetricsCollector(String topoName, Map stormConfig) {
+ Set<MetricsItem> items = getMetricsToCollect();
+ this.config = new MetricsCollectorConfig(topoName, stormConfig);
+ collectTopologyStats = collectTopologyStats(items);
+ collectExecutorStats = collectExecutorStats(items);
+ collectThroughput = collectThroughput(items);
+ collectSpoutThroughput = collectSpoutThroughput(items);
+ collectSpoutLatency = collectSpoutLatency(items);
+ dataWriter = new PrintWriter(System.err);
+ }
+
+
+ private Set<MetricsItem> getMetricsToCollect() {
+ Set<MetricsItem> result = new HashSet<>();
+ result.add(MetricsItem.ALL);
+ return result;
+ }
+
+ public void collect(Nimbus.Client client) {
+ try {
+ if (!first) {
+ this.lastSample = this.curSample;
+ this.curSample = MetricsSample.factory(client, config.name);
+ updateStats(dataWriter);
+ writeLine(dataWriter);
+ } else {
+ LOG.info("Getting baseline metrics sample.");
+ writeHeader(dataWriter);
+ this.curSample = MetricsSample.factory(client, config.name);
+ first = false;
+ startTime = System.currentTimeMillis();
+ }
+ } catch (Exception e) {
+ LOG.error("storm metrics failed! ", e);
+ }
+ }
+
+ public void collect(LocalCluster localCluster) {
+ try {
+ if (!first) {
+ this.lastSample = this.curSample;
+ this.curSample = MetricsSample.factory(localCluster, config.name);
+ updateStats(dataWriter);
+ writeLine(dataWriter);
+ } else {
+ LOG.info("Getting baseline metrics sample.");
+ writeHeader(dataWriter);
+ this.curSample = MetricsSample.factory(localCluster, config.name);
+ first = false;
+ startTime = System.currentTimeMillis();
+ }
+ } catch (Exception e) {
+ LOG.error("storm metrics failed! ", e);
+ }
+ }
+
+ public void close() {
+ dataWriter.close();
+ }
+
+ boolean updateStats(PrintWriter writer)
+ throws Exception {
+ if (collectTopologyStats) {
+ updateTopologyStats();
+ }
+ if (collectExecutorStats) {
+ updateExecutorStats();
+ }
+ return true;
+ }
+
+ void updateTopologyStats() {
+ long timeTotal = System.currentTimeMillis() - startTime;
+ int numWorkers = this.curSample.getNumWorkers();
+ int numExecutors = this.curSample.getNumExecutors();
+ int numTasks = this.curSample.getNumTasks();
+ metrics.put(TIME, String.format(TIME_FORMAT, timeTotal / 1000));
+ metrics.put(WORKERS, Integer.toString(numWorkers));
+ metrics.put(EXECUTORS, Integer.toString(numExecutors));
+ metrics.put(TASKS, Integer.toString(numTasks));
+ }
+
+ void updateExecutorStats() {
+ long timeDiff = this.curSample.getSampleTime() - this.lastSample.getSampleTime();
+ long transferredDiff = this.curSample.getTotalTransferred() - this.lastSample.getTotalTransferred();
+ long throughput = transferredDiff / (timeDiff / 1000);
+
+ long spoutDiff = this.curSample.getSpoutTransferred() - this.lastSample.getSpoutTransferred();
+ long spoutAckedDiff = this.curSample.getTotalAcked() - this.lastSample.getTotalAcked();
+ long spoutThroughput = spoutDiff / (timeDiff / 1000);
+
+ if (collectThroughput) {
+ metrics.put(TRANSFERRED, Long.toString(transferredDiff));
+ metrics.put(XSFER_RATE, Long.toString(throughput));
+ }
+
+ if (collectSpoutThroughput) {
+
+ metrics.put(SPOUT_EXECUTORS, Integer.toString(this.curSample.getSpoutExecutors()));
+ metrics.put(SPOUT_TRANSFERRED, Long.toString(spoutDiff));
+ metrics.put(SPOUT_ACKED, Long.toString(spoutAckedDiff));
+ metrics.put(SPOUT_THROUGHPUT, Long.toString(spoutThroughput));
+ }
+
+
+ if (collectSpoutLatency) {
+ double latency = this.curSample.getTotalLatency();
+ if (latency > this.maxLatency) {
+ this.maxLatency = latency;
+ }
+ metrics.put(SPOUT_AVG_COMPLETE_LATENCY,
+ String.format(SPOUT_AVG_LATENCY_FORMAT, latency));
+ metrics.put(SPOUT_MAX_COMPLETE_LATENCY,
+ String.format(SPOUT_MAX_LATENCY_FORMAT, this.maxLatency));
+
+ }
+ }
+
+
+ void writeHeader(PrintWriter writer) {
+ header.add(TIME);
+ if (collectTopologyStats) {
+ header.add(WORKERS);
+ header.add(TASKS);
+ header.add(EXECUTORS);
+ }
+
+ if (collectThroughput) {
+ header.add(TRANSFERRED);
+ header.add(XSFER_RATE);
+ }
+
+ if (collectSpoutThroughput) {
+ header.add(SPOUT_EXECUTORS);
+ header.add(SPOUT_TRANSFERRED);
+ header.add(SPOUT_ACKED);
+ header.add(SPOUT_THROUGHPUT);
+ }
+
+ if (collectSpoutLatency) {
+ header.add(SPOUT_AVG_COMPLETE_LATENCY);
+ header.add(SPOUT_MAX_COMPLETE_LATENCY);
+ }
+
+ writer.println("\n------------------------------------------------------------------------------------------------------------------");
+ String str = Utils.join(header, ",");
+ writer.println(str);
+ writer.println("------------------------------------------------------------------------------------------------------------------");
+ writer.flush();
+ }
+
+ void writeLine(PrintWriter writer) {
+ List<String> line = new LinkedList<String>();
+ for (String h : header) {
+ line.add(metrics.get(h));
+ }
+ String str = Utils.join(line, ",");
+ writer.println(str);
+ writer.flush();
+ }
+
+
+ boolean collectTopologyStats(Set<MetricsItem> items) {
+ return items.contains(MetricsItem.ALL) ||
+ items.contains(MetricsItem.TOPOLOGY_STATS);
+ }
+
+ boolean collectExecutorStats(Set<MetricsItem> items) {
+ return items.contains(MetricsItem.ALL) ||
+ items.contains(MetricsItem.XSFER_RATE) ||
+ items.contains(MetricsItem.SPOUT_LATENCY);
+ }
+
+ boolean collectThroughput(Set<MetricsItem> items) {
+ return items.contains(MetricsItem.ALL) ||
+ items.contains(MetricsItem.XSFER_RATE);
+ }
+
+ boolean collectSpoutThroughput(Set<MetricsItem> items) {
+ return items.contains(MetricsItem.ALL) ||
+ items.contains(MetricsItem.SPOUT_THROUGHPUT);
+ }
+
+ boolean collectSpoutLatency(Set<MetricsItem> items) {
+ return items.contains(MetricsItem.ALL) ||
+ items.contains(MetricsItem.SPOUT_LATENCY);
+ }
+
+
+
+ public static class MetricsCollectorConfig {
+ private static final Logger LOG = Logger.getLogger(MetricsCollectorConfig.class);
+
+ // storm configuration
+ public final Map stormConfig;
+ // storm topology name
+ public final String name;
+ // benchmark label
+ public final String label;
+
+ public MetricsCollectorConfig(String topoName, Map stormConfig) {
+ this.stormConfig = stormConfig;
+ String labelStr = (String) stormConfig.get("benchmark.label");
+ this.name = topoName;
+ if (labelStr == null) {
+ LOG.warn("'benchmark.label' not found in config. Defaulting to topology name");
+ labelStr = this.name;
+ }
+ this.label = labelStr;
+ }
+ } // MetricsCollectorConfig
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/Helper.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/Helper.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/Helper.java
new file mode 100755
index 0000000..8bcd84f
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/Helper.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.utils;
+
+import org.apache.storm.Config;
+import org.apache.storm.LocalCluster;
+import org.apache.storm.StormSubmitter;
+import org.apache.storm.generated.KillOptions;
+import org.apache.storm.generated.Nimbus;
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.utils.NimbusClient;
+import org.apache.storm.utils.Utils;
+
+import java.util.Map;
+
+
+public class Helper {
+
+ public static void kill(Nimbus.Client client, String topoName) throws Exception {
+ KillOptions opts = new KillOptions();
+ opts.set_wait_secs(0);
+ client.killTopologyWithOpts(topoName, opts);
+ }
+
+ public static void killAndShutdownCluster(LocalCluster cluster, String topoName) throws Exception {
+ KillOptions opts = new KillOptions();
+ opts.set_wait_secs(0);
+ cluster.killTopologyWithOpts(topoName, opts);
+ cluster.shutdown();
+ }
+
+
+ public static LocalCluster runOnLocalCluster(String topoName, StormTopology topology) throws Exception {
+ LocalCluster cluster = new LocalCluster();
+ cluster.submitTopology(topoName, new Config(), topology);
+ return cluster;
+ }
+
+ public static int getInt(Map map, Object key, int def) {
+ return Utils.getInt(Utils.get(map, key, def));
+ }
+
+ public static String getStr(Map map, Object key) {
+ return (String) map.get(key);
+ }
+
+ public static void collectMetricsAndKill(String topologyName, Integer pollInterval, Integer duration) throws Exception {
+ Map clusterConf = Utils.readStormConfig();
+ Nimbus.Client client = NimbusClient.getConfiguredClient(clusterConf).getClient();
+ BasicMetricsCollector metricsCollector = new BasicMetricsCollector(client, topologyName, clusterConf);
+
+ int times = duration / pollInterval;
+ metricsCollector.collect(client);
+ for (int i = 0; i < times; i++) {
+ Thread.sleep(pollInterval * 1000);
+ metricsCollector.collect(client);
+ }
+ metricsCollector.close();
+ kill(client, topologyName);
+ }
+
+ public static void collectLocalMetricsAndKill(LocalCluster localCluster, String topologyName, Integer pollInterval, Integer duration, Map clusterConf) throws Exception {
+ BasicMetricsCollector metricsCollector = new BasicMetricsCollector(localCluster, topologyName, clusterConf);
+
+ int times = duration / pollInterval;
+ metricsCollector.collect(localCluster);
+ for (int i = 0; i < times; i++) {
+ Thread.sleep(pollInterval * 1000);
+ metricsCollector.collect(localCluster);
+ }
+ metricsCollector.close();
+ killAndShutdownCluster(localCluster, topologyName);
+ }
+
+ /** Kill topo and Shutdown local cluster on Ctrl-C */
+ public static void setupShutdownHook(final LocalCluster cluster, final String topoName) {
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ try {
+ cluster.killTopology(topoName);
+ System.out.println("Killed Topology");
+ } catch (Exception e) {
+ System.err.println("Encountered error in killing topology: " + e);
+ }
+ cluster.shutdown();
+ }
+ });
+ }
+
+ /** Kill topo on Ctrl-C */
+ public static void setupShutdownHook(final String topoName) {
+ Map clusterConf = Utils.readStormConfig();
+ final Nimbus.Client client = NimbusClient.getConfiguredClient(clusterConf).getClient();
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ try {
+ Helper.kill(client, topoName);
+ System.out.println("Killed Topology");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ public static void runOnClusterAndPrintMetrics(Integer durationSec, String topoName, Map topoConf, StormTopology topology) throws Exception {
+ // submit topology
+ StormSubmitter.submitTopologyWithProgressBar(topoName, topoConf, topology);
+ setupShutdownHook(topoName); // handle Ctrl-C
+
+ // poll metrics every minute, then kill topology after specified duration
+ Integer pollIntervalSec = 60;
+ collectMetricsAndKill(topoName, pollIntervalSec, durationSec);
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/IdentityBolt.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/IdentityBolt.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/IdentityBolt.java
new file mode 100755
index 0000000..396ad53
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/IdentityBolt.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.utils;
+
+
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichBolt;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.tuple.Values;
+
+import java.util.Map;
+
+
+public class IdentityBolt extends BaseRichBolt {
+ private OutputCollector collector;
+
+ @Override
+ public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
+ this.collector = collector;
+ }
+
+ @Override
+ public void execute(Tuple tuple) {
+ collector.emit(tuple, tuple.getValues() );
+ collector.ack(tuple);
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/MetricsSample.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/MetricsSample.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/MetricsSample.java
new file mode 100755
index 0000000..a934120
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/utils/MetricsSample.java
@@ -0,0 +1,248 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.utils;
+
+import org.apache.storm.LocalCluster;
+import org.apache.storm.generated.ClusterSummary;
+import org.apache.storm.generated.ExecutorSpecificStats;
+import org.apache.storm.generated.ExecutorStats;
+import org.apache.storm.generated.ExecutorSummary;
+import org.apache.storm.generated.Nimbus;
+import org.apache.storm.generated.SpoutStats;
+import org.apache.storm.generated.TopologyInfo;
+import org.apache.storm.generated.TopologySummary;
+import org.apache.storm.utils.Utils;
+
+import java.util.List;
+import java.util.Map;
+
+public class MetricsSample {
+
+ private long sampleTime = -1;
+ private long totalTransferred = 0l;
+ private long totalEmitted = 0l;
+ private long totalAcked = 0l;
+ private long totalFailed = 0l;
+
+ private double totalLatency;
+
+ private long spoutEmitted = 0l;
+ private long spoutTransferred = 0l;
+ private int spoutExecutors = 0;
+
+ private int numSupervisors = 0;
+ private int numWorkers = 0;
+ private int numTasks = 0;
+ private int numExecutors = 0;
+
+ private int totalSlots = 0;
+ private int usedSlots = 0;
+
+ public static MetricsSample factory(Nimbus.Client client, String topologyName) throws Exception {
+ // "************ Sampling Metrics *****************
+
+ ClusterSummary clusterSummary = client.getClusterInfo();
+ // get topology info
+ TopologySummary topSummary = getTopologySummary(clusterSummary, topologyName);
+ int topologyExecutors = topSummary.get_num_executors();
+ int topologyWorkers = topSummary.get_num_workers();
+ int topologyTasks = topSummary.get_num_tasks();
+ TopologyInfo topInfo = client.getTopologyInfo(topSummary.get_id());
+
+ MetricsSample sample = getMetricsSample( topInfo);
+ sample.numWorkers = topologyWorkers;
+ sample.numExecutors = topologyExecutors;
+ sample.numTasks = topologyTasks;
+ return sample;
+ }
+
+ public static MetricsSample factory(LocalCluster localCluster, String topologyName) throws Exception {
+ TopologyInfo topologyInfo = localCluster.getTopologyInfo(topologyName);;
+ return getMetricsSample(topologyInfo);
+ }
+
+
+ private static MetricsSample getMetricsSample(TopologyInfo topInfo) {
+ List<ExecutorSummary> executorSummaries = topInfo.get_executors();
+
+ // totals
+ long totalTransferred = 0l;
+ long totalEmitted = 0l;
+ long totalAcked = 0l;
+ long totalFailed = 0l;
+
+ // number of spout executors
+ int spoutExecCount = 0;
+ double spoutLatencySum = 0.0;
+
+ long spoutEmitted = 0l;
+ long spoutTransferred = 0l;
+
+ // Executor summaries
+ for(ExecutorSummary executorSummary : executorSummaries){
+ ExecutorStats execuatorStats = executorSummary.get_stats();
+ if(execuatorStats == null){
+ continue;
+ }
+
+ ExecutorSpecificStats executorSpecificStats = execuatorStats.get_specific();
+ if(executorSpecificStats == null){
+ // bail out
+ continue;
+ }
+
+ // transferred totals
+ Map<String,Map<String,Long>> transferred = execuatorStats.get_transferred();
+ Map<String, Long> txMap = transferred.get(":all-time");
+ if(txMap == null){
+ continue;
+ }
+ for(String key : txMap.keySet()){
+ // todo, ignore the master batch coordinator ?
+ if(!Utils.isSystemId(key)){
+ Long count = txMap.get(key);
+ totalTransferred += count;
+ if(executorSpecificStats.is_set_spout()){
+ spoutTransferred += count;
+ }
+ }
+ }
+
+ // we found a spout
+ if(executorSpecificStats.isSet(2)) { // spout
+
+ SpoutStats spoutStats = executorSpecificStats.get_spout();
+ Map<String, Long> acked = spoutStats.get_acked().get(":all-time");
+ if(acked != null){
+ for(String key : acked.keySet()) {
+ totalAcked += acked.get(key);
+ }
+ }
+
+ Map<String, Long> failed = spoutStats.get_failed().get(":all-time");
+ if(failed != null){
+ for(String key : failed.keySet()) {
+ totalFailed += failed.get(key);
+ }
+ }
+
+ Double total = 0d;
+ Map<String, Double> vals = spoutStats.get_complete_ms_avg().get(":all-time");
+ for(String key : vals.keySet()){
+ total += vals.get(key);
+ }
+ Double latency = total / vals.size();
+
+ spoutExecCount++;
+ spoutLatencySum += latency;
+ }
+
+
+ } // end executor summary
+
+ MetricsSample ret = new MetricsSample();
+ ret.totalEmitted = totalEmitted;
+ ret.totalTransferred = totalTransferred;
+ ret.totalAcked = totalAcked;
+ ret.totalFailed = totalFailed;
+ ret.totalLatency = spoutLatencySum/spoutExecCount;
+ ret.spoutEmitted = spoutEmitted;
+ ret.spoutTransferred = spoutTransferred;
+ ret.sampleTime = System.currentTimeMillis();
+// ret.numSupervisors = clusterSummary.get_supervisors_size();
+ ret.numWorkers = 0;
+ ret.numExecutors = 0;
+ ret.numTasks = 0;
+ ret.spoutExecutors = spoutExecCount;
+ return ret;
+ }
+
+ public static TopologySummary getTopologySummary(ClusterSummary cs, String name) {
+ for (TopologySummary ts : cs.get_topologies()) {
+ if (name.equals(ts.get_name())) {
+ return ts;
+ }
+ }
+ return null;
+ }
+
+
+
+ // getters
+ public long getSampleTime() {
+ return sampleTime;
+ }
+
+ public long getTotalTransferred() {
+ return totalTransferred;
+ }
+
+ public long getTotalEmitted() {
+ return totalEmitted;
+ }
+
+ public long getTotalAcked() {
+ return totalAcked;
+ }
+
+ public long getTotalFailed() {
+ return totalFailed;
+ }
+
+ public double getTotalLatency() {
+ return totalLatency;
+ }
+
+ public long getSpoutEmitted() {
+ return spoutEmitted;
+ }
+
+ public long getSpoutTransferred() {
+ return spoutTransferred;
+ }
+
+ public int getNumSupervisors() {
+ return numSupervisors;
+ }
+
+ public int getNumWorkers() {
+ return numWorkers;
+ }
+
+ public int getNumTasks() {
+ return numTasks;
+ }
+
+ public int getTotalSlots() {
+ return totalSlots;
+ }
+
+ public int getSpoutExecutors(){
+ return this.spoutExecutors;
+ }
+
+ public int getNumExecutors() {
+ return this.numExecutors;
+ }
+
+ public int getUsedSlots() {
+ return this.usedSlots;
+ }
+
+}
\ No newline at end of file
[03/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/conf/KafkaHdfsTopo.yaml
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/conf/KafkaHdfsTopo.yaml b/storm-perf/src/main/conf/KafkaHdfsTopo.yaml
deleted file mode 100755
index a8ed2f2..0000000
--- a/storm-perf/src/main/conf/KafkaHdfsTopo.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-spout.count : 1
-bolt.count : 1
-kafka.topic : "kafka_topic"
-zk.uri : "zkhostname:2181"
-hdfs.uri : "hdfs://hdfs.namenode:8020"
-hdfs.dir : "/tmp/storm"
-hdfs.batch : 1000
-
-# storm config overrides
-topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/conf/KafkaSpoutNullBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/conf/KafkaSpoutNullBoltTopo.yaml b/storm-perf/src/main/conf/KafkaSpoutNullBoltTopo.yaml
deleted file mode 100644
index cde4c2e..0000000
--- a/storm-perf/src/main/conf/KafkaSpoutNullBoltTopo.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-spout.count : 1
-bolt.count : 1
-kafka.topic : "kafka_topic"
-zk.uri : "zkhostname:2181"
-
-# storm config overrides
-topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/conf/StrGenSpoutHdfsBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/conf/StrGenSpoutHdfsBoltTopo.yaml b/storm-perf/src/main/conf/StrGenSpoutHdfsBoltTopo.yaml
deleted file mode 100644
index d16431b..0000000
--- a/storm-perf/src/main/conf/StrGenSpoutHdfsBoltTopo.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-spout.count : 1
-bolt.count : 1
-hdfs.uri : "hdfs://hdfs.namenode:8020"
-hdfs.dir : "/tmp/storm"
-hdfs.batch : 1000
-
-
-# storm config overrides
-topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutIdBoltNullBoltTopo.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutIdBoltNullBoltTopo.java b/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutIdBoltNullBoltTopo.java
deleted file mode 100644
index 11c63d3..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutIdBoltNullBoltTopo.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf;
-
-import org.apache.storm.Config;
-import org.apache.storm.LocalCluster;
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.perf.bolt.DevNullBolt;
-import org.apache.storm.perf.bolt.IdBolt;
-import org.apache.storm.perf.spout.ConstSpout;
-import org.apache.storm.perf.utils.Helper;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.utils.Utils;
-
-import java.util.Map;
-
-/**
- * ConstSpout -> IdBolt -> DevNullBolt
- * This topology measures speed of messaging between spouts->bolt and bolt->bolt
- * ConstSpout : Continuously emits a constant string
- * IdBolt : clones and emits input tuples
- * DevNullBolt : discards incoming tuples
- */
-public class ConstSpoutIdBoltNullBoltTopo {
-
- public static final String TOPOLOGY_NAME = "ConstSpoutIdBoltNullBoltTopo";
- public static final String SPOUT_ID = "constSpout";
- public static final String BOLT1_ID = "idBolt";
- public static final String BOLT2_ID = "nullBolt";
-
- // Configs
- public static final String BOLT1_COUNT = "bolt1.count";
- public static final String BOLT2_COUNT = "bolt2.count";
- public static final String SPOUT_COUNT = "spout.count";
-
- public static StormTopology getTopology(Map conf) {
-
- // 1 - Setup Spout --------
- ConstSpout spout = new ConstSpout("some data").withOutputFields("str");
-
- // 2 - Setup IdBolt & DevNullBolt --------
- IdBolt bolt1 = new IdBolt();
- DevNullBolt bolt2 = new DevNullBolt();
-
-
- // 3 - Setup Topology --------
- TopologyBuilder builder = new TopologyBuilder();
-
- builder.setSpout(SPOUT_ID, spout, Helper.getInt(conf, SPOUT_COUNT, 1) );
-
- builder.setBolt(BOLT1_ID, bolt1, Helper.getInt(conf, BOLT1_COUNT, 1))
- .localOrShuffleGrouping(SPOUT_ID);
-
- builder.setBolt(BOLT2_ID, bolt2, Helper.getInt(conf, BOLT2_COUNT, 1))
- .localOrShuffleGrouping(BOLT1_ID);
-
- return builder.createTopology();
- }
-
-
- public static void main(String[] args) throws Exception {
-
- if (args.length <= 0) {
- // submit to local cluster
- Config conf = new Config();
- LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology(conf));
-
- Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
- while (true) {// run indefinitely till Ctrl-C
- Thread.sleep(20_000_000);
- }
- } else {
- // submit to real cluster
- if (args.length >2) {
- System.err.println("args: runDurationSec [optionalConfFile]");
- return;
- }
- Integer durationSec = Integer.parseInt(args[0]);
- Map topoConf = (args.length==2) ? Utils.findAndReadConfigFile(args[1]) : new Config();
-
- // Submit topology to storm cluster
- Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutNullBoltTopo.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutNullBoltTopo.java b/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutNullBoltTopo.java
deleted file mode 100755
index 92c2787..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutNullBoltTopo.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf;
-
-import org.apache.storm.Config;
-import org.apache.storm.LocalCluster;
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.perf.bolt.DevNullBolt;
-import org.apache.storm.perf.spout.ConstSpout;
-import org.apache.storm.perf.utils.Helper;
-import org.apache.storm.topology.BoltDeclarer;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.utils.Utils;
-
-import java.util.Map;
-
-/***
- * This topo helps measure the messaging speed between a spout and a bolt.
- * Spout generates a stream of a fixed string.
- * Bolt will simply ack and discard the tuple received
- */
-
-public class ConstSpoutNullBoltTopo {
-
- public static final String TOPOLOGY_NAME = "ConstSpoutNullBoltTopo";
- public static final String SPOUT_ID = "constSpout";
- public static final String BOLT_ID = "nullBolt";
-
- // Configs
- public static final String BOLT_COUNT = "bolt.count";
- public static final String SPOUT_COUNT = "spout.count";
- public static final String GROUPING = "grouping"; // can be 'local' or 'shuffle'
-
- public static final String LOCAL_GROPING = "local";
- public static final String SHUFFLE_GROUPING = "shuffle";
- public static final String DEFAULT_GROUPING = LOCAL_GROPING;
-
- public static StormTopology getTopology(Map conf) {
-
- // 1 - Setup Spout --------
- ConstSpout spout = new ConstSpout("some data").withOutputFields("str");
-
- // 2 - Setup DevNull Bolt --------
- DevNullBolt bolt = new DevNullBolt();
-
-
- // 3 - Setup Topology --------
- TopologyBuilder builder = new TopologyBuilder();
-
- builder.setSpout(SPOUT_ID, spout, Helper.getInt(conf, SPOUT_COUNT, 1) );
- BoltDeclarer bd = builder.setBolt(BOLT_ID, bolt, Helper.getInt(conf, BOLT_COUNT, 1));
-
- String groupingType = Helper.getStr(conf, GROUPING);
- if(groupingType==null || groupingType.equalsIgnoreCase(DEFAULT_GROUPING) )
- bd.localOrShuffleGrouping(SPOUT_ID);
- else if(groupingType.equalsIgnoreCase(SHUFFLE_GROUPING) )
- bd.shuffleGrouping(SPOUT_ID);
- return builder.createTopology();
- }
-
- /**
- * ConstSpout -> DevNullBolt with configurable grouping (default localOrShuffle)
- */
- public static void main(String[] args) throws Exception {
-
- if(args.length <= 0) {
- // For IDE based profiling ... submit topology to local cluster
- Config conf = new Config();
- final LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology(conf));
-
- Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
- while (true) {// run indefinitely till Ctrl-C
- Thread.sleep(20_000_000);
- }
-
- } else {
- // For measuring perf against a Storm cluster
- if (args.length > 2) {
- System.err.println("args: runDurationSec [optionalConfFile]");
- return;
- }
- Integer durationSec = Integer.parseInt(args[0]);
- Map topoConf = (args.length==2) ? Utils.findAndReadConfigFile(args[1]) : new Config();
-
- // Submit topology to storm cluster
- Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
- }
- }
-
-}
-
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutOnlyTopo.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutOnlyTopo.java b/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutOnlyTopo.java
deleted file mode 100755
index 721ae3d..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutOnlyTopo.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf;
-
-import org.apache.storm.Config;
-import org.apache.storm.LocalCluster;
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.perf.spout.ConstSpout;
-import org.apache.storm.perf.utils.Helper;
-import org.apache.storm.topology.TopologyBuilder;
-
-
-/***
- * This topo helps measure how fast a spout can produce data (so no bolts are attached)
- * Spout generates a stream of a fixed string.
- */
-
-public class ConstSpoutOnlyTopo {
-
- public static final String TOPOLOGY_NAME = "ConstSpoutOnlyTopo";
- public static final String SPOUT_ID = "constSpout";
-
-
- public static StormTopology getTopology() {
-
- // 1 - Setup Const Spout --------
- ConstSpout spout = new ConstSpout("some data").withOutputFields("str");
-
- // 2 - Setup Topology --------
- TopologyBuilder builder = new TopologyBuilder();
- builder.setSpout(SPOUT_ID, spout, 1);
- return builder.createTopology();
- }
-
- /**
- * ConstSpout only topology (No bolts)
- */
- public static void main(String[] args) throws Exception {
- if(args.length <= 0) {
- // For IDE based profiling ... submit topology to local cluster
- LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology());
-
- Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
- while (true) {// run indefinitely till Ctrl-C
- Thread.sleep(20_000_000);
- }
- } else {
- // Submit topology to storm cluster
- if (args.length != 1) {
- System.err.println("args: runDurationSec");
- return;
- }
- Integer durationSec = Integer.parseInt(args[0]);
-
- Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, new Config(), getTopology());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/FileReadWordCountTopo.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/FileReadWordCountTopo.java b/storm-perf/src/main/java/org/apache/storm/perf/FileReadWordCountTopo.java
deleted file mode 100644
index d518c86..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/FileReadWordCountTopo.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License
-*/
-package org.apache.storm.perf;
-
-
-import org.apache.storm.Config;
-import org.apache.storm.LocalCluster;
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.perf.bolt.CountBolt;
-import org.apache.storm.perf.bolt.SplitSentenceBolt;
-import org.apache.storm.perf.spout.FileReadSpout;
-import org.apache.storm.perf.utils.Helper;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.utils.Utils;
-
-
-import java.util.Map;
-
-/***
- * This topo helps measure speed of word count.
- * Spout loads a file into memory on initialization, then emits the lines in an endless loop.
- */
-
-public class FileReadWordCountTopo {
- public static final String SPOUT_ID = "spout";
- public static final String COUNT_ID = "counter";
- public static final String SPLIT_ID = "splitter";
- public static final String TOPOLOGY_NAME = "FileReadWordCountTopo";
-
- // Config settings
- public static final String SPOUT_NUM = "spout.count";
- public static final String SPLIT_NUM = "splitter.count";
- public static final String COUNT_NUM = "counter.count";
- public static final String INPUT_FILE = "input.file";
-
- public static final int DEFAULT_SPOUT_NUM = 1;
- public static final int DEFAULT_SPLIT_BOLT_NUM = 2;
- public static final int DEFAULT_COUNT_BOLT_NUM = 2;
-
-
- public static StormTopology getTopology(Map config) {
-
- final int spoutNum = Helper.getInt(config, SPOUT_NUM, DEFAULT_SPOUT_NUM);
- final int spBoltNum = Helper.getInt(config, SPLIT_NUM, DEFAULT_SPLIT_BOLT_NUM);
- final int cntBoltNum = Helper.getInt(config, COUNT_NUM, DEFAULT_COUNT_BOLT_NUM);
- final String inputFile = Helper.getStr(config, INPUT_FILE);
-
- TopologyBuilder builder = new TopologyBuilder();
- builder.setSpout(SPOUT_ID, new FileReadSpout(inputFile), spoutNum);
- builder.setBolt(SPLIT_ID, new SplitSentenceBolt(), spBoltNum).localOrShuffleGrouping(SPOUT_ID);
- builder.setBolt(COUNT_ID, new CountBolt(), cntBoltNum).fieldsGrouping(SPLIT_ID, new Fields(SplitSentenceBolt.FIELDS));
-
- return builder.createTopology();
- }
-
- public static void main(String[] args) throws Exception {
- if(args.length <= 0) {
- // For IDE based profiling ... submit topology to local cluster
- Config conf = new Config();
- conf.put(INPUT_FILE, "resources/randomwords.txt");
- LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology(conf));
-
- Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
- while (true) {// run indefinitely till Ctrl-C
- Thread.sleep(20_000_000);
- }
- } else {
- // Submit to Storm cluster
- if (args.length !=2) {
- System.err.println("args: runDurationSec confFile");
- return;
- }
- Integer durationSec = Integer.parseInt(args[0]);
- Map topoConf = Utils.findAndReadConfigFile(args[1]);
-
- Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
-
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/HdfsSpoutNullBoltTopo.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/HdfsSpoutNullBoltTopo.java b/storm-perf/src/main/java/org/apache/storm/perf/HdfsSpoutNullBoltTopo.java
deleted file mode 100644
index 248b523..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/HdfsSpoutNullBoltTopo.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.storm.perf;
-
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.hdfs.spout.HdfsSpout;
-import org.apache.storm.hdfs.spout.TextFileReader;
-import org.apache.storm.perf.bolt.DevNullBolt;
-import org.apache.storm.perf.utils.Helper;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.utils.Utils;
-
-import java.util.Map;
-
-/***
- * This topo helps measure speed of reading from Hdfs.
- * Spout Reads from Hdfs.
- * Bolt acks and discards tuples
- */
-
-
-public class HdfsSpoutNullBoltTopo {
- // names
- static final String TOPOLOGY_NAME = "HdfsSpoutNullBoltTopo";
- static final String SPOUT_ID = "hdfsSpout";
- static final String BOLT_ID = "devNullBolt";
-
- // configs
- static final String SPOUT_NUM = "spout.count";
- static final String BOLT_NUM = "bolt.count";
-
- static final String HDFS_URI = "hdfs.uri";
- static final String SOURCE_DIR = "hdfs.source.dir";
- static final String ARCHIVE_DIR = "hdfs.archive.dir";
- static final String BAD_DIR = "hdfs.bad.dir";
-
- public static final int DEFAULT_SPOUT_NUM = 1;
- public static final int DEFAULT_BOLT_NUM = 1;
-
-
- public static StormTopology getTopology(Map config) {
-
- final int spoutNum = Helper.getInt(config, SPOUT_NUM, DEFAULT_SPOUT_NUM);
- final int boltNum = Helper.getInt(config, BOLT_NUM, DEFAULT_BOLT_NUM);
- final String fileFormat = Helper.getStr(config, "text");
- final String hdfsUri = Helper.getStr(config, HDFS_URI);
- final String sourceDir = Helper.getStr(config, SOURCE_DIR);
- final String archiveDir = Helper.getStr(config, ARCHIVE_DIR);
- final String badDir = Helper.getStr(config, BAD_DIR);
-
-
- // 1 - Setup Hdfs Spout --------
- HdfsSpout spout = new HdfsSpout()
- .setReaderType(fileFormat)
- .setHdfsUri(hdfsUri)
- .setSourceDir(sourceDir)
- .setArchiveDir(archiveDir)
- .setBadFilesDir(badDir)
- .withOutputFields(TextFileReader.defaultFields);
-
- // 2 - DevNull Bolt --------
- DevNullBolt bolt = new DevNullBolt();
-
- // 3 - Setup Topology --------
- TopologyBuilder builder = new TopologyBuilder();
- builder.setSpout(SPOUT_ID, spout, spoutNum);
- builder.setBolt(BOLT_ID, bolt, boltNum)
- .localOrShuffleGrouping(SPOUT_ID);
-
- return builder.createTopology();
- }
-
- public static void main(String[] args) throws Exception {
- if (args.length != 2) {
- System.err.println("args: runDurationSec topConfFile");
- return;
- }
-
- Integer durationSec = Integer.parseInt(args[0]);
- Map topoConf = Utils.findAndReadConfigFile(args[1]);
-
- // Submit to Storm cluster
- Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/KafkaHdfsTopo.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/KafkaHdfsTopo.java b/storm-perf/src/main/java/org/apache/storm/perf/KafkaHdfsTopo.java
deleted file mode 100755
index 4293aac..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/KafkaHdfsTopo.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf;
-
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.hdfs.bolt.HdfsBolt;
-import org.apache.storm.hdfs.bolt.format.DefaultFileNameFormat;
-import org.apache.storm.hdfs.bolt.format.FileNameFormat;
-import org.apache.storm.hdfs.bolt.format.RecordFormat;
-import org.apache.storm.hdfs.bolt.rotation.FileRotationPolicy;
-import org.apache.storm.hdfs.bolt.rotation.FileSizeRotationPolicy;
-import org.apache.storm.hdfs.bolt.sync.CountSyncPolicy;
-import org.apache.storm.hdfs.bolt.sync.SyncPolicy;
-import org.apache.storm.kafka.BrokerHosts;
-import org.apache.storm.kafka.KafkaSpout;
-import org.apache.storm.kafka.SpoutConfig;
-import org.apache.storm.kafka.StringMultiSchemeWithTopic;
-import org.apache.storm.kafka.ZkHosts;
-import org.apache.storm.perf.utils.Helper;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.tuple.Tuple;
-import org.apache.storm.utils.Utils;
-
-import java.util.Map;
-import java.util.UUID;
-
-/***
- * This topo helps measure speed of reading from Kafka and writing to Hdfs.
- * Spout Reads from Kafka.
- * Bolt writes to Hdfs
- */
-
-public class KafkaHdfsTopo {
-
- // configs - topo parallelism
- public static final String SPOUT_NUM = "spout.count";
- public static final String BOLT_NUM = "bolt.count";
- // configs - kafka spout
- public static final String KAFKA_TOPIC = "kafka.topic";
- public static final String ZOOKEEPER_URI = "zk.uri";
- // configs - hdfs bolt
- public static final String HDFS_URI = "hdfs.uri";
- public static final String HDFS_PATH = "hdfs.dir";
- public static final String HDFS_BATCH = "hdfs.batch";
-
-
- public static final int DEFAULT_SPOUT_NUM = 1;
- public static final int DEFAULT_BOLT_NUM = 1;
- public static final int DEFAULT_HDFS_BATCH = 1000;
-
- // names
- public static final String TOPOLOGY_NAME = "KafkaHdfsTopo";
- public static final String SPOUT_ID = "kafkaSpout";
- public static final String BOLT_ID = "hdfsBolt";
-
-
-
- public static StormTopology getTopology(Map config) {
-
- final int spoutNum = getInt(config, SPOUT_NUM, DEFAULT_SPOUT_NUM);
- final int boltNum = getInt(config, BOLT_NUM, DEFAULT_BOLT_NUM);
-
- final int hdfsBatch = getInt(config, HDFS_BATCH, DEFAULT_HDFS_BATCH);
-
- // 1 - Setup Kafka Spout --------
- String zkConnString = getStr(config, ZOOKEEPER_URI);
- String topicName = getStr(config, KAFKA_TOPIC);
-
- BrokerHosts brokerHosts = new ZkHosts(zkConnString);
- SpoutConfig spoutConfig = new SpoutConfig(brokerHosts, topicName, "/" + topicName, UUID.randomUUID().toString());
- spoutConfig.scheme = new StringMultiSchemeWithTopic();
- spoutConfig.ignoreZkOffsets = true;
-
- KafkaSpout spout = new KafkaSpout(spoutConfig);
-
- // 2 - Setup HFS Bolt --------
- String Hdfs_url = getStr(config, HDFS_URI);
- RecordFormat format = new LineWriter("str");
- SyncPolicy syncPolicy = new CountSyncPolicy(hdfsBatch);
- FileRotationPolicy rotationPolicy = new FileSizeRotationPolicy(1.0f, FileSizeRotationPolicy.Units.GB);
-
- FileNameFormat fileNameFormat = new DefaultFileNameFormat().withPath(getStr(config,HDFS_PATH) );
-
- // Instantiate the HdfsBolt
- HdfsBolt bolt = new HdfsBolt()
- .withFsUrl(Hdfs_url)
- .withFileNameFormat(fileNameFormat)
- .withRecordFormat(format)
- .withRotationPolicy(rotationPolicy)
- .withSyncPolicy(syncPolicy);
-
-
- // 3 - Setup Topology --------
- TopologyBuilder builder = new TopologyBuilder();
- builder.setSpout(SPOUT_ID, spout, spoutNum);
- builder.setBolt(BOLT_ID, bolt, boltNum)
- .localOrShuffleGrouping(SPOUT_ID);
-
- return builder.createTopology();
- }
-
-
- public static int getInt(Map map, Object key, int def) {
- return Utils.getInt(Utils.get(map, key, def));
- }
-
- public static String getStr(Map map, Object key) {
- return (String) map.get(key);
- }
-
-
- /** Copies text file content from sourceDir to destinationDir. Moves source files into sourceDir after its done consuming */
- public static void main(String[] args) throws Exception {
-
- if (args.length != 2) {
- System.err.println("args: runDurationSec topConfFile");
- return;
- }
-
- Integer durationSec = Integer.parseInt(args[0]);
- String confFile = args[1];
- Map topoConf = Utils.findAndReadConfigFile(confFile);
-
- // Submit topology to Storm cluster
- Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
- }
-
- public static class LineWriter implements RecordFormat {
- private String lineDelimiter = System.lineSeparator();
- private String fieldName;
-
- public LineWriter(String fieldName) {
- this.fieldName = fieldName;
- }
-
- /**
- * Overrides the default record delimiter.
- *
- * @param delimiter
- * @return
- */
- public LineWriter withLineDelimiter(String delimiter){
- this.lineDelimiter = delimiter;
- return this;
- }
-
- @Override
- public byte[] format(Tuple tuple) {
- return (tuple.getValueByField(fieldName).toString() + this.lineDelimiter).getBytes();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/KafkaSpoutNullBoltTopo.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/KafkaSpoutNullBoltTopo.java b/storm-perf/src/main/java/org/apache/storm/perf/KafkaSpoutNullBoltTopo.java
deleted file mode 100755
index 3512c65..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/KafkaSpoutNullBoltTopo.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License
-*/
-
-package org.apache.storm.perf;
-
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.kafka.BrokerHosts;
-import org.apache.storm.kafka.KafkaSpout;
-import org.apache.storm.kafka.SpoutConfig;
-import org.apache.storm.kafka.StringMultiSchemeWithTopic;
-import org.apache.storm.kafka.ZkHosts;
-import org.apache.storm.perf.bolt.DevNullBolt;
-import org.apache.storm.perf.utils.Helper;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.utils.Utils;
-
-import java.util.Map;
-import java.util.UUID;
-
-
-/***
- * This topo helps measure speed of reading from Kafka
- * Spout Reads from Kafka.
- * Bolt acks and discards tuples
- */
-
-public class KafkaSpoutNullBoltTopo {
-
- // configs - topo parallelism
- public static final String SPOUT_NUM = "spout.count";
- public static final String BOLT_NUM = "bolt.count";
-
- // configs - kafka spout
- public static final String KAFKA_TOPIC = "kafka.topic";
- public static final String ZOOKEEPER_URI = "zk.uri";
-
-
- public static final int DEFAULT_SPOUT_NUM = 1;
- public static final int DEFAULT_BOLT_NUM = 1;
-
- // names
- public static final String TOPOLOGY_NAME = "KafkaSpoutNullBoltTopo";
- public static final String SPOUT_ID = "kafkaSpout";
- public static final String BOLT_ID = "devNullBolt";
-
-
- public static StormTopology getTopology(Map config) {
-
- final int spoutNum = getInt(config, SPOUT_NUM, DEFAULT_SPOUT_NUM);
- final int boltNum = getInt(config, BOLT_NUM, DEFAULT_BOLT_NUM);
- // 1 - Setup Kafka Spout --------
-
- String zkConnString = getStr(config, ZOOKEEPER_URI);
- String topicName = getStr(config, KAFKA_TOPIC);
-
- BrokerHosts brokerHosts = new ZkHosts(zkConnString);
- SpoutConfig spoutConfig = new SpoutConfig(brokerHosts, topicName, "/" + topicName, UUID.randomUUID().toString());
- spoutConfig.scheme = new StringMultiSchemeWithTopic();
- spoutConfig.ignoreZkOffsets = true;
-
- KafkaSpout spout = new KafkaSpout(spoutConfig);
-
- // 2 - DevNull Bolt --------
- DevNullBolt bolt = new DevNullBolt();
-
- // 3 - Setup Topology --------
- TopologyBuilder builder = new TopologyBuilder();
- builder.setSpout(SPOUT_ID, spout, spoutNum);
- builder.setBolt(BOLT_ID, bolt, boltNum)
- .localOrShuffleGrouping(SPOUT_ID);
-
- return builder.createTopology();
- }
-
-
- public static int getInt(Map map, Object key, int def) {
- return Utils.getInt(Utils.get(map, key, def));
- }
-
- public static String getStr(Map map, Object key) {
- return (String) map.get(key);
- }
-
-
- /**
- * Copies text file content from sourceDir to destinationDir. Moves source files into sourceDir after its done consuming
- */
- public static void main(String[] args) throws Exception {
- if (args.length !=2) {
- System.err.println("args: runDurationSec confFile");
- return;
- }
- Integer durationSec = Integer.parseInt(args[0]);
- Map topoConf = Utils.findAndReadConfigFile(args[1]);
-
- // Submit to Storm cluster
- Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/StrGenSpoutHdfsBoltTopo.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/StrGenSpoutHdfsBoltTopo.java b/storm-perf/src/main/java/org/apache/storm/perf/StrGenSpoutHdfsBoltTopo.java
deleted file mode 100755
index 5b97540..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/StrGenSpoutHdfsBoltTopo.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-
-package org.apache.storm.perf;
-
-import org.apache.storm.LocalCluster;
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.hdfs.bolt.HdfsBolt;
-import org.apache.storm.hdfs.bolt.format.DefaultFileNameFormat;
-import org.apache.storm.hdfs.bolt.format.FileNameFormat;
-import org.apache.storm.hdfs.bolt.format.RecordFormat;
-import org.apache.storm.hdfs.bolt.rotation.FileRotationPolicy;
-import org.apache.storm.hdfs.bolt.rotation.FileSizeRotationPolicy;
-import org.apache.storm.hdfs.bolt.sync.CountSyncPolicy;
-import org.apache.storm.hdfs.bolt.sync.SyncPolicy;
-import org.apache.storm.perf.spout.StringGenSpout;
-import org.apache.storm.perf.utils.Helper;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.tuple.Tuple;
-import org.apache.storm.utils.Utils;
-
-import java.util.Map;
-
-/***
- * This topo helps measure speed of writing to Hdfs
- * Spout generates fixed length random strings.
- * Bolt writes to Hdfs
- */
-
-public class StrGenSpoutHdfsBoltTopo {
-
- // configs - topo parallelism
- public static final String SPOUT_NUM = "spout.count";
- public static final String BOLT_NUM = "bolt.count";
-
- // configs - hdfs bolt
- public static final String HDFS_URI = "hdfs.uri";
- public static final String HDFS_PATH = "hdfs.dir";
- public static final String HDFS_BATCH = "hdfs.batch";
-
- public static final int DEFAULT_SPOUT_NUM = 1;
- public static final int DEFAULT_BOLT_NUM = 1;
- public static final int DEFAULT_HDFS_BATCH = 1000;
-
- // names
- public static final String TOPOLOGY_NAME = "StrGenSpoutHdfsBoltTopo";
- public static final String SPOUT_ID = "GenSpout";
- public static final String BOLT_ID = "hdfsBolt";
-
-
- public static StormTopology getTopology(Map topoConf) {
- final int hdfsBatch = Helper.getInt(topoConf, HDFS_BATCH, DEFAULT_HDFS_BATCH);
-
- // 1 - Setup StringGen Spout --------
- StringGenSpout spout = new StringGenSpout(100).withFieldName("str");
-
-
- // 2 - Setup HFS Bolt --------
- String Hdfs_url = Helper.getStr(topoConf, HDFS_URI);
- RecordFormat format = new LineWriter("str");
- SyncPolicy syncPolicy = new CountSyncPolicy(hdfsBatch);
- FileRotationPolicy rotationPolicy = new FileSizeRotationPolicy(1.0f, FileSizeRotationPolicy.Units.GB);
- final int spoutNum = Helper.getInt(topoConf, SPOUT_NUM, DEFAULT_SPOUT_NUM);
- final int boltNum = Helper.getInt(topoConf, BOLT_NUM, DEFAULT_BOLT_NUM);
-
- // Use default, Storm-generated file names
- FileNameFormat fileNameFormat = new DefaultFileNameFormat().withPath(Helper.getStr(topoConf, HDFS_PATH) );
-
- // Instantiate the HdfsBolt
- HdfsBolt bolt = new HdfsBolt()
- .withFsUrl(Hdfs_url)
- .withFileNameFormat(fileNameFormat)
- .withRecordFormat(format)
- .withRotationPolicy(rotationPolicy)
- .withSyncPolicy(syncPolicy);
-
-
- // 3 - Setup Topology --------
-
- TopologyBuilder builder = new TopologyBuilder();
- builder.setSpout(SPOUT_ID, spout, spoutNum);
- builder.setBolt(BOLT_ID, bolt, boltNum)
- .localOrShuffleGrouping(SPOUT_ID);
-
- return builder.createTopology();
- }
-
-
- /** Spout generates random strings and HDFS bolt writes them to a text file */
- public static void main(String[] args) throws Exception {
- if(args.length <= 0) {
- // submit to local cluster
- Map topoConf = Utils.findAndReadConfigFile("conf/HdfsSpoutTopo.yaml");
- LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology(topoConf));
-
- Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
- while (true) {// run indefinitely till Ctrl-C
- Thread.sleep(20_000_000);
- }
- } else {
- // Submit to Storm cluster
- if (args.length !=2) {
- System.err.println("args: runDurationSec confFile");
- return;
- }
- Integer durationSec = Integer.parseInt(args[0]);
- Map topoConf = Utils.findAndReadConfigFile(args[1]);
-
- Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
- }
- }
-
-
- public static class LineWriter implements RecordFormat {
- private String lineDelimiter = System.lineSeparator();
- private String fieldName;
-
- public LineWriter(String fieldName) {
- this.fieldName = fieldName;
- }
-
- /**
- * Overrides the default record delimiter.
- *
- * @param delimiter
- * @return
- */
- public LineWriter withLineDelimiter(String delimiter){
- this.lineDelimiter = delimiter;
- return this;
- }
-
- public byte[] format(Tuple tuple) {
- return (tuple.getValueByField(fieldName).toString() + this.lineDelimiter).getBytes();
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/bolt/CountBolt.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/bolt/CountBolt.java b/storm-perf/src/main/java/org/apache/storm/perf/bolt/CountBolt.java
deleted file mode 100644
index b79a0ee..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/bolt/CountBolt.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.bolt;
-
-
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseBasicBolt;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-import org.apache.storm.tuple.Values;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class CountBolt extends BaseBasicBolt {
- public static final String FIELDS_WORD = "word";
- public static final String FIELDS_COUNT = "count";
-
- Map<String, Integer> counts = new HashMap<>();
-
- @Override
- public void prepare(Map stormConf, TopologyContext context) {
- }
-
- @Override
- public void execute(Tuple tuple, BasicOutputCollector collector) {
- String word = tuple.getString(0);
- Integer count = counts.get(word);
- if (count == null)
- count = 0;
- count++;
- counts.put(word, count);
- collector.emit(new Values(word, count));
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields(FIELDS_WORD, FIELDS_COUNT));
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/bolt/DevNullBolt.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/bolt/DevNullBolt.java b/storm-perf/src/main/java/org/apache/storm/perf/bolt/DevNullBolt.java
deleted file mode 100755
index b85ce15..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/bolt/DevNullBolt.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.bolt;
-
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichBolt;
-import org.apache.storm.tuple.Tuple;
-
-import java.util.Map;
-
-
-public class DevNullBolt extends BaseRichBolt {
- private OutputCollector collector;
-
- @Override
- public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
- this.collector = collector;
- }
-
- @Override
- public void execute(Tuple tuple) {
- collector.ack(tuple);
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
-
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/bolt/IdBolt.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/bolt/IdBolt.java b/storm-perf/src/main/java/org/apache/storm/perf/bolt/IdBolt.java
deleted file mode 100644
index 116265e..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/bolt/IdBolt.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.bolt;
-
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichBolt;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-import org.apache.storm.tuple.Values;
-
-import java.util.Map;
-
-public class IdBolt extends BaseRichBolt {
- private OutputCollector collector;
-
- @Override
- public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
- this.collector = collector;
- }
-
- @Override
- public void execute(Tuple tuple) {
- collector.emit(tuple, new Values( tuple.getValues() ) );
- collector.ack(tuple);
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields("field1"));
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/bolt/SplitSentenceBolt.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/bolt/SplitSentenceBolt.java b/storm-perf/src/main/java/org/apache/storm/perf/bolt/SplitSentenceBolt.java
deleted file mode 100644
index 96f9f73..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/bolt/SplitSentenceBolt.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.bolt;
-
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseBasicBolt;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-import org.apache.storm.tuple.Values;
-
-import java.util.Map;
-
-
-public class SplitSentenceBolt extends BaseBasicBolt {
- public static final String FIELDS = "word";
-
- @Override
- public void prepare(Map stormConf, TopologyContext context) {
- }
-
- @Override
- public void execute(Tuple input, BasicOutputCollector collector) {
- for (String word : splitSentence(input.getString(0))) {
- collector.emit(new Values(word));
- }
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields(FIELDS));
- }
-
-
- public static String[] splitSentence(String sentence) {
- if (sentence != null) {
- return sentence.split("\\s+");
- }
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/spout/ConstSpout.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/spout/ConstSpout.java b/storm-perf/src/main/java/org/apache/storm/perf/spout/ConstSpout.java
deleted file mode 100755
index b66e4f3..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/spout/ConstSpout.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.spout;
-
-
-import org.apache.storm.spout.SpoutOutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichSpout;
-import org.apache.storm.tuple.Fields;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-public class ConstSpout extends BaseRichSpout {
-
- private static final String DEFAUT_FIELD_NAME = "str";
- private String value;
- private String fieldName = DEFAUT_FIELD_NAME;
- private SpoutOutputCollector collector = null;
- private int count=0;
-
- public ConstSpout(String value) {
- this.value = value;
- }
-
- public ConstSpout withOutputFields(String fieldName) {
- this.fieldName = fieldName;
- return this;
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields(fieldName));
- }
-
- @Override
- public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
- this.collector = collector;
- }
-
- @Override
- public void nextTuple() {
- List<Object> tuple = Collections.singletonList((Object) value);
- collector.emit(tuple, count++);
- }
-
- @Override
- public void ack(Object msgId) {
- super.ack(msgId);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/spout/FileReadSpout.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/spout/FileReadSpout.java b/storm-perf/src/main/java/org/apache/storm/perf/spout/FileReadSpout.java
deleted file mode 100644
index 959e7c6..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/spout/FileReadSpout.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.spout;
-
-import org.apache.storm.spout.SpoutOutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichSpout;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class FileReadSpout extends BaseRichSpout {
- public static final String FIELDS = "sentence";
- private static final long serialVersionUID = -2582705611472467172L;
- private transient FileReader reader;
- private String file;
- private boolean ackEnabled = true;
- private SpoutOutputCollector collector;
-
- private long count = 0;
-
-
- public FileReadSpout(String file) {
- this.file = file;
- }
-
- // For testing
- FileReadSpout(FileReader reader) {
- this.reader = reader;
- }
-
- @Override
- public void open(Map conf, TopologyContext context,
- SpoutOutputCollector collector) {
- this.collector = collector;
- Object ackObj = conf.get("topology.acker.executors");
- if (ackObj != null && ackObj.equals(0)) {
- this.ackEnabled = false;
- }
- // for tests, reader will not be null
- if (this.reader == null) {
- this.reader = new FileReader(this.file);
- }
- }
-
- @Override
- public void nextTuple() {
- if (ackEnabled) {
- collector.emit(new Values(reader.nextLine()), count);
- count++;
- } else {
- collector.emit(new Values(reader.nextLine()));
- }
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields(FIELDS));
- }
-
- public static List<String> readLines(InputStream input) {
- List<String> lines = new ArrayList<>();
- try {
- BufferedReader reader = new BufferedReader(new InputStreamReader(input));
- try {
- String line;
- while ((line = reader.readLine()) != null) {
- lines.add(line);
- }
- } catch (IOException e) {
- throw new RuntimeException("Reading file failed", e);
- } finally {
- reader.close();
- }
- } catch (IOException e) {
- throw new RuntimeException("Error closing reader", e);
- }
- return lines;
- }
-
- public static class FileReader implements Serializable {
-
- private static final long serialVersionUID = -7012334600647556267L;
-
- public final String file;
- private List<String> contents = null;
- private int index = 0;
- private int limit = 0;
-
- public FileReader(String file) {
- this.file = file;
- if (this.file != null) {
- try {
- this.contents = readLines(new FileInputStream(this.file));
- } catch (IOException e) {
- e.printStackTrace();
- throw new IllegalArgumentException("Cannot open file " + file, e);
- }
- this.limit = contents.size();
- } else {
- throw new IllegalArgumentException("file name cannot be null");
- }
- }
-
- public String nextLine() {
- if (index >= limit) {
- index = 0;
- }
- String line = contents.get(index);
- index++;
- return line;
- }
-
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/spout/StringGenSpout.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/spout/StringGenSpout.java b/storm-perf/src/main/java/org/apache/storm/perf/spout/StringGenSpout.java
deleted file mode 100755
index f9c665b..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/spout/StringGenSpout.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.spout;
-
-
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.storm.spout.SpoutOutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichSpout;
-import org.apache.storm.tuple.Fields;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/** Spout pre-computes a list with 30k fixed length random strings.
- * Emits sequentially from this list, over and over again.
- */
-
-public class StringGenSpout extends BaseRichSpout {
-
- private static final String DEFAULT_FIELD_NAME = "str";
- private int strLen;
- private final int strCount = 30_000;
- private String fieldName = DEFAULT_FIELD_NAME;
- private SpoutOutputCollector collector = null;
- ArrayList<String> records;
- private int curr=0;
- private int count=0;
-
- public StringGenSpout(int strLen) {
- this.strLen = strLen;
- }
-
- public StringGenSpout withFieldName(String fieldName) {
- this.fieldName = fieldName;
- return this;
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare( new Fields(fieldName) );
- }
-
- @Override
- public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
- this.records = genStringList(strLen, strCount);
-
- this.collector = collector;
- }
-
- private static ArrayList<String> genStringList(int strLen, int count) {
- ArrayList<String> result = new ArrayList<String>(count);
- for (int i = 0; i < count; i++) {
- result.add( RandomStringUtils.random(strLen) );
- }
- return result;
- }
-
- @Override
- public void nextTuple() {
- List<Object> tuple;
- if( curr < strCount ) {
- tuple = Collections.singletonList((Object) records.get(curr));
- ++curr;
- collector.emit(tuple, ++count);
- }
- }
-
-
- @Override
- public void ack(Object msgId) {
- super.ack(msgId);
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/utils/BasicMetricsCollector.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/utils/BasicMetricsCollector.java b/storm-perf/src/main/java/org/apache/storm/perf/utils/BasicMetricsCollector.java
deleted file mode 100755
index 686f9da..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/utils/BasicMetricsCollector.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.utils;
-
-import org.apache.storm.LocalCluster;
-import org.apache.storm.generated.Nimbus;
-import org.apache.storm.utils.NimbusClient;
-import org.apache.storm.utils.Utils;
-import org.apache.log4j.Logger;
-
-import java.io.PrintWriter;
-import java.util.*;
-
-
-public class BasicMetricsCollector {
-
- private LocalCluster localCluster = null;
- private Nimbus.Client client = null;
- private PrintWriter dataWriter;
- private long startTime=0;
-
- public enum MetricsItem {
- TOPOLOGY_STATS,
- XSFER_RATE,
- SPOUT_THROUGHPUT,
- SPOUT_LATENCY,
- ALL
- }
-
-
- /* headers */
- public static final String TIME = "elapsed (sec)";
- public static final String TIME_FORMAT = "%d";
- public static final String TOTAL_SLOTS = "total_slots";
- public static final String USED_SLOTS = "used_slots";
- public static final String WORKERS = "workers";
- public static final String TASKS = "tasks";
- public static final String EXECUTORS = "executors";
- public static final String TRANSFERRED = "transferred (messages)";
- public static final String XSFER_RATE = "transfer rate (messages/s)";
- public static final String SPOUT_EXECUTORS = "spout_executors";
- public static final String SPOUT_TRANSFERRED = "spout_transferred (messages)";
- public static final String SPOUT_ACKED = "spout_acks";
- public static final String SPOUT_THROUGHPUT = "spout_throughput (acks/s)";
- public static final String SPOUT_AVG_COMPLETE_LATENCY = "spout_avg_complete_latency(ms)";
- public static final String SPOUT_AVG_LATENCY_FORMAT = "%.1f";
- public static final String SPOUT_MAX_COMPLETE_LATENCY = "spout_max_complete_latency(ms)";
- public static final String SPOUT_MAX_LATENCY_FORMAT = "%.1f";
- private static final Logger LOG = Logger.getLogger(BasicMetricsCollector.class);
- final MetricsCollectorConfig config;
- // final StormTopology topology;
- final Set<String> header = new LinkedHashSet<String>();
- final Map<String, String> metrics = new HashMap<String, String>();
- int lineNumber = 0;
-
- final boolean collectTopologyStats;
- final boolean collectExecutorStats;
- final boolean collectThroughput;
-
- final boolean collectSpoutThroughput;
- final boolean collectSpoutLatency;
-
- private MetricsSample lastSample;
- private MetricsSample curSample;
- private double maxLatency = 0;
-
- boolean first = true;
-
- public BasicMetricsCollector(Nimbus.Client client, String topoName, Map stormConfig) {
- this(topoName, stormConfig);
- this.client = client;
- this.localCluster = null;
- }
-
- public BasicMetricsCollector(LocalCluster localCluster, String topoName, Map stormConfig) {
- this(topoName, stormConfig);
- this.client = null;
- this.localCluster = localCluster;
- }
-
- private BasicMetricsCollector(String topoName, Map stormConfig) {
- Set<MetricsItem> items = getMetricsToCollect();
- this.config = new MetricsCollectorConfig(topoName, stormConfig);
- collectTopologyStats = collectTopologyStats(items);
- collectExecutorStats = collectExecutorStats(items);
- collectThroughput = collectThroughput(items);
- collectSpoutThroughput = collectSpoutThroughput(items);
- collectSpoutLatency = collectSpoutLatency(items);
- dataWriter = new PrintWriter(System.err);
- }
-
-
- private Set<MetricsItem> getMetricsToCollect() {
- Set<MetricsItem> result = new HashSet<>();
- result.add(MetricsItem.ALL);
- return result;
- }
-
- public void collect(Nimbus.Client client) {
- try {
- if (!first) {
- this.lastSample = this.curSample;
- this.curSample = MetricsSample.factory(client, config.name);
- updateStats(dataWriter);
- writeLine(dataWriter);
- } else {
- LOG.info("Getting baseline metrics sample.");
- writeHeader(dataWriter);
- this.curSample = MetricsSample.factory(client, config.name);
- first = false;
- startTime = System.currentTimeMillis();
- }
- } catch (Exception e) {
- LOG.error("storm metrics failed! ", e);
- }
- }
-
- public void collect(LocalCluster localCluster) {
- try {
- if (!first) {
- this.lastSample = this.curSample;
- this.curSample = MetricsSample.factory(localCluster, config.name);
- updateStats(dataWriter);
- writeLine(dataWriter);
- } else {
- LOG.info("Getting baseline metrics sample.");
- writeHeader(dataWriter);
- this.curSample = MetricsSample.factory(localCluster, config.name);
- first = false;
- startTime = System.currentTimeMillis();
- }
- } catch (Exception e) {
- LOG.error("storm metrics failed! ", e);
- }
- }
-
- public void close() {
- dataWriter.close();
- }
-
- boolean updateStats(PrintWriter writer)
- throws Exception {
- if (collectTopologyStats) {
- updateTopologyStats();
- }
- if (collectExecutorStats) {
- updateExecutorStats();
- }
- return true;
- }
-
- void updateTopologyStats() {
- long timeTotal = System.currentTimeMillis() - startTime;
- int numWorkers = this.curSample.getNumWorkers();
- int numExecutors = this.curSample.getNumExecutors();
- int numTasks = this.curSample.getNumTasks();
- metrics.put(TIME, String.format(TIME_FORMAT, timeTotal / 1000));
- metrics.put(WORKERS, Integer.toString(numWorkers));
- metrics.put(EXECUTORS, Integer.toString(numExecutors));
- metrics.put(TASKS, Integer.toString(numTasks));
- }
-
- void updateExecutorStats() {
- long timeDiff = this.curSample.getSampleTime() - this.lastSample.getSampleTime();
- long transferredDiff = this.curSample.getTotalTransferred() - this.lastSample.getTotalTransferred();
- long throughput = transferredDiff / (timeDiff / 1000);
-
- long spoutDiff = this.curSample.getSpoutTransferred() - this.lastSample.getSpoutTransferred();
- long spoutAckedDiff = this.curSample.getTotalAcked() - this.lastSample.getTotalAcked();
- long spoutThroughput = spoutDiff / (timeDiff / 1000);
-
- if (collectThroughput) {
- metrics.put(TRANSFERRED, Long.toString(transferredDiff));
- metrics.put(XSFER_RATE, Long.toString(throughput));
- }
-
- if (collectSpoutThroughput) {
-
- metrics.put(SPOUT_EXECUTORS, Integer.toString(this.curSample.getSpoutExecutors()));
- metrics.put(SPOUT_TRANSFERRED, Long.toString(spoutDiff));
- metrics.put(SPOUT_ACKED, Long.toString(spoutAckedDiff));
- metrics.put(SPOUT_THROUGHPUT, Long.toString(spoutThroughput));
- }
-
-
- if (collectSpoutLatency) {
- double latency = this.curSample.getTotalLatency();
- if (latency > this.maxLatency) {
- this.maxLatency = latency;
- }
- metrics.put(SPOUT_AVG_COMPLETE_LATENCY,
- String.format(SPOUT_AVG_LATENCY_FORMAT, latency));
- metrics.put(SPOUT_MAX_COMPLETE_LATENCY,
- String.format(SPOUT_MAX_LATENCY_FORMAT, this.maxLatency));
-
- }
- }
-
-
- void writeHeader(PrintWriter writer) {
- header.add(TIME);
- if (collectTopologyStats) {
- header.add(WORKERS);
- header.add(TASKS);
- header.add(EXECUTORS);
- }
-
- if (collectThroughput) {
- header.add(TRANSFERRED);
- header.add(XSFER_RATE);
- }
-
- if (collectSpoutThroughput) {
- header.add(SPOUT_EXECUTORS);
- header.add(SPOUT_TRANSFERRED);
- header.add(SPOUT_ACKED);
- header.add(SPOUT_THROUGHPUT);
- }
-
- if (collectSpoutLatency) {
- header.add(SPOUT_AVG_COMPLETE_LATENCY);
- header.add(SPOUT_MAX_COMPLETE_LATENCY);
- }
-
- writer.println("\n------------------------------------------------------------------------------------------------------------------");
- String str = Utils.join(header, ",");
- writer.println(str);
- writer.println("------------------------------------------------------------------------------------------------------------------");
- writer.flush();
- }
-
- void writeLine(PrintWriter writer) {
- List<String> line = new LinkedList<String>();
- for (String h : header) {
- line.add(metrics.get(h));
- }
- String str = Utils.join(line, ",");
- writer.println(str);
- writer.flush();
- }
-
-
- boolean collectTopologyStats(Set<MetricsItem> items) {
- return items.contains(MetricsItem.ALL) ||
- items.contains(MetricsItem.TOPOLOGY_STATS);
- }
-
- boolean collectExecutorStats(Set<MetricsItem> items) {
- return items.contains(MetricsItem.ALL) ||
- items.contains(MetricsItem.XSFER_RATE) ||
- items.contains(MetricsItem.SPOUT_LATENCY);
- }
-
- boolean collectThroughput(Set<MetricsItem> items) {
- return items.contains(MetricsItem.ALL) ||
- items.contains(MetricsItem.XSFER_RATE);
- }
-
- boolean collectSpoutThroughput(Set<MetricsItem> items) {
- return items.contains(MetricsItem.ALL) ||
- items.contains(MetricsItem.SPOUT_THROUGHPUT);
- }
-
- boolean collectSpoutLatency(Set<MetricsItem> items) {
- return items.contains(MetricsItem.ALL) ||
- items.contains(MetricsItem.SPOUT_LATENCY);
- }
-
-
-
- public static class MetricsCollectorConfig {
- private static final Logger LOG = Logger.getLogger(MetricsCollectorConfig.class);
-
- // storm configuration
- public final Map stormConfig;
- // storm topology name
- public final String name;
- // benchmark label
- public final String label;
-
- public MetricsCollectorConfig(String topoName, Map stormConfig) {
- this.stormConfig = stormConfig;
- String labelStr = (String) stormConfig.get("benchmark.label");
- this.name = topoName;
- if (labelStr == null) {
- LOG.warn("'benchmark.label' not found in config. Defaulting to topology name");
- labelStr = this.name;
- }
- this.label = labelStr;
- }
- } // MetricsCollectorConfig
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/utils/Helper.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/utils/Helper.java b/storm-perf/src/main/java/org/apache/storm/perf/utils/Helper.java
deleted file mode 100755
index 8bcd84f..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/utils/Helper.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.utils;
-
-import org.apache.storm.Config;
-import org.apache.storm.LocalCluster;
-import org.apache.storm.StormSubmitter;
-import org.apache.storm.generated.KillOptions;
-import org.apache.storm.generated.Nimbus;
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.utils.NimbusClient;
-import org.apache.storm.utils.Utils;
-
-import java.util.Map;
-
-
-public class Helper {
-
- public static void kill(Nimbus.Client client, String topoName) throws Exception {
- KillOptions opts = new KillOptions();
- opts.set_wait_secs(0);
- client.killTopologyWithOpts(topoName, opts);
- }
-
- public static void killAndShutdownCluster(LocalCluster cluster, String topoName) throws Exception {
- KillOptions opts = new KillOptions();
- opts.set_wait_secs(0);
- cluster.killTopologyWithOpts(topoName, opts);
- cluster.shutdown();
- }
-
-
- public static LocalCluster runOnLocalCluster(String topoName, StormTopology topology) throws Exception {
- LocalCluster cluster = new LocalCluster();
- cluster.submitTopology(topoName, new Config(), topology);
- return cluster;
- }
-
- public static int getInt(Map map, Object key, int def) {
- return Utils.getInt(Utils.get(map, key, def));
- }
-
- public static String getStr(Map map, Object key) {
- return (String) map.get(key);
- }
-
- public static void collectMetricsAndKill(String topologyName, Integer pollInterval, Integer duration) throws Exception {
- Map clusterConf = Utils.readStormConfig();
- Nimbus.Client client = NimbusClient.getConfiguredClient(clusterConf).getClient();
- BasicMetricsCollector metricsCollector = new BasicMetricsCollector(client, topologyName, clusterConf);
-
- int times = duration / pollInterval;
- metricsCollector.collect(client);
- for (int i = 0; i < times; i++) {
- Thread.sleep(pollInterval * 1000);
- metricsCollector.collect(client);
- }
- metricsCollector.close();
- kill(client, topologyName);
- }
-
- public static void collectLocalMetricsAndKill(LocalCluster localCluster, String topologyName, Integer pollInterval, Integer duration, Map clusterConf) throws Exception {
- BasicMetricsCollector metricsCollector = new BasicMetricsCollector(localCluster, topologyName, clusterConf);
-
- int times = duration / pollInterval;
- metricsCollector.collect(localCluster);
- for (int i = 0; i < times; i++) {
- Thread.sleep(pollInterval * 1000);
- metricsCollector.collect(localCluster);
- }
- metricsCollector.close();
- killAndShutdownCluster(localCluster, topologyName);
- }
-
- /** Kill topo and Shutdown local cluster on Ctrl-C */
- public static void setupShutdownHook(final LocalCluster cluster, final String topoName) {
- Runtime.getRuntime().addShutdownHook(new Thread() {
- public void run() {
- try {
- cluster.killTopology(topoName);
- System.out.println("Killed Topology");
- } catch (Exception e) {
- System.err.println("Encountered error in killing topology: " + e);
- }
- cluster.shutdown();
- }
- });
- }
-
- /** Kill topo on Ctrl-C */
- public static void setupShutdownHook(final String topoName) {
- Map clusterConf = Utils.readStormConfig();
- final Nimbus.Client client = NimbusClient.getConfiguredClient(clusterConf).getClient();
- Runtime.getRuntime().addShutdownHook(new Thread() {
- public void run() {
- try {
- Helper.kill(client, topoName);
- System.out.println("Killed Topology");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- }
-
- public static void runOnClusterAndPrintMetrics(Integer durationSec, String topoName, Map topoConf, StormTopology topology) throws Exception {
- // submit topology
- StormSubmitter.submitTopologyWithProgressBar(topoName, topoConf, topology);
- setupShutdownHook(topoName); // handle Ctrl-C
-
- // poll metrics every minute, then kill topology after specified duration
- Integer pollIntervalSec = 60;
- collectMetricsAndKill(topoName, pollIntervalSec, durationSec);
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/utils/IdentityBolt.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/utils/IdentityBolt.java b/storm-perf/src/main/java/org/apache/storm/perf/utils/IdentityBolt.java
deleted file mode 100755
index 396ad53..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/utils/IdentityBolt.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.utils;
-
-
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichBolt;
-import org.apache.storm.tuple.Tuple;
-import org.apache.storm.tuple.Values;
-
-import java.util.Map;
-
-
-public class IdentityBolt extends BaseRichBolt {
- private OutputCollector collector;
-
- @Override
- public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
- this.collector = collector;
- }
-
- @Override
- public void execute(Tuple tuple) {
- collector.emit(tuple, tuple.getValues() );
- collector.ack(tuple);
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
-
- }
-}
-
[06/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/examples/src/main/resources/jms-activemq.xml
----------------------------------------------------------------------
diff --git a/external/storm-jms/examples/src/main/resources/jms-activemq.xml b/external/storm-jms/examples/src/main/resources/jms-activemq.xml
deleted file mode 100644
index 1a845b8..0000000
--- a/external/storm-jms/examples/src/main/resources/jms-activemq.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:amq="http://activemq.apache.org/schema/core"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
-
- <!-- ActiveMQ -->
-
- <!-- embedded ActiveMQ Broker -->
- <!-- <amq:broker useJmx="false" persistent="false">
- <amq:transportConnectors>
- <amq:transportConnector uri="tcp://localhost:61616" />
- </amq:transportConnectors>
- </amq:broker> -->
-
- <amq:queue id="notificationQueue" physicalName="backtype.storm.contrib.example.queue" />
-
- <amq:topic id="notificationTopic" physicalName="backtype.storm.contrib.example.topic" />
-
- <amq:connectionFactory id="jmsConnectionFactory"
- brokerURL="tcp://localhost:61616" />
-
- <!-- <bean id="queueTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory">
- <ref bean="jmsConnectionFactory" />
- </property>
- <property name="pubSubDomain" value="false" />
- </bean> -->
-
-</beans>
-
-
-
-
-
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/examples/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/external/storm-jms/examples/src/main/resources/log4j.properties b/external/storm-jms/examples/src/main/resources/log4j.properties
deleted file mode 100644
index 079b195..0000000
--- a/external/storm-jms/examples/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,29 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-log4j.rootLogger=INFO, stdout
-
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-
-log4j.appender.stdout.layout.ConversionPattern=%5p (%C:%L) - %m%n
-
-
-log4j.logger.backtype.storm.contrib=DEBUG
-log4j.logger.clojure.contrib=WARN
-log4j.logger.org.springframework=WARN
-log4j.logger.org.apache.zookeeper=WARN
-
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-jms/pom.xml b/external/storm-jms/pom.xml
index 6a6e60a..0e0feb4 100644
--- a/external/storm-jms/pom.xml
+++ b/external/storm-jms/pom.xml
@@ -27,8 +27,9 @@
- <artifactId>storm-jms-parent</artifactId>
- <packaging>pom</packaging>
+ <artifactId>storm-jms</artifactId>
+
+
<developers>
<developer>
@@ -38,10 +39,45 @@
</developer>
</developers>
- <modules>
- <module>core</module>
- <module>examples</module>
- </modules>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-core</artifactId>
+ <version>${project.version}</version>
+ <!-- keep storm out of the jar-with-dependencies -->
+ <scope>${provided.scope}</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jms_1.1_spec</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.10</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- Active MQ -->
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-core</artifactId>
+ <version>5.5.1</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ </dependencies>
<build>
<plugins>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/JmsMessageProducer.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/JmsMessageProducer.java b/external/storm-jms/src/main/java/org/apache/storm/jms/JmsMessageProducer.java
new file mode 100644
index 0000000..4932929
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/JmsMessageProducer.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms;
+
+import java.io.Serializable;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+
+import org.apache.storm.tuple.ITuple;
+
+/**
+ * JmsMessageProducer implementations are responsible for translating
+ * a <code>org.apache.storm.tuple.Values</code> instance into a
+ * <code>javax.jms.Message</code> object.
+ * <p>
+ */
+public interface JmsMessageProducer extends Serializable {
+
+ /**
+ * Translate a <code>org.apache.storm.tuple.Tuple</code> object
+ * to a <code>javax.jms.Message</code object.
+ *
+ * @param session
+ * @param input
+ * @return
+ * @throws JMSException
+ */
+ public Message toMessage(Session session, ITuple input) throws JMSException;
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/JmsProvider.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/JmsProvider.java b/external/storm-jms/src/main/java/org/apache/storm/jms/JmsProvider.java
new file mode 100644
index 0000000..d976326
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/JmsProvider.java
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms;
+
+import java.io.Serializable;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+
+/**
+ * A <code>JmsProvider</code> object encapsulates the <code>ConnectionFactory</code>
+ * and <code>Destination</code> JMS objects the <code>JmsSpout</code> needs to manage
+ * a topic/queue connection over the course of it's lifecycle.
+ *
+ */
+public interface JmsProvider extends Serializable {
+ /**
+ * Provides the JMS <code>ConnectionFactory</code>
+ *
+ * @return the connection factory
+ * @throws Exception
+ */
+ public ConnectionFactory connectionFactory() throws Exception;
+
+ /**
+ * Provides the <code>Destination</code> (topic or queue) from which the
+ * <code>JmsSpout</code> will receive messages.
+ *
+ * @return
+ * @throws Exception
+ */
+ public Destination destination() throws Exception;
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/JmsTupleProducer.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/JmsTupleProducer.java b/external/storm-jms/src/main/java/org/apache/storm/jms/JmsTupleProducer.java
new file mode 100644
index 0000000..0bbb3a0
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/JmsTupleProducer.java
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms;
+
+import java.io.Serializable;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Values;
+
+/**
+ * Interface to define classes that can produce a Storm <code>Values</code> objects
+ * from a <code>javax.jms.Message</code> object>.
+ * <p>
+ * Implementations are also responsible for declaring the output
+ * fields they produce.
+ * <p>
+ * If for some reason the implementation can't process a message
+ * (for example if it received a <code>javax.jms.ObjectMessage</code>
+ * when it was expecting a <code>javax.jms.TextMessage</code> it should
+ * return <code>null</code> to indicate to the <code>JmsSpout</code> that
+ * the message could not be processed.
+ *
+ */
+public interface JmsTupleProducer extends Serializable {
+ /**
+ * Process a JMS message object to create a Values object.
+ *
+ * @param msg - the JMS message
+ * @return the Values tuple, or null if the message couldn't be processed.
+ * @throws JMSException
+ */
+ Values toTuple(Message msg) throws JMSException;
+
+ /**
+ * Declare the output fields produced by this JmsTupleProducer.
+ *
+ * @param declarer The OuputFieldsDeclarer for the spout.
+ */
+ void declareOutputFields(OutputFieldsDeclarer declarer);
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/bolt/JmsBolt.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/bolt/JmsBolt.java b/external/storm-jms/src/main/java/org/apache/storm/jms/bolt/JmsBolt.java
new file mode 100644
index 0000000..d691e75
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/bolt/JmsBolt.java
@@ -0,0 +1,219 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.bolt;
+
+import java.util.Map;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.apache.storm.topology.base.BaseRichBolt;
+import org.apache.storm.jms.JmsMessageProducer;
+import org.apache.storm.jms.JmsProvider;
+import org.apache.storm.topology.base.BaseTickTupleAwareRichBolt;
+import org.apache.storm.utils.TupleUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Tuple;
+
+/**
+ * A JmsBolt receives <code>org.apache.storm.tuple.Tuple</code> objects from a Storm
+ * topology and publishes JMS Messages to a destination (topic or queue).
+ * <p>
+ * To use a JmsBolt in a topology, the following must be supplied:
+ * <ol>
+ * <li>A <code>JmsProvider</code> implementation.</li>
+ * <li>A <code>JmsMessageProducer</code> implementation.</li>
+ * </ol>
+ * The <code>JmsProvider</code> provides the JMS <code>javax.jms.ConnectionFactory</code>
+ * and <code>javax.jms.Destination</code> objects requied to publish JMS messages.
+ * <p>
+ * The JmsBolt uses a <code>JmsMessageProducer</code> to translate
+ * <code>org.apache.storm.tuple.Tuple</code> objects into
+ * <code>javax.jms.Message</code> objects for publishing.
+ * <p>
+ * Both JmsProvider and JmsMessageProducer must be set, or the bolt will
+ * fail upon deployment to a cluster.
+ * <p>
+ * The JmsBolt is typically an endpoint in a topology -- in other words
+ * it does not emit any tuples.
+ */
+public class JmsBolt extends BaseTickTupleAwareRichBolt {
+ private static Logger LOG = LoggerFactory.getLogger(JmsBolt.class);
+
+ private boolean autoAck = true;
+
+ // javax.jms objects
+ private Connection connection;
+ private Session session;
+ private MessageProducer messageProducer;
+
+ // JMS options
+ private boolean jmsTransactional = false;
+ private int jmsAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;
+
+
+ private JmsProvider jmsProvider;
+ private JmsMessageProducer producer;
+
+
+ private OutputCollector collector;
+
+ /**
+ * Set the JmsProvider used to connect to the JMS destination topic/queue
+ *
+ * @param provider
+ */
+ public void setJmsProvider(JmsProvider provider) {
+ this.jmsProvider = provider;
+ }
+
+ /**
+ * Set the JmsMessageProducer used to convert tuples
+ * into JMS messages.
+ *
+ * @param producer
+ */
+ public void setJmsMessageProducer(JmsMessageProducer producer) {
+ this.producer = producer;
+ }
+
+ /**
+ * Sets the JMS acknowledgement mode for JMS messages sent
+ * by this bolt.
+ * <p>
+ * Possible values:
+ * <ul>
+ * <li>javax.jms.Session.AUTO_ACKNOWLEDGE</li>
+ * <li>javax.jms.Session.CLIENT_ACKNOWLEDGE</li>
+ * <li>javax.jms.Session.DUPS_OK_ACKNOWLEDGE</li>
+ * </ul>
+ *
+ * @param acknowledgeMode (constant defined in javax.jms.Session)
+ */
+ public void setJmsAcknowledgeMode(int acknowledgeMode) {
+ this.jmsAcknowledgeMode = acknowledgeMode;
+ }
+
+ /**
+ * Set the JMS transactional setting for the JMS session.
+ *
+ * @param transactional
+ */
+// public void setJmsTransactional(boolean transactional){
+// this.jmsTransactional = transactional;
+// }
+
+ /**
+ * Sets whether or not tuples should be acknowledged by this
+ * bolt.
+ * <p>
+ *
+ * @param autoAck
+ */
+ public void setAutoAck(boolean autoAck) {
+ this.autoAck = autoAck;
+ }
+
+
+ /**
+ * Consumes a tuple and sends a JMS message.
+ * <p>
+ * If autoAck is true, the tuple will be acknowledged
+ * after the message is sent.
+ * <p>
+ * If JMS sending fails, the tuple will be failed.
+ */
+ @Override
+ protected void process(Tuple input) {
+ // write the tuple to a JMS destination...
+ LOG.debug("Tuple received. Sending JMS message.");
+
+ try {
+ Message msg = this.producer.toMessage(this.session, input);
+ if (msg != null) {
+ if (msg.getJMSDestination() != null) {
+ this.messageProducer.send(msg.getJMSDestination(), msg);
+ } else {
+ this.messageProducer.send(msg);
+ }
+ }
+ if (this.autoAck) {
+ LOG.debug("ACKing tuple: " + input);
+ this.collector.ack(input);
+ }
+ } catch (JMSException e) {
+ // failed to send the JMS message, fail the tuple fast
+ LOG.warn("Failing tuple: " + input);
+ LOG.warn("Exception: ", e);
+ this.collector.fail(input);
+ }
+ }
+
+ /**
+ * Releases JMS resources.
+ */
+ @Override
+ public void cleanup() {
+ try {
+ LOG.debug("Closing JMS connection.");
+ this.session.close();
+ this.connection.close();
+ } catch (JMSException e) {
+ LOG.warn("Error closing JMS connection.", e);
+ }
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ }
+
+ /**
+ * Initializes JMS resources.
+ */
+ @Override
+ public void prepare(Map stormConf, TopologyContext context,
+ OutputCollector collector) {
+ if (this.jmsProvider == null || this.producer == null) {
+ throw new IllegalStateException("JMS Provider and MessageProducer not set.");
+ }
+ this.collector = collector;
+ LOG.debug("Connecting JMS..");
+ try {
+ ConnectionFactory cf = this.jmsProvider.connectionFactory();
+ Destination dest = this.jmsProvider.destination();
+ this.connection = cf.createConnection();
+ this.session = connection.createSession(this.jmsTransactional,
+ this.jmsAcknowledgeMode);
+ this.messageProducer = session.createProducer(dest);
+
+ connection.start();
+ } catch (Exception e) {
+ LOG.warn("Error creating JMS connection.", e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/spout/JmsMessageID.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/spout/JmsMessageID.java b/external/storm-jms/src/main/java/org/apache/storm/jms/spout/JmsMessageID.java
new file mode 100644
index 0000000..b78a41e
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/spout/JmsMessageID.java
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.spout;
+
+import java.io.Serializable;
+
+public class JmsMessageID implements Comparable<JmsMessageID>, Serializable {
+
+ private String jmsID;
+
+ private Long sequence;
+
+ public JmsMessageID(long sequence, String jmsID){
+ this.jmsID = jmsID;
+ this.sequence = sequence;
+ }
+
+
+ public String getJmsID(){
+ return this.jmsID;
+ }
+
+ @Override
+ public int compareTo(JmsMessageID jmsMessageID) {
+ return (int)(this.sequence - jmsMessageID.sequence);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.sequence.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if(o instanceof JmsMessageID){
+ JmsMessageID id = (JmsMessageID)o;
+ return this.jmsID.equals(id.jmsID);
+ } else {
+ return false;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/spout/JmsSpout.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/spout/JmsSpout.java b/external/storm-jms/src/main/java/org/apache/storm/jms/spout/JmsSpout.java
new file mode 100644
index 0000000..6aaa7c9
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/spout/JmsSpout.java
@@ -0,0 +1,382 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.spout;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+
+import org.apache.storm.topology.base.BaseRichSpout;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.storm.jms.JmsProvider;
+import org.apache.storm.jms.JmsTupleProducer;
+import org.apache.storm.spout.SpoutOutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Values;
+import org.apache.storm.utils.Utils;
+
+/**
+ * A Storm <code>Spout</code> implementation that listens to a JMS topic or queue
+ * and outputs tuples based on the messages it receives.
+ * <p>
+ * <code>JmsSpout</code> instances rely on <code>JmsProducer</code> implementations
+ * to obtain the JMS <code>ConnectionFactory</code> and <code>Destination</code> objects
+ * necessary to connect to a JMS topic/queue.
+ * <p>
+ * When a <code>JmsSpout</code> receives a JMS message, it delegates to an
+ * internal <code>JmsTupleProducer</code> instance to create a Storm tuple from the
+ * incoming message.
+ * <p>
+ * Typically, developers will supply a custom <code>JmsTupleProducer</code> implementation
+ * appropriate for the expected message content.
+ */
+@SuppressWarnings("serial")
+public class JmsSpout extends BaseRichSpout implements MessageListener {
+ private static final Logger LOG = LoggerFactory.getLogger(JmsSpout.class);
+
+ // JMS options
+ private int jmsAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;
+
+ private boolean distributed = true;
+
+ private JmsTupleProducer tupleProducer;
+
+ private JmsProvider jmsProvider;
+
+ private LinkedBlockingQueue<Message> queue;
+ private TreeSet<JmsMessageID> toCommit;
+ private HashMap<JmsMessageID, Message> pendingMessages;
+ private long messageSequence = 0;
+
+ private SpoutOutputCollector collector;
+
+ private transient Connection connection;
+ private transient Session session;
+
+ private boolean hasFailures = false;
+ public final Serializable recoveryMutex = "RECOVERY_MUTEX";
+ private Timer recoveryTimer = null;
+ private long recoveryPeriod = -1; // default to disabled
+
+ /**
+ * Sets the JMS Session acknowledgement mode for the JMS seesion associated with this spout.
+ * <p>
+ * Possible values:
+ * <ul>
+ * <li>javax.jms.Session.AUTO_ACKNOWLEDGE</li>
+ * <li>javax.jms.Session.CLIENT_ACKNOWLEDGE</li>
+ * <li>javax.jms.Session.DUPS_OK_ACKNOWLEDGE</li>
+ * </ul>
+ *
+ * @param mode JMS Session Acknowledgement mode
+ * @throws IllegalArgumentException if the mode is not recognized.
+ */
+ public void setJmsAcknowledgeMode(int mode) {
+ switch (mode) {
+ case Session.AUTO_ACKNOWLEDGE:
+ case Session.CLIENT_ACKNOWLEDGE:
+ case Session.DUPS_OK_ACKNOWLEDGE:
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown Acknowledge mode: " + mode + " (See javax.jms.Session for valid values)");
+
+ }
+ this.jmsAcknowledgeMode = mode;
+ }
+
+ /**
+ * Returns the JMS Session acknowledgement mode for the JMS seesion associated with this spout.
+ *
+ * @return
+ */
+ public int getJmsAcknowledgeMode() {
+ return this.jmsAcknowledgeMode;
+ }
+
+ /**
+ * Set the <code>JmsProvider</code>
+ * implementation that this Spout will use to connect to
+ * a JMS <code>javax.jms.Desination</code>
+ *
+ * @param provider
+ */
+ public void setJmsProvider(JmsProvider provider) {
+ this.jmsProvider = provider;
+ }
+
+ /**
+ * Set the <code>JmsTupleProducer</code>
+ * implementation that will convert <code>javax.jms.Message</code>
+ * object to <code>org.apache.storm.tuple.Values</code> objects
+ * to be emitted.
+ *
+ * @param producer
+ */
+ public void setJmsTupleProducer(JmsTupleProducer producer) {
+ this.tupleProducer = producer;
+ }
+
+ /**
+ * <code>javax.jms.MessageListener</code> implementation.
+ * <p>
+ * Stored the JMS message in an internal queue for processing
+ * by the <code>nextTuple()</code> method.
+ */
+ public void onMessage(Message msg) {
+ try {
+ LOG.debug("Queuing msg [" + msg.getJMSMessageID() + "]");
+ } catch (JMSException e) {
+ }
+ this.queue.offer(msg);
+ }
+
+ /**
+ * <code>ISpout</code> implementation.
+ * <p>
+ * Connects the JMS spout to the configured JMS destination
+ * topic/queue.
+ */
+ @SuppressWarnings("rawtypes")
+ public void open(Map conf, TopologyContext context,
+ SpoutOutputCollector collector) {
+ if (this.jmsProvider == null) {
+ throw new IllegalStateException("JMS provider has not been set.");
+ }
+ if (this.tupleProducer == null) {
+ throw new IllegalStateException("JMS Tuple Producer has not been set.");
+ }
+ Integer topologyTimeout = (Integer) conf.get("topology.message.timeout.secs");
+ // TODO fine a way to get the default timeout from storm, so we're not hard-coding to 30 seconds (it could change)
+ topologyTimeout = topologyTimeout == null ? 30 : topologyTimeout;
+ if ((topologyTimeout.intValue() * 1000) > this.recoveryPeriod) {
+ LOG.warn("*** WARNING *** : " +
+ "Recovery period (" + this.recoveryPeriod + " ms.) is less then the configured " +
+ "'topology.message.timeout.secs' of " + topologyTimeout +
+ " secs. This could lead to a message replay flood!");
+ }
+ this.queue = new LinkedBlockingQueue<Message>();
+ this.toCommit = new TreeSet<JmsMessageID>();
+ this.pendingMessages = new HashMap<JmsMessageID, Message>();
+ this.collector = collector;
+ try {
+ ConnectionFactory cf = this.jmsProvider.connectionFactory();
+ Destination dest = this.jmsProvider.destination();
+ this.connection = cf.createConnection();
+ this.session = connection.createSession(false,
+ this.jmsAcknowledgeMode);
+ MessageConsumer consumer = session.createConsumer(dest);
+ consumer.setMessageListener(this);
+ this.connection.start();
+ if (this.isDurableSubscription() && this.recoveryPeriod > 0) {
+ this.recoveryTimer = new Timer();
+ this.recoveryTimer.scheduleAtFixedRate(new RecoveryTask(), 10, this.recoveryPeriod);
+ }
+
+ } catch (Exception e) {
+ LOG.warn("Error creating JMS connection.", e);
+ }
+
+ }
+
+ public void close() {
+ try {
+ LOG.debug("Closing JMS connection.");
+ this.session.close();
+ this.connection.close();
+ } catch (JMSException e) {
+ LOG.warn("Error closing JMS connection.", e);
+ }
+
+ }
+
+ public void nextTuple() {
+ Message msg = this.queue.poll();
+ if (msg == null) {
+ Utils.sleep(50);
+ } else {
+
+ LOG.debug("sending tuple: " + msg);
+ // get the tuple from the handler
+ try {
+ Values vals = this.tupleProducer.toTuple(msg);
+ // ack if we're not in AUTO_ACKNOWLEDGE mode, or the message requests ACKNOWLEDGE
+ LOG.debug("Requested deliveryMode: " + toDeliveryModeString(msg.getJMSDeliveryMode()));
+ LOG.debug("Our deliveryMode: " + toDeliveryModeString(this.jmsAcknowledgeMode));
+ if (this.isDurableSubscription()) {
+ LOG.debug("Requesting acks.");
+ JmsMessageID messageId = new JmsMessageID(this.messageSequence++, msg.getJMSMessageID());
+ this.collector.emit(vals, messageId);
+
+ // at this point we successfully emitted. Store
+ // the message and message ID so we can do a
+ // JMS acknowledge later
+ this.pendingMessages.put(messageId, msg);
+ this.toCommit.add(messageId);
+ } else {
+ this.collector.emit(vals);
+ }
+ } catch (JMSException e) {
+ LOG.warn("Unable to convert JMS message: " + msg);
+ }
+
+ }
+
+ }
+
+ /*
+ * Will only be called if we're transactional or not AUTO_ACKNOWLEDGE
+ */
+ public void ack(Object msgId) {
+
+ Message msg = this.pendingMessages.remove(msgId);
+ JmsMessageID oldest = this.toCommit.first();
+ if (msgId.equals(oldest)) {
+ if (msg != null) {
+ try {
+ LOG.debug("Committing...");
+ msg.acknowledge();
+ LOG.debug("JMS Message acked: " + msgId);
+ this.toCommit.remove(msgId);
+ } catch (JMSException e) {
+ LOG.warn("Error acknowldging JMS message: " + msgId, e);
+ }
+ } else {
+ LOG.warn("Couldn't acknowledge unknown JMS message ID: " + msgId);
+ }
+ } else {
+ this.toCommit.remove(msgId);
+ }
+
+ }
+
+ /*
+ * Will only be called if we're transactional or not AUTO_ACKNOWLEDGE
+ */
+ public void fail(Object msgId) {
+ LOG.warn("Message failed: " + msgId);
+ this.pendingMessages.clear();
+ this.toCommit.clear();
+ synchronized (this.recoveryMutex) {
+ this.hasFailures = true;
+ }
+ }
+
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ this.tupleProducer.declareOutputFields(declarer);
+
+ }
+
+ /**
+ * Returns <code>true</code> if the spout has received failures
+ * from which it has not yet recovered.
+ */
+ public boolean hasFailures() {
+ return this.hasFailures;
+ }
+
+ protected void recovered() {
+ this.hasFailures = false;
+ }
+
+ /**
+ * Sets the periodicity of the timer task that
+ * checks for failures and recovers the JMS session.
+ *
+ * @param period
+ */
+ public void setRecoveryPeriod(long period) {
+ this.recoveryPeriod = period;
+ }
+
+ public boolean isDistributed() {
+ return this.distributed;
+ }
+
+ /**
+ * Sets the "distributed" mode of this spout.
+ * <p>
+ * If <code>true</code> multiple instances of this spout <i>may</i> be
+ * created across the cluster (depending on the "parallelism_hint" in the topology configuration).
+ * <p>
+ * Setting this value to <code>false</code> essentially means this spout will run as a singleton
+ * within the cluster ("parallelism_hint" will be ignored).
+ * <p>
+ * In general, this should be set to <code>false</code> if the underlying JMS destination is a
+ * topic, and <code>true</code> if it is a JMS queue.
+ *
+ * @param distributed
+ */
+ public void setDistributed(boolean distributed) {
+ this.distributed = distributed;
+ }
+
+
+ private static final String toDeliveryModeString(int deliveryMode) {
+ switch (deliveryMode) {
+ case Session.AUTO_ACKNOWLEDGE:
+ return "AUTO_ACKNOWLEDGE";
+ case Session.CLIENT_ACKNOWLEDGE:
+ return "CLIENT_ACKNOWLEDGE";
+ case Session.DUPS_OK_ACKNOWLEDGE:
+ return "DUPS_OK_ACKNOWLEDGE";
+ default:
+ return "UNKNOWN";
+
+ }
+ }
+
+ protected Session getSession() {
+ return this.session;
+ }
+
+ private boolean isDurableSubscription() {
+ return (this.jmsAcknowledgeMode != Session.AUTO_ACKNOWLEDGE);
+ }
+
+
+ private class RecoveryTask extends TimerTask {
+ private final Logger LOG = LoggerFactory.getLogger(RecoveryTask.class);
+
+ public void run() {
+ synchronized (JmsSpout.this.recoveryMutex) {
+ if (JmsSpout.this.hasFailures()) {
+ try {
+ LOG.info("Recovering from a message failure.");
+ JmsSpout.this.getSession().recover();
+ JmsSpout.this.recovered();
+ } catch (JMSException e) {
+ LOG.warn("Could not recover jms session.", e);
+ }
+ }
+ }
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsBatch.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsBatch.java b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsBatch.java
new file mode 100644
index 0000000..c990058
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsBatch.java
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.trident;
+
+/**
+ * Batch coordination metadata object for the TridentJmsSpout.
+ * This implementation does not use batch metadata, so the object is empty.
+ *
+ */
+public class JmsBatch {
+ // Empty class
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsState.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsState.java b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsState.java
new file mode 100644
index 0000000..bfb78b5
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsState.java
@@ -0,0 +1,129 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.trident;
+
+import org.apache.storm.jms.JmsMessageProducer;
+import org.apache.storm.jms.JmsProvider;
+import org.apache.storm.topology.FailedException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.storm.trident.operation.TridentCollector;
+import org.apache.storm.trident.state.State;
+import org.apache.storm.trident.tuple.TridentTuple;
+
+import javax.jms.*;
+import java.io.Serializable;
+import java.lang.IllegalStateException;
+import java.util.List;
+
+public class JmsState implements State {
+
+ private static final Logger LOG = LoggerFactory.getLogger(JmsState.class);
+
+ private Options options;
+ private Connection connection;
+ private Session session;
+ private MessageProducer messageProducer;
+
+ protected JmsState(Options options) {
+ this.options = options;
+ }
+
+ public static class Options implements Serializable {
+ private JmsProvider jmsProvider;
+ private JmsMessageProducer msgProducer;
+ private int jmsAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;
+ private boolean jmsTransactional = true;
+
+ public Options withJmsProvider(JmsProvider provider) {
+ this.jmsProvider = provider;
+ return this;
+ }
+
+ public Options withMessageProducer(JmsMessageProducer msgProducer) {
+ this.msgProducer = msgProducer;
+ return this;
+ }
+
+ public Options withJmsAcknowledgeMode(int jmsAcknowledgeMode) {
+ this.jmsAcknowledgeMode = jmsAcknowledgeMode;
+ return this;
+ }
+
+ public Options withJmsTransactional(boolean jmsTransactional) {
+ this.jmsTransactional = jmsTransactional;
+ return this;
+ }
+ }
+
+ protected void prepare() {
+ if(this.options.jmsProvider == null || this.options.msgProducer == null){
+ throw new IllegalStateException("JMS Provider and MessageProducer not set.");
+ }
+ LOG.debug("Connecting JMS..");
+ try {
+ ConnectionFactory cf = this.options.jmsProvider.connectionFactory();
+ Destination dest = this.options.jmsProvider.destination();
+ this.connection = cf.createConnection();
+ this.session = connection.createSession(this.options.jmsTransactional,
+ this.options.jmsAcknowledgeMode);
+ this.messageProducer = session.createProducer(dest);
+
+ connection.start();
+ } catch (Exception e) {
+ LOG.warn("Error creating JMS connection.", e);
+ }
+ }
+
+ @Override
+ public void beginCommit(Long aLong) {
+ }
+
+ @Override
+ public void commit(Long aLong) {
+ LOG.debug("Committing JMS transaction.");
+ if(this.options.jmsTransactional) {
+ try {
+ session.commit();
+ } catch(JMSException e){
+ LOG.error("JMS Session commit failed.", e);
+ }
+ }
+ }
+
+ public void updateState(List<TridentTuple> tuples, TridentCollector collector) throws JMSException {
+ try {
+ for(TridentTuple tuple : tuples) {
+ Message msg = this.options.msgProducer.toMessage(this.session, tuple);
+ if (msg != null) {
+ if (msg.getJMSDestination() != null) {
+ this.messageProducer.send(msg.getJMSDestination(), msg);
+ } else {
+ this.messageProducer.send(msg);
+ }
+ }
+ }
+ } catch (JMSException e) {
+ LOG.warn("Failed to send jmd message for a trident batch ", e);
+ if(this.options.jmsTransactional) {
+ session.rollback();
+ }
+ throw new FailedException("Failed to write tuples", e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsStateFactory.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsStateFactory.java b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsStateFactory.java
new file mode 100644
index 0000000..9a02ba9
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsStateFactory.java
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.trident;
+
+import org.apache.storm.task.IMetricsContext;
+import org.apache.storm.trident.state.State;
+import org.apache.storm.trident.state.StateFactory;
+
+import java.util.Map;
+
+public class JmsStateFactory implements StateFactory {
+
+ private JmsState.Options options;
+
+ public JmsStateFactory(JmsState.Options options) {
+ this.options = options;
+ }
+
+ @Override
+ public State makeState(Map map, IMetricsContext iMetricsContext, int partitionIndex, int numPartitions) {
+ JmsState state = new JmsState(options);
+ state.prepare();
+ return state;
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsUpdater.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsUpdater.java b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsUpdater.java
new file mode 100644
index 0000000..a2709a4
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/JmsUpdater.java
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.trident;
+
+import org.apache.storm.topology.FailedException;
+import org.apache.storm.trident.operation.TridentCollector;
+import org.apache.storm.trident.state.BaseStateUpdater;
+import org.apache.storm.trident.tuple.TridentTuple;
+
+import javax.jms.JMSException;
+import java.util.List;
+
+public class JmsUpdater extends BaseStateUpdater<JmsState> {
+
+ @Override
+ public void updateState(JmsState jmsState, List<TridentTuple> tuples, TridentCollector collector) {
+ try {
+ jmsState.updateState(tuples, collector);
+ } catch (JMSException e) {
+ throw new FailedException("failed JMS opetation", e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/main/java/org/apache/storm/jms/trident/TridentJmsSpout.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/main/java/org/apache/storm/jms/trident/TridentJmsSpout.java b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/TridentJmsSpout.java
new file mode 100644
index 0000000..55e29bc
--- /dev/null
+++ b/external/storm-jms/src/main/java/org/apache/storm/jms/trident/TridentJmsSpout.java
@@ -0,0 +1,409 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.trident;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+
+import org.apache.storm.jms.JmsProvider;
+import org.apache.storm.jms.JmsTupleProducer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.storm.trident.operation.TridentCollector;
+import org.apache.storm.trident.spout.ITridentSpout;
+import org.apache.storm.trident.topology.TransactionAttempt;
+import org.apache.storm.Config;
+import org.apache.storm.generated.StreamInfo;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsGetter;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+import org.apache.storm.utils.RotatingMap;
+import org.apache.storm.utils.Utils;
+
+/**
+ * Trident implementation of the JmsSpout
+ * <p>
+ *
+ */
+public class TridentJmsSpout implements ITridentSpout<JmsBatch> {
+
+ public static final String MAX_BATCH_SIZE_CONF = "topology.spout.max.batch.size";
+
+ public static final int DEFAULT_BATCH_SIZE = 1000;
+
+ private static final long serialVersionUID = -3469351154693356655L;
+
+ private JmsTupleProducer tupleProducer;
+
+ private JmsProvider jmsProvider;
+
+ private int jmsAcknowledgeMode;
+
+ private String name;
+
+ private static int nameIndex = 1;
+
+ /**
+ * Create a TridentJmsSpout with a default name and acknowledge mode of AUTO_ACKNOWLEDGE
+ */
+ public TridentJmsSpout() {
+ this.name = "JmsSpout_"+(nameIndex++);
+ this.jmsAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;
+ }
+
+ /**
+ * Set the name for this spout, to improve log identification
+ * @param name The name to be used in log messages
+ * @return This spout
+ */
+ public TridentJmsSpout named(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Set the <code>JmsProvider</code>
+ * implementation that this Spout will use to connect to
+ * a JMS <code>javax.jms.Desination</code>
+ *
+ * @param provider
+ */
+ public TridentJmsSpout withJmsProvider(JmsProvider provider){
+ this.jmsProvider = provider;
+ return this;
+ }
+
+ /**
+ * Set the <code>JmsTupleProducer</code>
+ * implementation that will convert <code>javax.jms.Message</code>
+ * object to <code>backtype.storm.tuple.Values</code> objects
+ * to be emitted.
+ *
+ * @param tupleProducer
+ * @return This spout
+ */
+ public TridentJmsSpout withTupleProducer(JmsTupleProducer tupleProducer) {
+ this.tupleProducer = tupleProducer;
+ return this;
+ }
+
+ /**
+ * Set the JMS acknowledge mode for messages being processed by this spout.
+ * <p/>
+ * Possible values:
+ * <ul>
+ * <li>javax.jms.Session.AUTO_ACKNOWLEDGE</li>
+ * <li>javax.jms.Session.CLIENT_ACKNOWLEDGE</li>
+ * <li>javax.jms.Session.DUPS_OK_ACKNOWLEDGE</li>
+ * </ul>
+ * @param jmsAcknowledgeMode The chosen acknowledge mode
+ * @return This spout
+ * @throws IllegalArgumentException if the mode is not recognized
+ */
+ public TridentJmsSpout withJmsAcknowledgeMode(int jmsAcknowledgeMode) {
+ toDeliveryModeString(jmsAcknowledgeMode);
+ this.jmsAcknowledgeMode = jmsAcknowledgeMode;
+ return this;
+ }
+
+ /**
+ * Return a friendly string for the given JMS acknowledge mode, or throw an IllegalArgumentException if
+ * the mode is not recognized.
+ * <p/>
+ * Possible values:
+ * <ul>
+ * <li>javax.jms.Session.AUTO_ACKNOWLEDGE</li>
+ * <li>javax.jms.Session.CLIENT_ACKNOWLEDGE</li>
+ * <li>javax.jms.Session.DUPS_OK_ACKNOWLEDGE</li>
+ * </ul>
+ * @param acknowledgeMode A valid JMS acknowledge mode
+ * @return A friendly string describing the acknowledge mode
+ * @throws IllegalArgumentException if the mode is not recognized
+ */
+ private static final String toDeliveryModeString(int acknowledgeMode) {
+ switch (acknowledgeMode) {
+ case Session.AUTO_ACKNOWLEDGE:
+ return "AUTO_ACKNOWLEDGE";
+ case Session.CLIENT_ACKNOWLEDGE:
+ return "CLIENT_ACKNOWLEDGE";
+ case Session.DUPS_OK_ACKNOWLEDGE:
+ return "DUPS_OK_ACKNOWLEDGE";
+ default:
+ throw new IllegalArgumentException("Unknown JMS Acknowledge mode " + acknowledgeMode + " (See javax.jms.Session for valid values)");
+ }
+ }
+
+ @Override
+ public ITridentSpout.BatchCoordinator<JmsBatch> getCoordinator(
+ String txStateId, @SuppressWarnings("rawtypes") Map conf, TopologyContext context) {
+ return new JmsBatchCoordinator(name);
+ }
+
+ @Override
+ public Emitter<JmsBatch> getEmitter(String txStateId, @SuppressWarnings("rawtypes") Map conf, TopologyContext context) {
+ return new JmsEmitter(name, jmsProvider, tupleProducer, jmsAcknowledgeMode, conf);
+ }
+
+ @Override
+ public Map<String, Object> getComponentConfiguration() {
+ return null;
+ }
+
+ @Override
+ public Fields getOutputFields() {
+ OutputFieldsGetter fieldGetter = new OutputFieldsGetter();
+ tupleProducer.declareOutputFields(fieldGetter);
+ StreamInfo streamInfo = fieldGetter.getFieldsDeclaration().get(Utils.DEFAULT_STREAM_ID);
+ if (streamInfo == null) {
+ throw new IllegalArgumentException("Jms Tuple producer has not declared output fields for the default stream");
+ }
+
+ return new Fields(streamInfo.get_output_fields());
+ }
+
+ /**
+ * The JmsEmitter class listens for incoming messages and stores them in a blocking queue. On each invocation of emit,
+ * the queued messages are emitted as a batch.
+ *
+ */
+ private class JmsEmitter implements Emitter<JmsBatch>, MessageListener {
+
+ private final LinkedBlockingQueue<Message> queue;
+ private final Connection connection;
+ private final Session session;
+
+ private final RotatingMap<Long, List<Message>> batchMessageMap; // Maps transaction Ids to JMS message ids.
+
+ private final long rotateTimeMillis;
+ private final int maxBatchSize;
+ private final String name;
+
+ private long lastRotate;
+
+ private final Logger LOG = LoggerFactory.getLogger(JmsEmitter.class);
+
+ public JmsEmitter(String name, JmsProvider jmsProvider, JmsTupleProducer tupleProducer, int jmsAcknowledgeMode, @SuppressWarnings("rawtypes") Map conf) {
+ if (jmsProvider == null) {
+ throw new IllegalStateException("JMS provider has not been set.");
+ }
+ if (tupleProducer == null) {
+ throw new IllegalStateException("JMS Tuple Producer has not been set.");
+ }
+
+ this.queue = new LinkedBlockingQueue<Message>();
+ this.name = name;
+
+ batchMessageMap = new RotatingMap<Long, List<Message>>(3);
+ rotateTimeMillis = 1000L * ((Number)conf.get(Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS)).intValue();
+ lastRotate = System.currentTimeMillis();
+
+ Number batchSize = (Number) conf.get(MAX_BATCH_SIZE_CONF);
+ maxBatchSize = batchSize != null ? batchSize.intValue() : DEFAULT_BATCH_SIZE;
+
+ try {
+ ConnectionFactory cf = jmsProvider.connectionFactory();
+ Destination dest = jmsProvider.destination();
+ this.connection = cf.createConnection();
+ this.session = connection.createSession(false, jmsAcknowledgeMode);
+ MessageConsumer consumer = session.createConsumer(dest);
+ consumer.setMessageListener(this);
+ this.connection.start();
+
+ LOG.info("Created JmsEmitter with max batch size "+maxBatchSize+" rotate time "+rotateTimeMillis+"ms and destination "+dest+" for "+name);
+
+ } catch (Exception e) {
+ LOG.warn("Error creating JMS connection.", e);
+ throw new IllegalStateException("Could not create JMS connection for spout ", e);
+ }
+
+ }
+
+ @Override
+ public void success(TransactionAttempt tx) {
+
+ @SuppressWarnings("unchecked")
+ List<Message> messages = (List<Message>) batchMessageMap.remove(tx.getTransactionId());
+
+ if (messages != null) {
+ if (!messages.isEmpty()) {
+ LOG.debug("Success for batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId()+" for "+name);
+ }
+
+ for (Message msg: messages) {
+ String messageId = "UnknownId";
+
+ try {
+ messageId = msg.getJMSMessageID();
+ msg.acknowledge();
+ LOG.trace("Acknowledged message "+messageId);
+ } catch (JMSException e) {
+ LOG.warn("Failed to acknowledge message "+messageId, e);
+ }
+ }
+ }
+ else {
+ LOG.warn("No messages found in batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId());
+ }
+ }
+
+ /**
+ * Fail a batch with the given transaction id. This is called when a batch is timed out, or a new batch with a
+ * matching transaction id is emitted. Note that the current implementation does nothing - i.e. it discards
+ * messages that have been failed.
+ * @param transactionId The transaction id of the failed batch
+ * @param messages The list of messages to fail.
+ */
+ private void fail(Long transactionId, List<Message> messages) {
+ LOG.debug("Failure for batch with transaction id "+transactionId+" for "+name);
+ if (messages != null) {
+ for (Message msg: messages) {
+ try {
+ LOG.trace("Failed message "+msg.getJMSMessageID());
+ } catch (JMSException e) {
+ LOG.warn("Could not identify failed message ", e);
+ }
+ }
+ }
+ else {
+ LOG.warn("Failed batch has no messages with transaction id "+transactionId);
+ }
+ }
+
+ @Override
+ public void close() {
+ try {
+ LOG.info("Closing JMS connection.");
+ this.session.close();
+ this.connection.close();
+ } catch (JMSException e) {
+ LOG.warn("Error closing JMS connection.", e);
+ }
+ }
+
+ @Override
+ public void emitBatch(TransactionAttempt tx, JmsBatch coordinatorMeta,
+ TridentCollector collector) {
+
+ long now = System.currentTimeMillis();
+ if(now - lastRotate > rotateTimeMillis) {
+ Map<Long, List<Message>> failed = batchMessageMap.rotate();
+ for(Long id: failed.keySet()) {
+ LOG.warn("TIMED OUT batch with transaction id "+id+" for "+name);
+ fail(id, failed.get(id));
+ }
+ lastRotate = now;
+ }
+
+ if(batchMessageMap.containsKey(tx.getTransactionId())) {
+ LOG.warn("FAILED duplicate batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId()+" for "+name);
+ fail(tx.getTransactionId(), batchMessageMap.get(tx.getTransactionId()));
+ }
+
+ List<Message> batchMessages = new ArrayList<Message>();
+
+ for (int index=0; index<maxBatchSize; index++) {
+ Message msg = queue.poll();
+ if (msg == null) {
+ Utils.sleep(50); // Back off
+ break;
+ }
+
+ try {
+ if (TridentJmsSpout.this.jmsAcknowledgeMode != Session.AUTO_ACKNOWLEDGE) {
+ batchMessages.add(msg);
+ }
+ Values tuple = tupleProducer.toTuple(msg);
+ collector.emit(tuple);
+ } catch (JMSException e) {
+ LOG.warn("Failed to emit message, could not retrieve data for "+name+": "+e );
+ }
+ }
+
+ if (!batchMessages.isEmpty()) {
+ LOG.debug("Emitting batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId()+" and size "+batchMessages.size()+" for "+name);
+ }
+ else {
+ LOG.trace("No items to acknowledge for batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId()+" for "+name);
+ }
+ batchMessageMap.put(tx.getTransactionId(), batchMessages);
+ }
+
+ @Override
+ public void onMessage(Message msg) {
+ try {
+ LOG.trace("Queuing msg [" + msg.getJMSMessageID() + "]");
+ } catch (JMSException e) {
+ // Nothing here, could not get message id
+ }
+ this.queue.offer(msg);
+ }
+
+ }
+
+ /**
+ * Bare implementation of a BatchCoordinator, returning a null JmsBatch object
+ *
+ */
+ private class JmsBatchCoordinator implements BatchCoordinator<JmsBatch> {
+
+ private final String name;
+
+ private final Logger LOG = LoggerFactory.getLogger(JmsBatchCoordinator.class);
+
+ public JmsBatchCoordinator(String name) {
+ this.name = name;
+ LOG.info("Created batch coordinator for "+name);
+ }
+
+ @Override
+ public JmsBatch initializeTransaction(long txid, JmsBatch prevMetadata, JmsBatch curMetadata) {
+ LOG.debug("Initialise transaction "+txid+" for "+name);
+ return null;
+ }
+
+ @Override
+ public void success(long txid) {
+ }
+
+ @Override
+ public boolean isReady(long txid) {
+ return true;
+ }
+
+ @Override
+ public void close() {
+ }
+
+ }
+
+}
+
+
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/test/java/org/apache/storm/jms/spout/JmsSpoutTest.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/test/java/org/apache/storm/jms/spout/JmsSpoutTest.java b/external/storm-jms/src/test/java/org/apache/storm/jms/spout/JmsSpoutTest.java
new file mode 100644
index 0000000..e80f70a
--- /dev/null
+++ b/external/storm-jms/src/test/java/org/apache/storm/jms/spout/JmsSpoutTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.spout;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.storm.jms.JmsProvider;
+import org.apache.storm.spout.SpoutOutputCollector;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JmsSpoutTest {
+ private static final Logger LOG = LoggerFactory.getLogger(JmsSpoutTest.class);
+
+ @Test
+ public void testFailure() throws JMSException, Exception{
+ JmsSpout spout = new JmsSpout();
+ JmsProvider mockProvider = new MockJmsProvider();
+ MockSpoutOutputCollector mockCollector = new MockSpoutOutputCollector();
+ SpoutOutputCollector collector = new SpoutOutputCollector(mockCollector);
+ spout.setJmsProvider(new MockJmsProvider());
+ spout.setJmsTupleProducer(new MockTupleProducer());
+ spout.setJmsAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
+ spout.setRecoveryPeriod(10); // Rapid recovery for testing.
+ spout.open(new HashMap<String,String>(), null, collector);
+ Message msg = this.sendMessage(mockProvider.connectionFactory(), mockProvider.destination());
+ Thread.sleep(100);
+ spout.nextTuple(); // Pretend to be storm.
+ Assert.assertTrue(mockCollector.emitted);
+
+ mockCollector.reset();
+ spout.fail(msg.getJMSMessageID()); // Mock failure
+ Thread.sleep(5000);
+ spout.nextTuple(); // Pretend to be storm.
+ Thread.sleep(5000);
+ Assert.assertTrue(mockCollector.emitted); // Should have been re-emitted
+ }
+
+ @Test
+ public void testSerializability() throws IOException{
+ JmsSpout spout = new JmsSpout();
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(out);
+ oos.writeObject(spout);
+ oos.close();
+ Assert.assertTrue(out.toByteArray().length > 0);
+ }
+
+ public Message sendMessage(ConnectionFactory connectionFactory, Destination destination) throws JMSException {
+ Session mySess = connectionFactory.createConnection().createSession(false, Session.CLIENT_ACKNOWLEDGE);
+ MessageProducer producer = mySess.createProducer(destination);
+ TextMessage msg = mySess.createTextMessage();
+ msg.setText("Hello World");
+ LOG.info("Sending Message: {}", msg.getText());
+ producer.send(msg);
+ return msg;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockJmsProvider.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockJmsProvider.java b/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockJmsProvider.java
new file mode 100644
index 0000000..3ba0853
--- /dev/null
+++ b/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockJmsProvider.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.spout;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+
+import org.apache.storm.jms.JmsProvider;
+
+public class MockJmsProvider implements JmsProvider {
+ private static final long serialVersionUID = 1L;
+
+ private ConnectionFactory connectionFactory = null;
+ private Destination destination = null;
+
+ public MockJmsProvider() throws NamingException{
+ this.connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
+ Context jndiContext = new InitialContext();
+ this.destination = (Destination) jndiContext.lookup("dynamicQueues/FOO.BAR");
+
+ }
+
+ /**
+ * Provides the JMS <code>ConnectionFactory</code>
+ * @return the connection factory
+ * @throws Exception
+ */
+ public ConnectionFactory connectionFactory() throws Exception{
+ return this.connectionFactory;
+ }
+
+ /**
+ * Provides the <code>Destination</code> (topic or queue) from which the
+ * <code>JmsSpout</code> will receive messages.
+ * @return
+ * @throws Exception
+ */
+ public Destination destination() throws Exception{
+ return this.destination;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockSpoutOutputCollector.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockSpoutOutputCollector.java b/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockSpoutOutputCollector.java
new file mode 100644
index 0000000..a5a6c51
--- /dev/null
+++ b/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockSpoutOutputCollector.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.spout;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.storm.spout.ISpoutOutputCollector;
+
+public class MockSpoutOutputCollector implements ISpoutOutputCollector {
+ boolean emitted = false;
+
+ @Override
+ public List<Integer> emit(String streamId, List<Object> tuple, Object messageId) {
+ emitted = true;
+ return new ArrayList<Integer>();
+ }
+
+ @Override
+ public void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId) {
+ emitted = true;
+ }
+
+ @Override
+ public void reportError(Throwable error) {
+ }
+
+ public boolean emitted(){
+ return this.emitted;
+ }
+
+ public void reset(){
+ this.emitted = false;
+ }
+
+ @Override
+ public long getPendingCount() {
+ return 0;
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockTupleProducer.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockTupleProducer.java b/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockTupleProducer.java
new file mode 100644
index 0000000..ea571fc
--- /dev/null
+++ b/external/storm-jms/src/test/java/org/apache/storm/jms/spout/MockTupleProducer.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.spout;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.TextMessage;
+
+import org.apache.storm.jms.JmsTupleProducer;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+
+public class MockTupleProducer implements JmsTupleProducer {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Values toTuple(Message msg) throws JMSException {
+ if (msg instanceof TextMessage) {
+ String json = ((TextMessage) msg).getText();
+ return new Values(json);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields("json"));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/src/test/resources/jndi.properties
----------------------------------------------------------------------
diff --git a/external/storm-jms/src/test/resources/jndi.properties b/external/storm-jms/src/test/resources/jndi.properties
new file mode 100644
index 0000000..af19521
--- /dev/null
+++ b/external/storm-jms/src/test/resources/jndi.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
+java.naming.provider.url = vm://localhost?broker.persistent=false
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-kafka-client/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-kafka-client/pom.xml b/external/storm-kafka-client/pom.xml
index 2ff98c1..02c2823 100644
--- a/external/storm-kafka-client/pom.xml
+++ b/external/storm-kafka-client/pom.xml
@@ -46,7 +46,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<!--kafka libraries-->
<dependency>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-kafka/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-kafka/pom.xml b/external/storm-kafka/pom.xml
index 9c69c05..6571a21 100644
--- a/external/storm-kafka/pom.xml
+++ b/external/storm-kafka/pom.xml
@@ -126,7 +126,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-kinesis/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-kinesis/pom.xml b/external/storm-kinesis/pom.xml
index f1872dc..763d9c2 100644
--- a/external/storm-kinesis/pom.xml
+++ b/external/storm-kinesis/pom.xml
@@ -42,7 +42,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-metrics/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-metrics/pom.xml b/external/storm-metrics/pom.xml
index 24b34e8..ef51c56 100644
--- a/external/storm-metrics/pom.xml
+++ b/external/storm-metrics/pom.xml
@@ -60,7 +60,7 @@
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
<!-- keep storm out of the jar-with-dependencies -->
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
</dependencies>
<build>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mongodb/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-mongodb/pom.xml b/external/storm-mongodb/pom.xml
index 7653ac8..47b6f63 100644
--- a/external/storm-mongodb/pom.xml
+++ b/external/storm-mongodb/pom.xml
@@ -1,74 +1,74 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <artifactId>storm</artifactId>
- <groupId>org.apache.storm</groupId>
- <version>2.0.0-SNAPSHOT</version>
- <relativePath>../../pom.xml</relativePath>
- </parent>
-
- <artifactId>storm-mongodb</artifactId>
-
- <developers>
- <developer>
- <id>vesense</id>
- <name>Xin Wang</name>
- <email>data.xinwang@gmail.com</email>
- </developer>
- </developers>
-
- <properties>
- <mongodb.version>3.2.0</mongodb.version>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-core</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.mongodb</groupId>
- <artifactId>mongo-java-driver</artifactId>
- <version>${mongodb.version}</version>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- </dependency>
- <!--test dependencies -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>storm</artifactId>
+ <groupId>org.apache.storm</groupId>
+ <version>2.0.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>storm-mongodb</artifactId>
+
+ <developers>
+ <developer>
+ <id>vesense</id>
+ <name>Xin Wang</name>
+ <email>data.xinwang@gmail.com</email>
+ </developer>
+ </developers>
+
+ <properties>
+ <mongodb.version>3.2.0</mongodb.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-core</artifactId>
+ <version>${project.version}</version>
+ <scope>${provided.scope}</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mongodb</groupId>
+ <artifactId>mongo-java-driver</artifactId>
+ <version>${mongodb.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ </dependency>
+ <!--test dependencies -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
[12/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
STORM-2416 Release Packaging Improvements
Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/2a369e40
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/2a369e40
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/2a369e40
Branch: refs/heads/master
Commit: 2a369e408c18adf1045f57382d30fe18dacdbb19
Parents: 28c8711
Author: P. Taylor Goetz <pt...@gmail.com>
Authored: Thu Mar 16 15:14:26 2017 -0400
Committer: Jungtaek Lim <ka...@gmail.com>
Committed: Tue Apr 4 18:37:10 2017 +0900
----------------------------------------------------------------------
examples/flux-examples/README.md | 93 +
examples/flux-examples/pom.xml | 152 +
.../flux/examples/StatefulWordCounter.java | 64 +
.../storm/flux/examples/TestPrintBolt.java | 39 +
.../storm/flux/examples/TestWindowBolt.java | 47 +
.../storm/flux/examples/WordCountClient.java | 74 +
.../apache/storm/flux/examples/WordCounter.java | 71 +
.../src/main/resources/hbase_bolt.properties | 18 +
.../src/main/resources/hdfs_bolt.properties | 26 +
.../src/main/resources/kafka_spout.yaml | 136 +
.../src/main/resources/multilang.yaml | 89 +
.../src/main/resources/simple_hbase.yaml | 92 +
.../src/main/resources/simple_hdfs.yaml | 105 +
.../resources/simple_stateful_wordcount.yaml | 60 +
.../src/main/resources/simple_windowing.yaml | 69 +
.../src/main/resources/simple_wordcount.yaml | 68 +
examples/storm-elasticsearch-examples/pom.xml | 15 -
examples/storm-hbase-examples/pom.xml | 14 -
examples/storm-hdfs-examples/pom.xml | 14 -
examples/storm-hive-examples/pom.xml | 14 -
examples/storm-jdbc-examples/pom.xml | 14 -
examples/storm-jms-examples/README.markdown | 12 +
examples/storm-jms-examples/pom.xml | 150 +
.../storm/jms/example/ExampleJmsTopology.java | 131 +
.../apache/storm/jms/example/GenericBolt.java | 116 +
.../storm/jms/example/JsonTupleProducer.java | 58 +
.../storm/jms/example/SpringJmsProvider.java | 74 +
.../src/main/resources/jms-activemq.xml | 53 +
.../src/main/resources/log4j.properties | 29 +
examples/storm-kafka-client-examples/pom.xml | 14 -
examples/storm-kafka-examples/pom.xml | 14 -
examples/storm-mongodb-examples/pom.xml | 14 -
examples/storm-mqtt-examples/pom.xml | 14 -
examples/storm-opentsdb-examples/pom.xml | 14 -
examples/storm-perf/README.markdown | 50 +
examples/storm-perf/pom.xml | 107 +
.../main/conf/ConstSpoutIdBoltNullBoltTopo.yaml | 22 +
.../src/main/conf/ConstSpoutNullBoltTopo.yaml | 22 +
.../src/main/conf/FileReadWordCountTopo.yaml | 23 +
.../src/main/conf/HdfsSpoutNullBoltTopo.yaml | 25 +
.../storm-perf/src/main/conf/KafkaHdfsTopo.yaml | 26 +
.../src/main/conf/KafkaSpoutNullBoltTopo.yaml | 23 +
.../src/main/conf/StrGenSpoutHdfsBoltTopo.yaml | 25 +
.../perf/ConstSpoutIdBoltNullBoltTopo.java | 101 +
.../storm/perf/ConstSpoutNullBoltTopo.java | 107 +
.../apache/storm/perf/ConstSpoutOnlyTopo.java | 74 +
.../storm/perf/FileReadWordCountTopo.java | 96 +
.../storm/perf/HdfsSpoutNullBoltTopo.java | 101 +
.../org/apache/storm/perf/KafkaHdfsTopo.java | 168 +
.../storm/perf/KafkaSpoutNullBoltTopo.java | 114 +
.../storm/perf/StrGenSpoutHdfsBoltTopo.java | 154 +
.../org/apache/storm/perf/bolt/CountBolt.java | 58 +
.../org/apache/storm/perf/bolt/DevNullBolt.java | 47 +
.../java/org/apache/storm/perf/bolt/IdBolt.java | 49 +
.../storm/perf/bolt/SplitSentenceBolt.java | 58 +
.../org/apache/storm/perf/spout/ConstSpout.java | 70 +
.../apache/storm/perf/spout/FileReadSpout.java | 141 +
.../apache/storm/perf/spout/StringGenSpout.java | 93 +
.../storm/perf/utils/BasicMetricsCollector.java | 309 +
.../org/apache/storm/perf/utils/Helper.java | 131 +
.../apache/storm/perf/utils/IdentityBolt.java | 51 +
.../apache/storm/perf/utils/MetricsSample.java | 248 +
.../src/main/sampledata/randomwords.txt | 14049 +++++++++++++++++
examples/storm-pmml-examples/pom.xml | 14 -
examples/storm-redis-examples/pom.xml | 14 -
examples/storm-solr-examples/pom.xml | 14 -
examples/storm-starter/pom.xml | 11 -
external/flux/flux-examples/README.md | 93 -
external/flux/flux-examples/pom.xml | 146 -
.../flux/examples/StatefulWordCounter.java | 64 -
.../storm/flux/examples/TestPrintBolt.java | 39 -
.../storm/flux/examples/TestWindowBolt.java | 47 -
.../storm/flux/examples/WordCountClient.java | 74 -
.../apache/storm/flux/examples/WordCounter.java | 71 -
.../src/main/resources/hbase_bolt.properties | 18 -
.../src/main/resources/hdfs_bolt.properties | 26 -
.../src/main/resources/kafka_spout.yaml | 136 -
.../src/main/resources/multilang.yaml | 89 -
.../src/main/resources/simple_hbase.yaml | 92 -
.../src/main/resources/simple_hdfs.yaml | 105 -
.../resources/simple_stateful_wordcount.yaml | 60 -
.../src/main/resources/simple_windowing.yaml | 69 -
.../src/main/resources/simple_wordcount.yaml | 68 -
external/flux/pom.xml | 21 -
external/sql/storm-sql-core/pom.xml | 4 +-
.../storm-sql-external/storm-sql-hdfs/pom.xml | 6 +-
.../storm-sql-external/storm-sql-kafka/pom.xml | 6 +-
.../storm-sql-mongodb/pom.xml | 6 +-
.../storm-sql-external/storm-sql-redis/pom.xml | 6 +-
external/sql/storm-sql-runtime/pom.xml | 2 +-
external/storm-cassandra/pom.xml | 2 +-
external/storm-druid/pom.xml | 42 +-
external/storm-elasticsearch/pom.xml | 2 +-
external/storm-eventhubs/pom.xml | 86 +-
external/storm-hbase/pom.xml | 2 +-
external/storm-hdfs/pom.xml | 2 +-
external/storm-hive/pom.xml | 2 +-
external/storm-jdbc/pom.xml | 2 +-
external/storm-jms/core/pom.xml | 95 -
.../apache/storm/jms/JmsMessageProducer.java | 46 -
.../java/org/apache/storm/jms/JmsProvider.java | 48 -
.../org/apache/storm/jms/JmsTupleProducer.java | 58 -
.../java/org/apache/storm/jms/bolt/JmsBolt.java | 219 -
.../apache/storm/jms/spout/JmsMessageID.java | 58 -
.../org/apache/storm/jms/spout/JmsSpout.java | 382 -
.../org/apache/storm/jms/trident/JmsBatch.java | 27 -
.../org/apache/storm/jms/trident/JmsState.java | 129 -
.../storm/jms/trident/JmsStateFactory.java | 40 -
.../apache/storm/jms/trident/JmsUpdater.java | 38 -
.../storm/jms/trident/TridentJmsSpout.java | 409 -
.../apache/storm/jms/spout/JmsSpoutTest.java | 88 -
.../apache/storm/jms/spout/MockJmsProvider.java | 62 -
.../jms/spout/MockSpoutOutputCollector.java | 55 -
.../storm/jms/spout/MockTupleProducer.java | 47 -
.../core/src/test/resources/jndi.properties | 18 -
external/storm-jms/examples/README.markdown | 12 -
external/storm-jms/examples/pom.xml | 150 -
.../storm/jms/example/ExampleJmsTopology.java | 131 -
.../apache/storm/jms/example/GenericBolt.java | 116 -
.../storm/jms/example/JsonTupleProducer.java | 58 -
.../storm/jms/example/SpringJmsProvider.java | 74 -
.../src/main/resources/jms-activemq.xml | 53 -
.../src/main/resources/log4j.properties | 29 -
external/storm-jms/pom.xml | 48 +-
.../apache/storm/jms/JmsMessageProducer.java | 46 +
.../java/org/apache/storm/jms/JmsProvider.java | 48 +
.../org/apache/storm/jms/JmsTupleProducer.java | 58 +
.../java/org/apache/storm/jms/bolt/JmsBolt.java | 219 +
.../apache/storm/jms/spout/JmsMessageID.java | 58 +
.../org/apache/storm/jms/spout/JmsSpout.java | 382 +
.../org/apache/storm/jms/trident/JmsBatch.java | 27 +
.../org/apache/storm/jms/trident/JmsState.java | 129 +
.../storm/jms/trident/JmsStateFactory.java | 40 +
.../apache/storm/jms/trident/JmsUpdater.java | 38 +
.../storm/jms/trident/TridentJmsSpout.java | 409 +
.../apache/storm/jms/spout/JmsSpoutTest.java | 88 +
.../apache/storm/jms/spout/MockJmsProvider.java | 62 +
.../jms/spout/MockSpoutOutputCollector.java | 55 +
.../storm/jms/spout/MockTupleProducer.java | 47 +
.../src/test/resources/jndi.properties | 18 +
external/storm-kafka-client/pom.xml | 2 +-
external/storm-kafka/pom.xml | 2 +-
external/storm-kinesis/pom.xml | 2 +-
external/storm-metrics/pom.xml | 2 +-
external/storm-mongodb/pom.xml | 148 +-
external/storm-mqtt/core/pom.xml | 126 -
.../java/org/apache/storm/mqtt/MqttLogger.java | 36 -
.../java/org/apache/storm/mqtt/MqttMessage.java | 41 -
.../apache/storm/mqtt/MqttMessageMapper.java | 44 -
.../org/apache/storm/mqtt/MqttTupleMapper.java | 37 -
.../org/apache/storm/mqtt/bolt/MqttBolt.java | 105 -
.../apache/storm/mqtt/common/MqttOptions.java | 334 -
.../apache/storm/mqtt/common/MqttPublisher.java | 67 -
.../org/apache/storm/mqtt/common/MqttUtils.java | 88 -
.../org/apache/storm/mqtt/common/SslUtils.java | 64 -
.../mqtt/mappers/ByteArrayMessageMapper.java | 34 -
.../storm/mqtt/mappers/StringMessageMapper.java | 37 -
.../apache/storm/mqtt/spout/AckableMessage.java | 71 -
.../org/apache/storm/mqtt/spout/MqttSpout.java | 262 -
.../storm/mqtt/ssl/DefaultKeyStoreLoader.java | 97 -
.../apache/storm/mqtt/ssl/KeyStoreLoader.java | 35 -
.../storm/mqtt/trident/MqttPublishFunction.java | 85 -
.../storm/mqtt/StormMqttIntegrationTest.java | 153 -
external/storm-mqtt/pom.xml | 144 +-
.../java/org/apache/storm/mqtt/MqttLogger.java | 36 +
.../java/org/apache/storm/mqtt/MqttMessage.java | 41 +
.../apache/storm/mqtt/MqttMessageMapper.java | 44 +
.../org/apache/storm/mqtt/MqttTupleMapper.java | 37 +
.../org/apache/storm/mqtt/bolt/MqttBolt.java | 105 +
.../apache/storm/mqtt/common/MqttOptions.java | 334 +
.../apache/storm/mqtt/common/MqttPublisher.java | 67 +
.../org/apache/storm/mqtt/common/MqttUtils.java | 88 +
.../org/apache/storm/mqtt/common/SslUtils.java | 64 +
.../mqtt/mappers/ByteArrayMessageMapper.java | 34 +
.../storm/mqtt/mappers/StringMessageMapper.java | 37 +
.../apache/storm/mqtt/spout/AckableMessage.java | 71 +
.../org/apache/storm/mqtt/spout/MqttSpout.java | 262 +
.../storm/mqtt/ssl/DefaultKeyStoreLoader.java | 97 +
.../apache/storm/mqtt/ssl/KeyStoreLoader.java | 35 +
.../storm/mqtt/trident/MqttPublishFunction.java | 85 +
.../storm/mqtt/StormMqttIntegrationTest.java | 153 +
external/storm-opentsdb/pom.xml | 2 +-
external/storm-pmml/pom.xml | 2 +-
external/storm-redis/pom.xml | 2 +-
external/storm-solr/pom.xml | 2 +-
pom.xml | 18 +-
.../final-package/src/main/assembly/binary.xml | 254 +-
storm-perf/README.markdown | 50 -
storm-perf/pom.xml | 122 -
.../main/conf/ConstSpoutIdBoltNullBoltTopo.yaml | 22 -
.../src/main/conf/ConstSpoutNullBoltTopo.yaml | 22 -
.../src/main/conf/FileReadWordCountTopo.yaml | 23 -
.../src/main/conf/HdfsSpoutNullBoltTopo.yaml | 25 -
storm-perf/src/main/conf/KafkaHdfsTopo.yaml | 26 -
.../src/main/conf/KafkaSpoutNullBoltTopo.yaml | 23 -
.../src/main/conf/StrGenSpoutHdfsBoltTopo.yaml | 25 -
.../perf/ConstSpoutIdBoltNullBoltTopo.java | 101 -
.../storm/perf/ConstSpoutNullBoltTopo.java | 107 -
.../apache/storm/perf/ConstSpoutOnlyTopo.java | 74 -
.../storm/perf/FileReadWordCountTopo.java | 96 -
.../storm/perf/HdfsSpoutNullBoltTopo.java | 101 -
.../org/apache/storm/perf/KafkaHdfsTopo.java | 168 -
.../storm/perf/KafkaSpoutNullBoltTopo.java | 114 -
.../storm/perf/StrGenSpoutHdfsBoltTopo.java | 154 -
.../org/apache/storm/perf/bolt/CountBolt.java | 58 -
.../org/apache/storm/perf/bolt/DevNullBolt.java | 47 -
.../java/org/apache/storm/perf/bolt/IdBolt.java | 49 -
.../storm/perf/bolt/SplitSentenceBolt.java | 58 -
.../org/apache/storm/perf/spout/ConstSpout.java | 70 -
.../apache/storm/perf/spout/FileReadSpout.java | 141 -
.../apache/storm/perf/spout/StringGenSpout.java | 93 -
.../storm/perf/utils/BasicMetricsCollector.java | 309 -
.../org/apache/storm/perf/utils/Helper.java | 131 -
.../apache/storm/perf/utils/IdentityBolt.java | 51 -
.../apache/storm/perf/utils/MetricsSample.java | 248 -
storm-perf/src/main/sampledata/randomwords.txt | 14049 -----------------
216 files changed, 21999 insertions(+), 22608 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/README.md
----------------------------------------------------------------------
diff --git a/examples/flux-examples/README.md b/examples/flux-examples/README.md
new file mode 100644
index 0000000..3d610b4
--- /dev/null
+++ b/examples/flux-examples/README.md
@@ -0,0 +1,93 @@
+# Flux Examples
+A collection of examples illustrating various capabilities.
+
+## Building From Source and Running
+
+Checkout the projects source and perform a top level Maven build (i.e. from the `flux` directory):
+
+```bash
+git clone https://github.com/apache/storm.git
+cd storm
+mvn install -DskipTests=true
+```
+
+This will create a shaded (i.e. "fat" or "uber") jar in the `external/flux/flux-examples/target` directory that can run/deployed with
+the `storm` command:
+
+```bash
+cd flux-examples
+storm jar ./target/flux-examples-*-SNAPSHOT.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_wordcount.yaml
+```
+
+The example YAML files are also packaged in the examples jar, so they can also be referenced with Flux's `--resource`
+command line switch:
+
+```bash
+storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local --resource /simple_wordcount.yaml
+```
+
+## Available Examples
+
+### [simple_wordcount.yaml](src/main/resources/simple_wordcount.yaml)
+
+This is a very basic wordcount example using Java spouts and bolts. It simply logs the running count of each word
+received.
+
+### [multilang.yaml](src/main/resources/multilang.yaml)
+
+Another wordcount example that uses a spout written in JavaScript (node.js), a bolt written in Python, and two bolts
+written in java.
+
+### [kafka_spout.yaml](src/main/resources/kafka_spout.yaml)
+
+This example illustrates how to configure Storm's `storm-kafka` spout using Flux YAML DSL `components`, `references`,
+and `constructor arguments` constructs.
+
+### [simple_hdfs.yaml](src/main/resources/simple_hdfs.yaml)
+
+This example demonstrates using Flux to setup a storm-hdfs bolt to write to an HDFS cluster. It also demonstrates Flux's
+variable substitution/filtering feature.
+
+To run the `simple_hdfs.yaml` example, copy the `hdfs_bolt.properties` file to a convenient location and change, at
+least, the property `hdfs.url` to point to a HDFS cluster. Then you can run the example something like:
+
+```bash
+storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_hdfs.yaml --filter my_hdfs_bolt.properties
+```
+
+### [simple_hbase.yaml](src/main/resources/simple_hbase.yaml)
+
+This example illustrates how to use Flux to setup a storm-hbase bolt to write to HBase.
+
+To run the `simple_hbase.yaml` example, copy the `hbase_bolt.properties` file to a convenient location and change the properties
+ `hbase.rootdir` and `hbase.zookeeper.quorum`. Then you can run the example something like:
+
+```bash
+storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_hbase.yaml --filter my_hbase_bolt.properties
+```
+
+### [simple_windowing.yaml](src/main/resources/simple_windowing.yaml)
+
+This example illustrates how to use Flux to set up a storm topology that contains windowing operations.
+
+To run,
+
+```bash
+storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_windowing.yaml
+```
+
+### [simple_stateful_wordcount.yaml](src/main/resources/simple_stateful_wordcount.yaml)
+
+Flux also supports stateful bolts which is illustrated with this example. It is basically an extension of the basic wordcount example.
+The state is periodically saved (checkpointed) and restored when the topology is restarted.
+
+```bash
+storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_stateful_wordcount.yaml
+```
+
+By default the state is stored in-memory only. As such you won't see a resumed state unless you configure to use Redis as the state backend.
+Ensure that you have Redis running at `localhost:6379` and that `storm-redis-*.jar` is in the classpath.
+
+```bash
+STORM_EXT_CLASSPATH=../../storm-redis/target storm jar ./target/flux-examples-*.jar -c topology.state.provider=org.apache.storm.redis.state.RedisKeyValueStateProvider org.apache.storm.flux.Flux --local ./src/main/resources/simple_stateful_wordcount.yaml
+```
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/flux-examples/pom.xml b/examples/flux-examples/pom.xml
new file mode 100644
index 0000000..14ad00c
--- /dev/null
+++ b/examples/flux-examples/pom.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>storm</artifactId>
+ <groupId>org.apache.storm</groupId>
+ <version>2.0.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>flux-examples</artifactId>
+ <packaging>jar</packaging>
+
+ <name>flux-examples</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-core</artifactId>
+ <version>${project.version}</version>
+ <scope>${provided.scope}</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>flux-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>flux-wrappers</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-hdfs</artifactId>
+ <version>${project.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-yarn-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-hbase</artifactId>
+ <version>${project.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>servlet-api-2.5</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-kafka</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.kafka</groupId>
+ <artifactId>${storm.kafka.artifact.id}</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <configuration>
+ <createDependencyReducedPom>true</createDependencyReducedPom>
+ <filters>
+ <filter>
+ <artifact>*:*</artifact>
+ <excludes>
+ <exclude>META-INF/*.SF</exclude>
+ <exclude>META-INF/*.sf</exclude>
+ <exclude>META-INF/*.DSA</exclude>
+ <exclude>META-INF/*.dsa</exclude>
+ <exclude>META-INF/*.RSA</exclude>
+ <exclude>META-INF/*.rsa</exclude>
+ <exclude>META-INF/*.EC</exclude>
+ <exclude>META-INF/*.ec</exclude>
+ <exclude>META-INF/MSFTSIG.SF</exclude>
+ <exclude>META-INF/MSFTSIG.RSA</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <transformers>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+ <mainClass>org.apache.storm.flux.Flux</mainClass>
+ </transformer>
+ </transformers>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/StatefulWordCounter.java
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/StatefulWordCounter.java b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/StatefulWordCounter.java
new file mode 100644
index 0000000..5534888
--- /dev/null
+++ b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/StatefulWordCounter.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.flux.examples;
+
+import org.apache.storm.state.KeyValueState;
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.base.BaseStatefulBolt;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.tuple.Values;
+
+import java.util.Map;
+
+public class StatefulWordCounter extends BaseStatefulBolt<KeyValueState<String, Long>> {
+
+ private KeyValueState<String, Long> wordCounts;
+ private OutputCollector collector;
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
+ this.collector = collector;
+ }
+
+ @Override
+ public void initState(KeyValueState<String, Long> state) {
+ wordCounts = state;
+ }
+
+ @Override
+ public void execute(Tuple tuple) {
+ String word = tuple.getString(0);
+
+ Long count = wordCounts.get(word, 0L);
+ count++;
+ wordCounts.put(word, count);
+
+ collector.emit(tuple, new Values(word, count));
+ collector.ack(tuple);
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields("word", "count"));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/TestPrintBolt.java
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/TestPrintBolt.java b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/TestPrintBolt.java
new file mode 100644
index 0000000..137e354
--- /dev/null
+++ b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/TestPrintBolt.java
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.flux.examples;
+
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseBasicBolt;
+import org.apache.storm.tuple.Tuple;
+
+/**
+ * Prints the tuples to stdout
+ */
+public class TestPrintBolt extends BaseBasicBolt {
+
+ @Override
+ public void execute(Tuple tuple, BasicOutputCollector collector) {
+ System.out.println(tuple);
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer ofd) {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/TestWindowBolt.java
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/TestWindowBolt.java b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/TestWindowBolt.java
new file mode 100644
index 0000000..8c904d9
--- /dev/null
+++ b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/TestWindowBolt.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.flux.examples;
+
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseWindowedBolt;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+import org.apache.storm.windowing.TupleWindow;
+
+import java.util.Map;
+
+public class TestWindowBolt extends BaseWindowedBolt {
+ private OutputCollector collector;
+
+ @Override
+ public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
+ this.collector = collector;
+ }
+
+ @Override
+ public void execute(TupleWindow inputWindow) {
+ collector.emit(new Values(inputWindow.get().size()));
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields("count"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCountClient.java
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCountClient.java b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCountClient.java
new file mode 100644
index 0000000..eb4fb7a
--- /dev/null
+++ b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCountClient.java
@@ -0,0 +1,74 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.flux.examples;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.client.Get;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.util.Bytes;
+
+import java.io.FileInputStream;
+import java.util.Properties;
+
+/**
+ * Connects to the 'WordCount' HBase table and prints counts for each word.
+ *
+ * Assumes you have run (or are running) the YAML topology definition in
+ * <code>simple_hbase.yaml</code>
+ *
+ * You will also need to modify `src/main/resources/hbase-site.xml`
+ * to point to your HBase instance, and then repackage with `mvn package`.
+ * This is a known issue.
+ *
+ */
+public class WordCountClient {
+
+ public static void main(String[] args) throws Exception {
+ Configuration config = HBaseConfiguration.create();
+ if(args.length == 1){
+ Properties props = new Properties();
+ props.load(new FileInputStream(args[0]));
+ System.out.println("HBase configuration:");
+ for(Object key : props.keySet()) {
+ System.out.println(key + "=" + props.get(key));
+ config.set((String)key, props.getProperty((String)key));
+ }
+ } else {
+ System.out.println("Usage: WordCountClient <hbase_config.properties>");
+ System.exit(1);
+ }
+
+ HTable table = new HTable(config, "WordCount");
+ String[] words = new String[] {"nathan", "mike", "jackson", "golda", "bertels"};
+
+ for (String word : words) {
+ Get get = new Get(Bytes.toBytes(word));
+ Result result = table.get(get);
+
+ byte[] countBytes = result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("count"));
+ byte[] wordBytes = result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("word"));
+
+ String wordStr = Bytes.toString(wordBytes);
+ long count = Bytes.toLong(countBytes);
+ System.out.println("Word: '" + wordStr + "', Count: " + count);
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCounter.java
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCounter.java b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCounter.java
new file mode 100644
index 0000000..7093105
--- /dev/null
+++ b/examples/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCounter.java
@@ -0,0 +1,71 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.flux.examples;
+
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.IBasicBolt;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseBasicBolt;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+import static org.apache.storm.utils.Utils.tuple;
+
+/**
+ * This bolt is used by the HBase example. It simply emits the first field
+ * found in the incoming tuple as "word", with a "count" of `1`.
+ *
+ * In this case, the downstream HBase bolt handles the counting, so a value
+ * of `1` will just increment the HBase counter by one.
+ */
+public class WordCounter extends BaseBasicBolt {
+ private static final Logger LOG = LoggerFactory.getLogger(WordCounter.class);
+
+
+
+ @SuppressWarnings("rawtypes")
+ public void prepare(Map stormConf, TopologyContext context) {
+ }
+
+ /*
+ * Just output the word value with a count of 1.
+ * The HBaseBolt will handle incrementing the counter.
+ */
+ public void execute(Tuple input, BasicOutputCollector collector) {
+ collector.emit(tuple(input.getValues().get(0), 1));
+ }
+
+ public void cleanup() {
+
+ }
+
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields("word", "count"));
+ }
+
+ @Override
+ public Map<String, Object> getComponentConfiguration() {
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/hbase_bolt.properties
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/hbase_bolt.properties b/examples/flux-examples/src/main/resources/hbase_bolt.properties
new file mode 100644
index 0000000..f8ed50c
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/hbase_bolt.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+hbase.rootdir=hdfs://hadoop:54310/hbase
+hbase.zookeeper.quorum=hadoop
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/hdfs_bolt.properties
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/hdfs_bolt.properties b/examples/flux-examples/src/main/resources/hdfs_bolt.properties
new file mode 100644
index 0000000..7bcbe7a
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/hdfs_bolt.properties
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# The HDFS url
+hdfs.url=hdfs://hadoop:54310
+
+# The HDFS directory where the bolt will write incoming data
+hdfs.write.dir=/incoming
+
+# The HDFS directory where files will be moved once the bolt has
+# finished writing to it.
+hdfs.dest.dir=/complete
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/kafka_spout.yaml
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/kafka_spout.yaml b/examples/flux-examples/src/main/resources/kafka_spout.yaml
new file mode 100644
index 0000000..7533ce4
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/kafka_spout.yaml
@@ -0,0 +1,136 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# Test ability to wire together shell spouts/bolts
+---
+
+# topology definition
+# name to be used when submitting
+name: "kafka-topology"
+
+# Components
+# Components are analagous to Spring beans. They are meant to be used as constructor,
+# property(setter), and builder arguments.
+#
+# for the time being, components must be declared in the order they are referenced
+components:
+ - id: "stringScheme"
+ className: "org.apache.storm.kafka.StringScheme"
+
+ - id: "stringMultiScheme"
+ className: "org.apache.storm.spout.SchemeAsMultiScheme"
+ constructorArgs:
+ - ref: "stringScheme"
+
+ - id: "zkHosts"
+ className: "org.apache.storm.kafka.ZkHosts"
+ constructorArgs:
+ - "localhost:2181"
+
+# Alternative kafka config
+# - id: "kafkaConfig"
+# className: "org.apache.storm.kafka.KafkaConfig"
+# constructorArgs:
+# # brokerHosts
+# - ref: "zkHosts"
+# # topic
+# - "myKafkaTopic"
+# # clientId (optional)
+# - "myKafkaClientId"
+
+ - id: "spoutConfig"
+ className: "org.apache.storm.kafka.SpoutConfig"
+ constructorArgs:
+ # brokerHosts
+ - ref: "zkHosts"
+ # topic
+ - "myKafkaTopic"
+ # zkRoot
+ - "/kafkaSpout"
+ # id
+ - "myId"
+ properties:
+ - name: "ignoreZkOffsets"
+ value: true
+ - name: "scheme"
+ ref: "stringMultiScheme"
+
+
+
+# NOTE: We may want to consider some level of spring integration. For example, allowing component references
+# to a spring `ApplicationContext`.
+
+# topology configuration
+# this will be passed to the submitter as a map of config options
+#
+config:
+ topology.workers: 1
+ # ...
+
+# spout definitions
+spouts:
+ - id: "kafka-spout"
+ className: "org.apache.storm.kafka.KafkaSpout"
+ constructorArgs:
+ - ref: "spoutConfig"
+
+# bolt definitions
+bolts:
+ - id: "splitsentence"
+ className: "org.apache.storm.flux.wrappers.bolts.FluxShellBolt"
+ constructorArgs:
+ # command line
+ - ["python", "splitsentence.py"]
+ # output fields
+ - ["word"]
+ parallelism: 1
+ # ...
+
+ - id: "log"
+ className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
+ parallelism: 1
+ # ...
+
+ - id: "count"
+ className: "org.apache.storm.testing.TestWordCounter"
+ parallelism: 1
+ # ...
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+# custom stream groupings are also supported
+
+streams:
+ - name: "kafka --> split" # name isn't used (placeholder for logging, UI, etc.)
+ from: "kafka-spout"
+ to: "splitsentence"
+ grouping:
+ type: SHUFFLE
+
+ - name: "split --> count"
+ from: "splitsentence"
+ to: "count"
+ grouping:
+ type: FIELDS
+ args: ["word"]
+
+ - name: "count --> log"
+ from: "count"
+ to: "log"
+ grouping:
+ type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/multilang.yaml
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/multilang.yaml b/examples/flux-examples/src/main/resources/multilang.yaml
new file mode 100644
index 0000000..aaab5d3
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/multilang.yaml
@@ -0,0 +1,89 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Test ability to wire together shell spouts/bolts
+---
+
+# topology definition
+# name to be used when submitting
+name: "shell-topology"
+
+# topology configuration
+# this will be passed to the submitter as a map of config options
+#
+config:
+ topology.workers: 1
+ # ...
+
+# spout definitions
+spouts:
+ - id: "sentence-spout"
+ className: "org.apache.storm.flux.wrappers.spouts.FluxShellSpout"
+ # shell spout constructor takes 2 arguments: String[], String[]
+ constructorArgs:
+ # command line
+ - ["node", "randomsentence.js"]
+ # output fields
+ - ["word"]
+ parallelism: 1
+ # ...
+
+# bolt definitions
+bolts:
+ - id: "splitsentence"
+ className: "org.apache.storm.flux.wrappers.bolts.FluxShellBolt"
+ constructorArgs:
+ # command line
+ - ["python", "splitsentence.py"]
+ # output fields
+ - ["word"]
+ parallelism: 1
+ # ...
+
+ - id: "log"
+ className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
+ parallelism: 1
+ # ...
+
+ - id: "count"
+ className: "org.apache.storm.testing.TestWordCounter"
+ parallelism: 1
+ # ...
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+# custom stream groupings are also supported
+
+streams:
+ - name: "spout --> split" # name isn't used (placeholder for logging, UI, etc.)
+ from: "sentence-spout"
+ to: "splitsentence"
+ grouping:
+ type: SHUFFLE
+
+ - name: "split --> count"
+ from: "splitsentence"
+ to: "count"
+ grouping:
+ type: FIELDS
+ args: ["word"]
+
+ - name: "count --> log"
+ from: "count"
+ to: "log"
+ grouping:
+ type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/simple_hbase.yaml
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/simple_hbase.yaml b/examples/flux-examples/src/main/resources/simple_hbase.yaml
new file mode 100644
index 0000000..93a2781
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/simple_hbase.yaml
@@ -0,0 +1,92 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+---
+# NOTE: To use this example, you will need to modify `src/main/resources/hbase-site.xml`
+# to point to your HBase instance, and then repackage with `mvn package`.
+# This is a known issue.
+
+# topology definition
+# name to be used when submitting
+name: "hbase-persistent-wordcount"
+
+# Components
+components:
+ - id: "columnFields"
+ className: "org.apache.storm.tuple.Fields"
+ constructorArgs:
+ - ["word"]
+
+ - id: "counterFields"
+ className: "org.apache.storm.tuple.Fields"
+ constructorArgs:
+ - ["count"]
+
+ - id: "mapper"
+ className: "org.apache.storm.hbase.bolt.mapper.SimpleHBaseMapper"
+ configMethods:
+ - name: "withRowKeyField"
+ args: ["word"]
+ - name: "withColumnFields"
+ args: [ref: "columnFields"]
+ - name: "withCounterFields"
+ args: [ref: "counterFields"]
+ - name: "withColumnFamily"
+ args: ["cf"]
+
+# topology configuration
+# this will be passed to the submitter as a map of config options
+config:
+ topology.workers: 1
+ hbase.conf:
+ hbase.rootdir: "${hbase.rootdir}"
+ hbase.zookeeper.quorum: "${hbase.zookeeper.quorum}"
+
+# spout definitions
+spouts:
+ - id: "word-spout"
+ className: "org.apache.storm.testing.TestWordSpout"
+ parallelism: 1
+
+# bolt definitions
+
+bolts:
+ - id: "count-bolt"
+ className: "org.apache.storm.flux.examples.WordCounter"
+ parallelism: 1
+
+ - id: "hbase-bolt"
+ className: "org.apache.storm.hbase.bolt.HBaseBolt"
+ constructorArgs:
+ - "WordCount" # HBase table name
+ - ref: "mapper"
+ configMethods:
+ - name: "withConfigKey"
+ args: ["hbase.conf"]
+ parallelism: 1
+
+streams:
+ - name: "" # name isn't used (placeholder for logging, UI, etc.)
+ from: "word-spout"
+ to: "count-bolt"
+ grouping:
+ type: SHUFFLE
+
+ - name: "" # name isn't used (placeholder for logging, UI, etc.)
+ from: "count-bolt"
+ to: "hbase-bolt"
+ grouping:
+ type: FIELDS
+ args: ["word"]
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/simple_hdfs.yaml
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/simple_hdfs.yaml b/examples/flux-examples/src/main/resources/simple_hdfs.yaml
new file mode 100644
index 0000000..b8d4020
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/simple_hdfs.yaml
@@ -0,0 +1,105 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Test ability to wire together shell spouts/bolts
+---
+
+# topology definition
+# name to be used when submitting
+name: "hdfs-topology"
+
+# Components
+# Components are analagous to Spring beans. They are meant to be used as constructor,
+# property(setter), and builder arguments.
+#
+# for the time being, components must be declared in the order they are referenced
+components:
+ - id: "syncPolicy"
+ className: "org.apache.storm.hdfs.bolt.sync.CountSyncPolicy"
+ constructorArgs:
+ - 1000
+ - id: "rotationPolicy"
+ className: "org.apache.storm.hdfs.bolt.rotation.TimedRotationPolicy"
+ constructorArgs:
+ - 30
+ - SECONDS
+
+ - id: "fileNameFormat"
+ className: "org.apache.storm.hdfs.bolt.format.DefaultFileNameFormat"
+ configMethods:
+ - name: "withPath"
+ args: ["${hdfs.write.dir}"]
+ - name: "withExtension"
+ args: [".txt"]
+
+ - id: "recordFormat"
+ className: "org.apache.storm.hdfs.bolt.format.DelimitedRecordFormat"
+ configMethods:
+ - name: "withFieldDelimiter"
+ args: ["|"]
+
+ - id: "rotationAction"
+ className: "org.apache.storm.hdfs.common.rotation.MoveFileAction"
+ configMethods:
+ - name: "toDestination"
+ args: ["${hdfs.dest.dir}"]
+
+# spout definitions
+spouts:
+ - id: "spout-1"
+ className: "org.apache.storm.testing.TestWordSpout"
+ parallelism: 1
+ # ...
+
+# bolt definitions
+
+bolts:
+ - id: "bolt-1"
+ className: "org.apache.storm.hdfs.bolt.HdfsBolt"
+ configMethods:
+ - name: "withConfigKey"
+ args: ["hdfs.config"]
+ - name: "withFsUrl"
+ args: ["${hdfs.url}"]
+ - name: "withFileNameFormat"
+ args: [ref: "fileNameFormat"]
+ - name: "withRecordFormat"
+ args: [ref: "recordFormat"]
+ - name: "withRotationPolicy"
+ args: [ref: "rotationPolicy"]
+ - name: "withSyncPolicy"
+ args: [ref: "syncPolicy"]
+ - name: "addRotationAction"
+ args: [ref: "rotationAction"]
+ parallelism: 1
+ # ...
+
+ - id: "bolt-2"
+ className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
+ parallelism: 1
+
+streams:
+ - name: "" # name isn't used (placeholder for logging, UI, etc.)
+ from: "spout-1"
+ to: "bolt-1"
+ grouping:
+ type: SHUFFLE
+
+ - name: "" # name isn't used (placeholder for logging, UI, etc.)
+ from: "spout-1"
+ to: "bolt-2"
+ grouping:
+ type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/simple_stateful_wordcount.yaml
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/simple_stateful_wordcount.yaml b/examples/flux-examples/src/main/resources/simple_stateful_wordcount.yaml
new file mode 100644
index 0000000..14b9b3a
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/simple_stateful_wordcount.yaml
@@ -0,0 +1,60 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+
+# topology definition
+# name to be used when submitting
+name: "stateful-wordcount-topology"
+
+# topology configuration
+# this will be passed to the submitter as a map of config options
+#
+config:
+ topology.workers: 1
+
+# spout definitions
+spouts:
+ - id: "spout-1"
+ className: "org.apache.storm.testing.TestWordSpout"
+ parallelism: 1
+
+# bolt definitions
+bolts:
+ - id: "bolt-1"
+ className: "org.apache.storm.flux.examples.StatefulWordCounter"
+ parallelism: 1
+
+ - id: "bolt-2"
+ className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
+ parallelism: 1
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+streams:
+ - name: "spout-1 --> bolt-1" # name isn't used (placeholder for logging, UI, etc.)
+ from: "spout-1"
+ to: "bolt-1"
+ grouping:
+ type: FIELDS
+ args: ["word"]
+
+ - name: "bolt-1 --> bolt2"
+ from: "bolt-1"
+ to: "bolt-2"
+ grouping:
+ type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/simple_windowing.yaml
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/simple_windowing.yaml b/examples/flux-examples/src/main/resources/simple_windowing.yaml
new file mode 100755
index 0000000..f2f74ff
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/simple_windowing.yaml
@@ -0,0 +1,69 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+
+name: "sliding-window-topology"
+
+components:
+ - id: "windowLength"
+ className: "org.apache.storm.topology.base.BaseWindowedBolt$Count"
+ constructorArgs:
+ - 5
+ - id: "slidingInterval"
+ className: "org.apache.storm.topology.base.BaseWindowedBolt$Count"
+ constructorArgs:
+ - 3
+
+config:
+ topology.workers: 1
+
+# spout definitions
+spouts:
+ - id: "spout-1"
+ className: "org.apache.storm.testing.TestWordSpout"
+ parallelism: 1
+
+# bolt definitions
+bolts:
+ - id: "bolt-1"
+ className: "org.apache.storm.flux.examples.TestWindowBolt"
+ configMethods:
+ - name: "withWindow"
+ args: [ref: "windowLength", ref: "slidingInterval"]
+ parallelism: 1
+ - id: "bolt-2"
+ className: "org.apache.storm.flux.examples.TestPrintBolt"
+ parallelism: 1
+
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+streams:
+ - name: "spout-1 --> bolt-1" # name isn't used (placeholder for logging, UI, etc.)
+# id: "connection-1"
+ from: "spout-1"
+ to: "bolt-1"
+ grouping:
+ type: FIELDS
+ args: ["word"]
+ - name: "bolt-1 --> bolt-2" # name isn't used (placeholder for logging, UI, etc.)
+# id: "connection-1"
+ from: "bolt-1"
+ to: "bolt-2"
+ grouping:
+ type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/flux-examples/src/main/resources/simple_wordcount.yaml
----------------------------------------------------------------------
diff --git a/examples/flux-examples/src/main/resources/simple_wordcount.yaml b/examples/flux-examples/src/main/resources/simple_wordcount.yaml
new file mode 100644
index 0000000..6443a97
--- /dev/null
+++ b/examples/flux-examples/src/main/resources/simple_wordcount.yaml
@@ -0,0 +1,68 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+
+# topology definition
+# name to be used when submitting
+name: "yaml-topology"
+
+# topology configuration
+# this will be passed to the submitter as a map of config options
+#
+config:
+ topology.workers: 1
+
+# spout definitions
+spouts:
+ - id: "spout-1"
+ className: "org.apache.storm.testing.TestWordSpout"
+ parallelism: 1
+
+# bolt definitions
+bolts:
+ - id: "bolt-1"
+ className: "org.apache.storm.testing.TestWordCounter"
+ parallelism: 1
+
+ - id: "bolt-2"
+ className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
+ parallelism: 1
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+streams:
+ - name: "spout-1 --> bolt-1" # name isn't used (placeholder for logging, UI, etc.)
+# id: "connection-1"
+ from: "spout-1"
+ to: "bolt-1"
+ grouping:
+ type: FIELDS
+ args: ["word"]
+
+ - name: "bolt-1 --> bolt2"
+ from: "bolt-1"
+ to: "bolt-2"
+ grouping:
+ type: SHUFFLE
+
+
+
+
+
+
+
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-elasticsearch-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-elasticsearch-examples/pom.xml b/examples/storm-elasticsearch-examples/pom.xml
index 0c312fc..f853ec4 100644
--- a/examples/storm-elasticsearch-examples/pom.xml
+++ b/examples/storm-elasticsearch-examples/pom.xml
@@ -26,21 +26,6 @@
</parent>
<artifactId>storm-elasticsearch-examples</artifactId>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-hbase-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-hbase-examples/pom.xml b/examples/storm-hbase-examples/pom.xml
index 1b26e92..8b1c15c 100644
--- a/examples/storm-hbase-examples/pom.xml
+++ b/examples/storm-hbase-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-hbase-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-hdfs-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-hdfs-examples/pom.xml b/examples/storm-hdfs-examples/pom.xml
index 78ac00a..69b90ef 100644
--- a/examples/storm-hdfs-examples/pom.xml
+++ b/examples/storm-hdfs-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-hdfs-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-hive-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-hive-examples/pom.xml b/examples/storm-hive-examples/pom.xml
index a51f597..6f3f6ba 100644
--- a/examples/storm-hive-examples/pom.xml
+++ b/examples/storm-hive-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-hive-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jdbc-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-jdbc-examples/pom.xml b/examples/storm-jdbc-examples/pom.xml
index fa2cae9..9d488b2 100644
--- a/examples/storm-jdbc-examples/pom.xml
+++ b/examples/storm-jdbc-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-jdbc-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jms-examples/README.markdown
----------------------------------------------------------------------
diff --git a/examples/storm-jms-examples/README.markdown b/examples/storm-jms-examples/README.markdown
new file mode 100644
index 0000000..7a4d8f0
--- /dev/null
+++ b/examples/storm-jms-examples/README.markdown
@@ -0,0 +1,12 @@
+## About Storm JMS Examples
+This project contains a simple storm topology that illustrates the usage of "storm-jms".
+
+To build:
+
+`mvn clean install`
+
+The default build will create a jar file that can be deployed to to a Storm cluster in the "target" directory:
+
+`storm-jms-examples-0.1-SNAPSHOT-jar-with-dependencies.jar`
+
+
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jms-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-jms-examples/pom.xml b/examples/storm-jms-examples/pom.xml
new file mode 100644
index 0000000..4d232f7
--- /dev/null
+++ b/examples/storm-jms-examples/pom.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>storm</artifactId>
+ <groupId>org.apache.storm</groupId>
+ <version>2.0.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+
+ <artifactId>storm-jms-examples</artifactId>
+
+ <properties>
+ <spring.version>2.5.6</spring.version>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ <version>${spring.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>${spring.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>${spring.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-jms</artifactId>
+ <version>${spring.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.xbean</groupId>
+ <artifactId>xbean-spring</artifactId>
+ <version>3.7</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-core</artifactId>
+ <version>${project.version}</version>
+ <!-- keep storm out of the jar-with-dependencies -->
+ <scope>${provided.scope}</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-jms</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-core</artifactId>
+ <version>5.4.0</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <!-- bind the maven-assembly-plugin to the package phase this will create
+ a jar file without the storm dependencies suitable for deployment to a cluster. -->
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <configuration>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ <archive>
+ <manifest>
+ </manifest>
+ </archive>
+ </configuration>
+ <executions>
+ <execution>
+ <id>make-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+
+ </plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.2.1</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <executable>java</executable>
+ <includeProjectDependencies>true</includeProjectDependencies>
+ <includePluginDependencies>true</includePluginDependencies>
+ <mainClass>org.apache.storm.jms.example.ExampleJmsTopology</mainClass>
+ <systemProperties>
+ <systemProperty>
+ <key>log4j.configuration</key>
+ <value>file:./src/main/resources/log4j.properties</value>
+ </systemProperty>
+ </systemProperties>
+ </configuration>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-core</artifactId>
+ <version>${project.version}</version>
+ <type>jar</type>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/ExampleJmsTopology.java
----------------------------------------------------------------------
diff --git a/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/ExampleJmsTopology.java b/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/ExampleJmsTopology.java
new file mode 100644
index 0000000..82dbd5b
--- /dev/null
+++ b/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/ExampleJmsTopology.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.example;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.storm.Config;
+import org.apache.storm.LocalCluster;
+import org.apache.storm.LocalCluster.LocalTopology;
+import org.apache.storm.StormSubmitter;
+import org.apache.storm.jms.JmsMessageProducer;
+import org.apache.storm.jms.JmsProvider;
+import org.apache.storm.jms.JmsTupleProducer;
+import org.apache.storm.jms.bolt.JmsBolt;
+import org.apache.storm.jms.spout.JmsSpout;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.ITuple;
+import org.apache.storm.utils.Utils;
+
+public class ExampleJmsTopology {
+ public static final String JMS_QUEUE_SPOUT = "JMS_QUEUE_SPOUT";
+ public static final String INTERMEDIATE_BOLT = "INTERMEDIATE_BOLT";
+ public static final String FINAL_BOLT = "FINAL_BOLT";
+ public static final String JMS_TOPIC_BOLT = "JMS_TOPIC_BOLT";
+ public static final String JMS_TOPIC_SPOUT = "JMS_TOPIC_SPOUT";
+ public static final String ANOTHER_BOLT = "ANOTHER_BOLT";
+
+ @SuppressWarnings("serial")
+ public static void main(String[] args) throws Exception {
+
+ // JMS Queue Provider
+ JmsProvider jmsQueueProvider = new SpringJmsProvider(
+ "jms-activemq.xml", "jmsConnectionFactory",
+ "notificationQueue");
+
+ // JMS Topic provider
+ JmsProvider jmsTopicProvider = new SpringJmsProvider(
+ "jms-activemq.xml", "jmsConnectionFactory",
+ "notificationTopic");
+
+ // JMS Producer
+ JmsTupleProducer producer = new JsonTupleProducer();
+
+ // JMS Queue Spout
+ JmsSpout queueSpout = new JmsSpout();
+ queueSpout.setJmsProvider(jmsQueueProvider);
+ queueSpout.setJmsTupleProducer(producer);
+ queueSpout.setJmsAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
+ queueSpout.setDistributed(true); // allow multiple instances
+
+ TopologyBuilder builder = new TopologyBuilder();
+
+ // spout with 5 parallel instances
+ builder.setSpout(JMS_QUEUE_SPOUT, queueSpout, 5);
+
+ // intermediate bolt, subscribes to jms spout, anchors on tuples, and auto-acks
+ builder.setBolt(INTERMEDIATE_BOLT,
+ new GenericBolt("INTERMEDIATE_BOLT", true, true, new Fields("json")), 3).shuffleGrouping(
+ JMS_QUEUE_SPOUT);
+
+ // bolt that subscribes to the intermediate bolt, and auto-acks
+ // messages.
+ builder.setBolt(FINAL_BOLT, new GenericBolt("FINAL_BOLT", true, true), 3).shuffleGrouping(
+ INTERMEDIATE_BOLT);
+
+ // bolt that subscribes to the intermediate bolt, and publishes to a JMS Topic
+ JmsBolt jmsBolt = new JmsBolt();
+ jmsBolt.setJmsProvider(jmsTopicProvider);
+
+ // anonymous message producer just calls toString() on the tuple to create a jms message
+ jmsBolt.setJmsMessageProducer(new JmsMessageProducer() {
+ @Override
+ public Message toMessage(Session session, ITuple input) throws JMSException {
+ System.out.println("Sending JMS Message:" + input.toString());
+ TextMessage tm = session.createTextMessage(input.toString());
+ return tm;
+ }
+ });
+
+ builder.setBolt(JMS_TOPIC_BOLT, jmsBolt).shuffleGrouping(INTERMEDIATE_BOLT);
+
+ // JMS Topic spout
+ JmsSpout topicSpout = new JmsSpout();
+ topicSpout.setJmsProvider(jmsTopicProvider);
+ topicSpout.setJmsTupleProducer(producer);
+ topicSpout.setJmsAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
+ topicSpout.setDistributed(false);
+
+ builder.setSpout(JMS_TOPIC_SPOUT, topicSpout);
+
+ builder.setBolt(ANOTHER_BOLT, new GenericBolt("ANOTHER_BOLT", true, true), 1).shuffleGrouping(
+ JMS_TOPIC_SPOUT);
+
+ Config conf = new Config();
+
+ if (args.length > 0) {
+ conf.setNumWorkers(3);
+
+ StormSubmitter.submitTopology(args[0], conf,
+ builder.createTopology());
+ } else {
+
+ conf.setDebug(true);
+
+ try (LocalCluster cluster = new LocalCluster();
+ LocalTopology topo = cluster.submitTopology("storm-jms-example", conf, builder.createTopology());) {
+ Utils.sleep(60000);
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/GenericBolt.java
----------------------------------------------------------------------
diff --git a/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/GenericBolt.java b/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/GenericBolt.java
new file mode 100644
index 0000000..57de1ba
--- /dev/null
+++ b/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/GenericBolt.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.example;
+
+import java.util.Map;
+
+import org.apache.storm.topology.base.BaseRichBolt;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+
+/**
+ * A generic <code>org.apache.storm.topology.IRichBolt</code> implementation
+ * for testing/debugging the Storm JMS Spout and example topologies.
+ * <p>
+ * For debugging purposes, set the log level of the
+ * <code>org.apache.storm.contrib.jms</code> package to DEBUG for debugging
+ * output.
+ *
+ * @author tgoetz
+ */
+@SuppressWarnings("serial")
+public class GenericBolt extends BaseRichBolt {
+ private static final Logger LOG = LoggerFactory.getLogger(GenericBolt.class);
+ private OutputCollector collector;
+ private boolean autoAck = false;
+ private boolean autoAnchor = false;
+ private Fields declaredFields;
+ private String name;
+
+ /**
+ * Constructs a new <code>GenericBolt</code> instance.
+ *
+ * @param name The name of the bolt (used in DEBUG logging)
+ * @param autoAck Whether or not this bolt should automatically acknowledge received tuples.
+ * @param autoAnchor Whether or not this bolt should automatically anchor to received tuples.
+ * @param declaredFields The fields this bolt declares as output.
+ */
+ public GenericBolt(String name, boolean autoAck, boolean autoAnchor, Fields declaredFields) {
+ this.name = name;
+ this.autoAck = autoAck;
+ this.autoAnchor = autoAnchor;
+ this.declaredFields = declaredFields;
+ }
+
+ public GenericBolt(String name, boolean autoAck, boolean autoAnchor) {
+ this(name, autoAck, autoAnchor, null);
+ }
+
+ @SuppressWarnings("rawtypes")
+ public void prepare(Map stormConf, TopologyContext context,
+ OutputCollector collector) {
+ this.collector = collector;
+
+ }
+
+ public void execute(Tuple input) {
+ LOG.debug("[" + this.name + "] Received message: " + input);
+
+
+ // only emit if we have declared fields.
+ if (this.declaredFields != null) {
+ LOG.debug("[" + this.name + "] emitting: " + input);
+ if (this.autoAnchor) {
+ this.collector.emit(input, input.getValues());
+ } else {
+ this.collector.emit(input.getValues());
+ }
+ }
+
+ if (this.autoAck) {
+ LOG.debug("[" + this.name + "] ACKing tuple: " + input);
+ this.collector.ack(input);
+ }
+
+ }
+
+ public void cleanup() {
+
+ }
+
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ if (this.declaredFields != null) {
+ declarer.declare(this.declaredFields);
+ }
+ }
+
+ public boolean isAutoAck() {
+ return this.autoAck;
+ }
+
+ public void setAutoAck(boolean autoAck) {
+ this.autoAck = autoAck;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/JsonTupleProducer.java
----------------------------------------------------------------------
diff --git a/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/JsonTupleProducer.java b/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/JsonTupleProducer.java
new file mode 100644
index 0000000..9ee175e
--- /dev/null
+++ b/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/JsonTupleProducer.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.example;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.TextMessage;
+
+import org.apache.storm.jms.JmsTupleProducer;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+
+/**
+ * A simple <code>JmsTupleProducer</code> that expects to receive
+ * JMS <code>TextMessage</code> objects with a body in JSON format.
+ * <p/>
+ * Ouputs a tuple with field name "json" and a string value
+ * containing the raw json.
+ * <p/>
+ * <b>NOTE: </b> Currently this implementation assumes the text is valid
+ * JSON and does not attempt to parse or validate it.
+ *
+ * @author tgoetz
+ *
+ */
+@SuppressWarnings("serial")
+public class JsonTupleProducer implements JmsTupleProducer {
+
+ public Values toTuple(Message msg) throws JMSException {
+ if(msg instanceof TextMessage){
+ String json = ((TextMessage) msg).getText();
+ return new Values(json);
+ } else {
+ return null;
+ }
+ }
+
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields("json"));
+ }
+
+}
[13/14] storm git commit: Merge branch 'STORM-2416' of
https://github.com/HeartSaVioR/storm into STORM-2416-merge
Posted by ka...@apache.org.
Merge branch 'STORM-2416' of https://github.com/HeartSaVioR/storm into STORM-2416-merge
Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/7dfd1100
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/7dfd1100
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/7dfd1100
Branch: refs/heads/master
Commit: 7dfd1100d63212a2e46902f818bbe6a0ef7c7a8e
Parents: c4170ab 2a369e4
Author: Jungtaek Lim <ka...@gmail.com>
Authored: Thu Apr 6 07:27:28 2017 +0900
Committer: Jungtaek Lim <ka...@gmail.com>
Committed: Thu Apr 6 07:27:28 2017 +0900
----------------------------------------------------------------------
examples/flux-examples/README.md | 93 +
examples/flux-examples/pom.xml | 152 +
.../flux/examples/StatefulWordCounter.java | 64 +
.../storm/flux/examples/TestPrintBolt.java | 39 +
.../storm/flux/examples/TestWindowBolt.java | 47 +
.../storm/flux/examples/WordCountClient.java | 74 +
.../apache/storm/flux/examples/WordCounter.java | 71 +
.../src/main/resources/hbase_bolt.properties | 18 +
.../src/main/resources/hdfs_bolt.properties | 26 +
.../src/main/resources/kafka_spout.yaml | 136 +
.../src/main/resources/multilang.yaml | 89 +
.../src/main/resources/simple_hbase.yaml | 92 +
.../src/main/resources/simple_hdfs.yaml | 105 +
.../resources/simple_stateful_wordcount.yaml | 60 +
.../src/main/resources/simple_windowing.yaml | 69 +
.../src/main/resources/simple_wordcount.yaml | 68 +
examples/storm-elasticsearch-examples/pom.xml | 15 -
examples/storm-hbase-examples/pom.xml | 14 -
examples/storm-hdfs-examples/pom.xml | 14 -
examples/storm-hive-examples/pom.xml | 14 -
examples/storm-jdbc-examples/pom.xml | 14 -
examples/storm-jms-examples/README.markdown | 12 +
examples/storm-jms-examples/pom.xml | 150 +
.../storm/jms/example/ExampleJmsTopology.java | 131 +
.../apache/storm/jms/example/GenericBolt.java | 116 +
.../storm/jms/example/JsonTupleProducer.java | 58 +
.../storm/jms/example/SpringJmsProvider.java | 74 +
.../src/main/resources/jms-activemq.xml | 53 +
.../src/main/resources/log4j.properties | 29 +
examples/storm-kafka-client-examples/pom.xml | 14 -
examples/storm-kafka-examples/pom.xml | 14 -
examples/storm-mongodb-examples/pom.xml | 14 -
examples/storm-mqtt-examples/pom.xml | 14 -
examples/storm-opentsdb-examples/pom.xml | 14 -
examples/storm-perf/README.markdown | 50 +
examples/storm-perf/pom.xml | 107 +
.../main/conf/ConstSpoutIdBoltNullBoltTopo.yaml | 22 +
.../src/main/conf/ConstSpoutNullBoltTopo.yaml | 22 +
.../src/main/conf/FileReadWordCountTopo.yaml | 23 +
.../src/main/conf/HdfsSpoutNullBoltTopo.yaml | 25 +
.../storm-perf/src/main/conf/KafkaHdfsTopo.yaml | 26 +
.../src/main/conf/KafkaSpoutNullBoltTopo.yaml | 23 +
.../src/main/conf/StrGenSpoutHdfsBoltTopo.yaml | 25 +
.../perf/ConstSpoutIdBoltNullBoltTopo.java | 101 +
.../storm/perf/ConstSpoutNullBoltTopo.java | 107 +
.../apache/storm/perf/ConstSpoutOnlyTopo.java | 74 +
.../storm/perf/FileReadWordCountTopo.java | 96 +
.../storm/perf/HdfsSpoutNullBoltTopo.java | 101 +
.../org/apache/storm/perf/KafkaHdfsTopo.java | 168 +
.../storm/perf/KafkaSpoutNullBoltTopo.java | 114 +
.../storm/perf/StrGenSpoutHdfsBoltTopo.java | 154 +
.../org/apache/storm/perf/bolt/CountBolt.java | 58 +
.../org/apache/storm/perf/bolt/DevNullBolt.java | 47 +
.../java/org/apache/storm/perf/bolt/IdBolt.java | 49 +
.../storm/perf/bolt/SplitSentenceBolt.java | 58 +
.../org/apache/storm/perf/spout/ConstSpout.java | 70 +
.../apache/storm/perf/spout/FileReadSpout.java | 141 +
.../apache/storm/perf/spout/StringGenSpout.java | 93 +
.../storm/perf/utils/BasicMetricsCollector.java | 309 +
.../org/apache/storm/perf/utils/Helper.java | 131 +
.../apache/storm/perf/utils/IdentityBolt.java | 51 +
.../apache/storm/perf/utils/MetricsSample.java | 248 +
.../src/main/sampledata/randomwords.txt | 14049 +++++++++++++++++
examples/storm-pmml-examples/pom.xml | 14 -
examples/storm-redis-examples/pom.xml | 14 -
examples/storm-solr-examples/pom.xml | 14 -
examples/storm-starter/pom.xml | 11 -
external/flux/flux-examples/README.md | 93 -
external/flux/flux-examples/pom.xml | 146 -
.../flux/examples/StatefulWordCounter.java | 64 -
.../storm/flux/examples/TestPrintBolt.java | 39 -
.../storm/flux/examples/TestWindowBolt.java | 47 -
.../storm/flux/examples/WordCountClient.java | 74 -
.../apache/storm/flux/examples/WordCounter.java | 71 -
.../src/main/resources/hbase_bolt.properties | 18 -
.../src/main/resources/hdfs_bolt.properties | 26 -
.../src/main/resources/kafka_spout.yaml | 136 -
.../src/main/resources/multilang.yaml | 89 -
.../src/main/resources/simple_hbase.yaml | 92 -
.../src/main/resources/simple_hdfs.yaml | 105 -
.../resources/simple_stateful_wordcount.yaml | 60 -
.../src/main/resources/simple_windowing.yaml | 69 -
.../src/main/resources/simple_wordcount.yaml | 68 -
external/flux/pom.xml | 21 -
external/sql/storm-sql-core/pom.xml | 4 +-
.../storm-sql-external/storm-sql-hdfs/pom.xml | 6 +-
.../storm-sql-external/storm-sql-kafka/pom.xml | 6 +-
.../storm-sql-mongodb/pom.xml | 6 +-
.../storm-sql-external/storm-sql-redis/pom.xml | 6 +-
external/sql/storm-sql-runtime/pom.xml | 2 +-
external/storm-cassandra/pom.xml | 2 +-
external/storm-druid/pom.xml | 42 +-
external/storm-elasticsearch/pom.xml | 2 +-
external/storm-eventhubs/pom.xml | 86 +-
external/storm-hbase/pom.xml | 2 +-
external/storm-hdfs/pom.xml | 2 +-
external/storm-hive/pom.xml | 2 +-
external/storm-jdbc/pom.xml | 2 +-
external/storm-jms/core/pom.xml | 95 -
.../apache/storm/jms/JmsMessageProducer.java | 46 -
.../java/org/apache/storm/jms/JmsProvider.java | 48 -
.../org/apache/storm/jms/JmsTupleProducer.java | 58 -
.../java/org/apache/storm/jms/bolt/JmsBolt.java | 219 -
.../apache/storm/jms/spout/JmsMessageID.java | 58 -
.../org/apache/storm/jms/spout/JmsSpout.java | 382 -
.../org/apache/storm/jms/trident/JmsBatch.java | 27 -
.../org/apache/storm/jms/trident/JmsState.java | 129 -
.../storm/jms/trident/JmsStateFactory.java | 40 -
.../apache/storm/jms/trident/JmsUpdater.java | 38 -
.../storm/jms/trident/TridentJmsSpout.java | 409 -
.../apache/storm/jms/spout/JmsSpoutTest.java | 88 -
.../apache/storm/jms/spout/MockJmsProvider.java | 62 -
.../jms/spout/MockSpoutOutputCollector.java | 55 -
.../storm/jms/spout/MockTupleProducer.java | 47 -
.../core/src/test/resources/jndi.properties | 18 -
external/storm-jms/examples/README.markdown | 12 -
external/storm-jms/examples/pom.xml | 150 -
.../storm/jms/example/ExampleJmsTopology.java | 131 -
.../apache/storm/jms/example/GenericBolt.java | 116 -
.../storm/jms/example/JsonTupleProducer.java | 58 -
.../storm/jms/example/SpringJmsProvider.java | 74 -
.../src/main/resources/jms-activemq.xml | 53 -
.../src/main/resources/log4j.properties | 29 -
external/storm-jms/pom.xml | 48 +-
.../apache/storm/jms/JmsMessageProducer.java | 46 +
.../java/org/apache/storm/jms/JmsProvider.java | 48 +
.../org/apache/storm/jms/JmsTupleProducer.java | 58 +
.../java/org/apache/storm/jms/bolt/JmsBolt.java | 219 +
.../apache/storm/jms/spout/JmsMessageID.java | 58 +
.../org/apache/storm/jms/spout/JmsSpout.java | 382 +
.../org/apache/storm/jms/trident/JmsBatch.java | 27 +
.../org/apache/storm/jms/trident/JmsState.java | 129 +
.../storm/jms/trident/JmsStateFactory.java | 40 +
.../apache/storm/jms/trident/JmsUpdater.java | 38 +
.../storm/jms/trident/TridentJmsSpout.java | 409 +
.../apache/storm/jms/spout/JmsSpoutTest.java | 88 +
.../apache/storm/jms/spout/MockJmsProvider.java | 62 +
.../jms/spout/MockSpoutOutputCollector.java | 55 +
.../storm/jms/spout/MockTupleProducer.java | 47 +
.../src/test/resources/jndi.properties | 18 +
external/storm-kafka-client/pom.xml | 2 +-
external/storm-kafka/pom.xml | 2 +-
external/storm-kinesis/pom.xml | 2 +-
external/storm-metrics/pom.xml | 2 +-
external/storm-mongodb/pom.xml | 148 +-
external/storm-mqtt/core/pom.xml | 126 -
.../java/org/apache/storm/mqtt/MqttLogger.java | 36 -
.../java/org/apache/storm/mqtt/MqttMessage.java | 41 -
.../apache/storm/mqtt/MqttMessageMapper.java | 44 -
.../org/apache/storm/mqtt/MqttTupleMapper.java | 37 -
.../org/apache/storm/mqtt/bolt/MqttBolt.java | 105 -
.../apache/storm/mqtt/common/MqttOptions.java | 334 -
.../apache/storm/mqtt/common/MqttPublisher.java | 67 -
.../org/apache/storm/mqtt/common/MqttUtils.java | 88 -
.../org/apache/storm/mqtt/common/SslUtils.java | 64 -
.../mqtt/mappers/ByteArrayMessageMapper.java | 34 -
.../storm/mqtt/mappers/StringMessageMapper.java | 37 -
.../apache/storm/mqtt/spout/AckableMessage.java | 71 -
.../org/apache/storm/mqtt/spout/MqttSpout.java | 262 -
.../storm/mqtt/ssl/DefaultKeyStoreLoader.java | 97 -
.../apache/storm/mqtt/ssl/KeyStoreLoader.java | 35 -
.../storm/mqtt/trident/MqttPublishFunction.java | 85 -
.../storm/mqtt/StormMqttIntegrationTest.java | 153 -
external/storm-mqtt/pom.xml | 144 +-
.../java/org/apache/storm/mqtt/MqttLogger.java | 36 +
.../java/org/apache/storm/mqtt/MqttMessage.java | 41 +
.../apache/storm/mqtt/MqttMessageMapper.java | 44 +
.../org/apache/storm/mqtt/MqttTupleMapper.java | 37 +
.../org/apache/storm/mqtt/bolt/MqttBolt.java | 105 +
.../apache/storm/mqtt/common/MqttOptions.java | 334 +
.../apache/storm/mqtt/common/MqttPublisher.java | 67 +
.../org/apache/storm/mqtt/common/MqttUtils.java | 88 +
.../org/apache/storm/mqtt/common/SslUtils.java | 64 +
.../mqtt/mappers/ByteArrayMessageMapper.java | 34 +
.../storm/mqtt/mappers/StringMessageMapper.java | 37 +
.../apache/storm/mqtt/spout/AckableMessage.java | 71 +
.../org/apache/storm/mqtt/spout/MqttSpout.java | 262 +
.../storm/mqtt/ssl/DefaultKeyStoreLoader.java | 97 +
.../apache/storm/mqtt/ssl/KeyStoreLoader.java | 35 +
.../storm/mqtt/trident/MqttPublishFunction.java | 85 +
.../storm/mqtt/StormMqttIntegrationTest.java | 153 +
external/storm-opentsdb/pom.xml | 2 +-
external/storm-pmml/pom.xml | 2 +-
external/storm-redis/pom.xml | 2 +-
external/storm-solr/pom.xml | 2 +-
pom.xml | 18 +-
.../final-package/src/main/assembly/binary.xml | 254 +-
storm-perf/README.markdown | 50 -
storm-perf/pom.xml | 122 -
.../main/conf/ConstSpoutIdBoltNullBoltTopo.yaml | 22 -
.../src/main/conf/ConstSpoutNullBoltTopo.yaml | 22 -
.../src/main/conf/FileReadWordCountTopo.yaml | 23 -
.../src/main/conf/HdfsSpoutNullBoltTopo.yaml | 25 -
storm-perf/src/main/conf/KafkaHdfsTopo.yaml | 26 -
.../src/main/conf/KafkaSpoutNullBoltTopo.yaml | 23 -
.../src/main/conf/StrGenSpoutHdfsBoltTopo.yaml | 25 -
.../perf/ConstSpoutIdBoltNullBoltTopo.java | 101 -
.../storm/perf/ConstSpoutNullBoltTopo.java | 107 -
.../apache/storm/perf/ConstSpoutOnlyTopo.java | 74 -
.../storm/perf/FileReadWordCountTopo.java | 96 -
.../storm/perf/HdfsSpoutNullBoltTopo.java | 101 -
.../org/apache/storm/perf/KafkaHdfsTopo.java | 168 -
.../storm/perf/KafkaSpoutNullBoltTopo.java | 114 -
.../storm/perf/StrGenSpoutHdfsBoltTopo.java | 154 -
.../org/apache/storm/perf/bolt/CountBolt.java | 58 -
.../org/apache/storm/perf/bolt/DevNullBolt.java | 47 -
.../java/org/apache/storm/perf/bolt/IdBolt.java | 49 -
.../storm/perf/bolt/SplitSentenceBolt.java | 58 -
.../org/apache/storm/perf/spout/ConstSpout.java | 70 -
.../apache/storm/perf/spout/FileReadSpout.java | 141 -
.../apache/storm/perf/spout/StringGenSpout.java | 93 -
.../storm/perf/utils/BasicMetricsCollector.java | 309 -
.../org/apache/storm/perf/utils/Helper.java | 131 -
.../apache/storm/perf/utils/IdentityBolt.java | 51 -
.../apache/storm/perf/utils/MetricsSample.java | 248 -
storm-perf/src/main/sampledata/randomwords.txt | 14049 -----------------
216 files changed, 21999 insertions(+), 22608 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/storm/blob/7dfd1100/external/storm-cassandra/pom.xml
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/storm/blob/7dfd1100/pom.xml
----------------------------------------------------------------------
[08/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-pmml-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-pmml-examples/pom.xml b/examples/storm-pmml-examples/pom.xml
index e0925fd..05ec99f 100644
--- a/examples/storm-pmml-examples/pom.xml
+++ b/examples/storm-pmml-examples/pom.xml
@@ -31,20 +31,6 @@
<artifactId>storm-pmml-examples</artifactId>
<name>storm-pmml-examples</name>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-redis-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-redis-examples/pom.xml b/examples/storm-redis-examples/pom.xml
index 92f8b0d..3532237 100644
--- a/examples/storm-redis-examples/pom.xml
+++ b/examples/storm-redis-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-redis-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-solr-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-solr-examples/pom.xml b/examples/storm-solr-examples/pom.xml
index f8d864e..1cfa796 100644
--- a/examples/storm-solr-examples/pom.xml
+++ b/examples/storm-solr-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-solr-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-starter/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-starter/pom.xml b/examples/storm-starter/pom.xml
index c22388b..69acdb8 100644
--- a/examples/storm-starter/pom.xml
+++ b/examples/storm-starter/pom.xml
@@ -31,20 +31,9 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <!-- see comment below... This fixes an annoyance with intellij -->
- <provided.scope>provided</provided.scope>
<hbase.version>0.98.4-hadoop2</hbase.version>
</properties>
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.hdrhistogram</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/README.md
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/README.md b/external/flux/flux-examples/README.md
deleted file mode 100644
index 3d610b4..0000000
--- a/external/flux/flux-examples/README.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# Flux Examples
-A collection of examples illustrating various capabilities.
-
-## Building From Source and Running
-
-Checkout the projects source and perform a top level Maven build (i.e. from the `flux` directory):
-
-```bash
-git clone https://github.com/apache/storm.git
-cd storm
-mvn install -DskipTests=true
-```
-
-This will create a shaded (i.e. "fat" or "uber") jar in the `external/flux/flux-examples/target` directory that can run/deployed with
-the `storm` command:
-
-```bash
-cd flux-examples
-storm jar ./target/flux-examples-*-SNAPSHOT.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_wordcount.yaml
-```
-
-The example YAML files are also packaged in the examples jar, so they can also be referenced with Flux's `--resource`
-command line switch:
-
-```bash
-storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local --resource /simple_wordcount.yaml
-```
-
-## Available Examples
-
-### [simple_wordcount.yaml](src/main/resources/simple_wordcount.yaml)
-
-This is a very basic wordcount example using Java spouts and bolts. It simply logs the running count of each word
-received.
-
-### [multilang.yaml](src/main/resources/multilang.yaml)
-
-Another wordcount example that uses a spout written in JavaScript (node.js), a bolt written in Python, and two bolts
-written in java.
-
-### [kafka_spout.yaml](src/main/resources/kafka_spout.yaml)
-
-This example illustrates how to configure Storm's `storm-kafka` spout using Flux YAML DSL `components`, `references`,
-and `constructor arguments` constructs.
-
-### [simple_hdfs.yaml](src/main/resources/simple_hdfs.yaml)
-
-This example demonstrates using Flux to setup a storm-hdfs bolt to write to an HDFS cluster. It also demonstrates Flux's
-variable substitution/filtering feature.
-
-To run the `simple_hdfs.yaml` example, copy the `hdfs_bolt.properties` file to a convenient location and change, at
-least, the property `hdfs.url` to point to a HDFS cluster. Then you can run the example something like:
-
-```bash
-storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_hdfs.yaml --filter my_hdfs_bolt.properties
-```
-
-### [simple_hbase.yaml](src/main/resources/simple_hbase.yaml)
-
-This example illustrates how to use Flux to setup a storm-hbase bolt to write to HBase.
-
-To run the `simple_hbase.yaml` example, copy the `hbase_bolt.properties` file to a convenient location and change the properties
- `hbase.rootdir` and `hbase.zookeeper.quorum`. Then you can run the example something like:
-
-```bash
-storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_hbase.yaml --filter my_hbase_bolt.properties
-```
-
-### [simple_windowing.yaml](src/main/resources/simple_windowing.yaml)
-
-This example illustrates how to use Flux to set up a storm topology that contains windowing operations.
-
-To run,
-
-```bash
-storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_windowing.yaml
-```
-
-### [simple_stateful_wordcount.yaml](src/main/resources/simple_stateful_wordcount.yaml)
-
-Flux also supports stateful bolts which is illustrated with this example. It is basically an extension of the basic wordcount example.
-The state is periodically saved (checkpointed) and restored when the topology is restarted.
-
-```bash
-storm jar ./target/flux-examples-*.jar org.apache.storm.flux.Flux --local ./src/main/resources/simple_stateful_wordcount.yaml
-```
-
-By default the state is stored in-memory only. As such you won't see a resumed state unless you configure to use Redis as the state backend.
-Ensure that you have Redis running at `localhost:6379` and that `storm-redis-*.jar` is in the classpath.
-
-```bash
-STORM_EXT_CLASSPATH=../../storm-redis/target storm jar ./target/flux-examples-*.jar -c topology.state.provider=org.apache.storm.redis.state.RedisKeyValueStateProvider org.apache.storm.flux.Flux --local ./src/main/resources/simple_stateful_wordcount.yaml
-```
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/pom.xml
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/pom.xml b/external/flux/flux-examples/pom.xml
deleted file mode 100644
index ef56ebd..0000000
--- a/external/flux/flux-examples/pom.xml
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.storm</groupId>
- <artifactId>flux</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
- <artifactId>flux-examples</artifactId>
- <packaging>jar</packaging>
-
- <name>flux-examples</name>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>flux-core</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>flux-wrappers</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-hdfs</artifactId>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>commons-beanutils</groupId>
- <artifactId>commons-beanutils-core</artifactId>
- </exclusion>
- <exclusion>
- <groupId>commons-beanutils</groupId>
- <artifactId>commons-beanutils</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.hadoop</groupId>
- <artifactId>hadoop-yarn-api</artifactId>
- </exclusion>
- <exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- </exclusion>
- <exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-hbase</artifactId>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>servlet-api-2.5</artifactId>
- </exclusion>
- <exclusion>
- <groupId>commons-collections</groupId>
- <artifactId>commons-collections</artifactId>
- </exclusion>
- <exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-kafka</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.kafka</groupId>
- <artifactId>${storm.kafka.artifact.id}</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <configuration>
- <createDependencyReducedPom>true</createDependencyReducedPom>
- <filters>
- <filter>
- <artifact>*:*</artifact>
- <excludes>
- <exclude>META-INF/*.SF</exclude>
- <exclude>META-INF/*.sf</exclude>
- <exclude>META-INF/*.DSA</exclude>
- <exclude>META-INF/*.dsa</exclude>
- <exclude>META-INF/*.RSA</exclude>
- <exclude>META-INF/*.rsa</exclude>
- <exclude>META-INF/*.EC</exclude>
- <exclude>META-INF/*.ec</exclude>
- <exclude>META-INF/MSFTSIG.SF</exclude>
- <exclude>META-INF/MSFTSIG.RSA</exclude>
- </excludes>
- </filter>
- </filters>
- </configuration>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
- <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
- <mainClass>org.apache.storm.flux.Flux</mainClass>
- </transformer>
- </transformers>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/StatefulWordCounter.java
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/StatefulWordCounter.java b/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/StatefulWordCounter.java
deleted file mode 100644
index 5534888..0000000
--- a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/StatefulWordCounter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.flux.examples;
-
-import org.apache.storm.state.KeyValueState;
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.base.BaseStatefulBolt;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-import org.apache.storm.tuple.Values;
-
-import java.util.Map;
-
-public class StatefulWordCounter extends BaseStatefulBolt<KeyValueState<String, Long>> {
-
- private KeyValueState<String, Long> wordCounts;
- private OutputCollector collector;
-
- @SuppressWarnings("rawtypes")
- @Override
- public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
- this.collector = collector;
- }
-
- @Override
- public void initState(KeyValueState<String, Long> state) {
- wordCounts = state;
- }
-
- @Override
- public void execute(Tuple tuple) {
- String word = tuple.getString(0);
-
- Long count = wordCounts.get(word, 0L);
- count++;
- wordCounts.put(word, count);
-
- collector.emit(tuple, new Values(word, count));
- collector.ack(tuple);
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields("word", "count"));
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/TestPrintBolt.java
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/TestPrintBolt.java b/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/TestPrintBolt.java
deleted file mode 100644
index 137e354..0000000
--- a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/TestPrintBolt.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.flux.examples;
-
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseBasicBolt;
-import org.apache.storm.tuple.Tuple;
-
-/**
- * Prints the tuples to stdout
- */
-public class TestPrintBolt extends BaseBasicBolt {
-
- @Override
- public void execute(Tuple tuple, BasicOutputCollector collector) {
- System.out.println(tuple);
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer ofd) {
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/TestWindowBolt.java
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/TestWindowBolt.java b/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/TestWindowBolt.java
deleted file mode 100644
index 8c904d9..0000000
--- a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/TestWindowBolt.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.flux.examples;
-
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseWindowedBolt;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-import org.apache.storm.windowing.TupleWindow;
-
-import java.util.Map;
-
-public class TestWindowBolt extends BaseWindowedBolt {
- private OutputCollector collector;
-
- @Override
- public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
- this.collector = collector;
- }
-
- @Override
- public void execute(TupleWindow inputWindow) {
- collector.emit(new Values(inputWindow.get().size()));
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields("count"));
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCountClient.java
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCountClient.java b/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCountClient.java
deleted file mode 100644
index eb4fb7a..0000000
--- a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCountClient.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.flux.examples;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseConfiguration;
-import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.HTable;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.util.Bytes;
-
-import java.io.FileInputStream;
-import java.util.Properties;
-
-/**
- * Connects to the 'WordCount' HBase table and prints counts for each word.
- *
- * Assumes you have run (or are running) the YAML topology definition in
- * <code>simple_hbase.yaml</code>
- *
- * You will also need to modify `src/main/resources/hbase-site.xml`
- * to point to your HBase instance, and then repackage with `mvn package`.
- * This is a known issue.
- *
- */
-public class WordCountClient {
-
- public static void main(String[] args) throws Exception {
- Configuration config = HBaseConfiguration.create();
- if(args.length == 1){
- Properties props = new Properties();
- props.load(new FileInputStream(args[0]));
- System.out.println("HBase configuration:");
- for(Object key : props.keySet()) {
- System.out.println(key + "=" + props.get(key));
- config.set((String)key, props.getProperty((String)key));
- }
- } else {
- System.out.println("Usage: WordCountClient <hbase_config.properties>");
- System.exit(1);
- }
-
- HTable table = new HTable(config, "WordCount");
- String[] words = new String[] {"nathan", "mike", "jackson", "golda", "bertels"};
-
- for (String word : words) {
- Get get = new Get(Bytes.toBytes(word));
- Result result = table.get(get);
-
- byte[] countBytes = result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("count"));
- byte[] wordBytes = result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("word"));
-
- String wordStr = Bytes.toString(wordBytes);
- long count = Bytes.toLong(countBytes);
- System.out.println("Word: '" + wordStr + "', Count: " + count);
- }
-
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCounter.java
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCounter.java b/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCounter.java
deleted file mode 100644
index 7093105..0000000
--- a/external/flux/flux-examples/src/main/java/org/apache/storm/flux/examples/WordCounter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.flux.examples;
-
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.IBasicBolt;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseBasicBolt;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Map;
-
-import static org.apache.storm.utils.Utils.tuple;
-
-/**
- * This bolt is used by the HBase example. It simply emits the first field
- * found in the incoming tuple as "word", with a "count" of `1`.
- *
- * In this case, the downstream HBase bolt handles the counting, so a value
- * of `1` will just increment the HBase counter by one.
- */
-public class WordCounter extends BaseBasicBolt {
- private static final Logger LOG = LoggerFactory.getLogger(WordCounter.class);
-
-
-
- @SuppressWarnings("rawtypes")
- public void prepare(Map stormConf, TopologyContext context) {
- }
-
- /*
- * Just output the word value with a count of 1.
- * The HBaseBolt will handle incrementing the counter.
- */
- public void execute(Tuple input, BasicOutputCollector collector) {
- collector.emit(tuple(input.getValues().get(0), 1));
- }
-
- public void cleanup() {
-
- }
-
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields("word", "count"));
- }
-
- @Override
- public Map<String, Object> getComponentConfiguration() {
- return null;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/hbase_bolt.properties
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/hbase_bolt.properties b/external/flux/flux-examples/src/main/resources/hbase_bolt.properties
deleted file mode 100644
index f8ed50c..0000000
--- a/external/flux/flux-examples/src/main/resources/hbase_bolt.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-hbase.rootdir=hdfs://hadoop:54310/hbase
-hbase.zookeeper.quorum=hadoop
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/hdfs_bolt.properties
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/hdfs_bolt.properties b/external/flux/flux-examples/src/main/resources/hdfs_bolt.properties
deleted file mode 100644
index 7bcbe7a..0000000
--- a/external/flux/flux-examples/src/main/resources/hdfs_bolt.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-# The HDFS url
-hdfs.url=hdfs://hadoop:54310
-
-# The HDFS directory where the bolt will write incoming data
-hdfs.write.dir=/incoming
-
-# The HDFS directory where files will be moved once the bolt has
-# finished writing to it.
-hdfs.dest.dir=/complete
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/kafka_spout.yaml
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/kafka_spout.yaml b/external/flux/flux-examples/src/main/resources/kafka_spout.yaml
deleted file mode 100644
index 7533ce4..0000000
--- a/external/flux/flux-examples/src/main/resources/kafka_spout.yaml
+++ /dev/null
@@ -1,136 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-# Test ability to wire together shell spouts/bolts
----
-
-# topology definition
-# name to be used when submitting
-name: "kafka-topology"
-
-# Components
-# Components are analagous to Spring beans. They are meant to be used as constructor,
-# property(setter), and builder arguments.
-#
-# for the time being, components must be declared in the order they are referenced
-components:
- - id: "stringScheme"
- className: "org.apache.storm.kafka.StringScheme"
-
- - id: "stringMultiScheme"
- className: "org.apache.storm.spout.SchemeAsMultiScheme"
- constructorArgs:
- - ref: "stringScheme"
-
- - id: "zkHosts"
- className: "org.apache.storm.kafka.ZkHosts"
- constructorArgs:
- - "localhost:2181"
-
-# Alternative kafka config
-# - id: "kafkaConfig"
-# className: "org.apache.storm.kafka.KafkaConfig"
-# constructorArgs:
-# # brokerHosts
-# - ref: "zkHosts"
-# # topic
-# - "myKafkaTopic"
-# # clientId (optional)
-# - "myKafkaClientId"
-
- - id: "spoutConfig"
- className: "org.apache.storm.kafka.SpoutConfig"
- constructorArgs:
- # brokerHosts
- - ref: "zkHosts"
- # topic
- - "myKafkaTopic"
- # zkRoot
- - "/kafkaSpout"
- # id
- - "myId"
- properties:
- - name: "ignoreZkOffsets"
- value: true
- - name: "scheme"
- ref: "stringMultiScheme"
-
-
-
-# NOTE: We may want to consider some level of spring integration. For example, allowing component references
-# to a spring `ApplicationContext`.
-
-# topology configuration
-# this will be passed to the submitter as a map of config options
-#
-config:
- topology.workers: 1
- # ...
-
-# spout definitions
-spouts:
- - id: "kafka-spout"
- className: "org.apache.storm.kafka.KafkaSpout"
- constructorArgs:
- - ref: "spoutConfig"
-
-# bolt definitions
-bolts:
- - id: "splitsentence"
- className: "org.apache.storm.flux.wrappers.bolts.FluxShellBolt"
- constructorArgs:
- # command line
- - ["python", "splitsentence.py"]
- # output fields
- - ["word"]
- parallelism: 1
- # ...
-
- - id: "log"
- className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
- parallelism: 1
- # ...
-
- - id: "count"
- className: "org.apache.storm.testing.TestWordCounter"
- parallelism: 1
- # ...
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-# custom stream groupings are also supported
-
-streams:
- - name: "kafka --> split" # name isn't used (placeholder for logging, UI, etc.)
- from: "kafka-spout"
- to: "splitsentence"
- grouping:
- type: SHUFFLE
-
- - name: "split --> count"
- from: "splitsentence"
- to: "count"
- grouping:
- type: FIELDS
- args: ["word"]
-
- - name: "count --> log"
- from: "count"
- to: "log"
- grouping:
- type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/multilang.yaml
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/multilang.yaml b/external/flux/flux-examples/src/main/resources/multilang.yaml
deleted file mode 100644
index aaab5d3..0000000
--- a/external/flux/flux-examples/src/main/resources/multilang.yaml
+++ /dev/null
@@ -1,89 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Test ability to wire together shell spouts/bolts
----
-
-# topology definition
-# name to be used when submitting
-name: "shell-topology"
-
-# topology configuration
-# this will be passed to the submitter as a map of config options
-#
-config:
- topology.workers: 1
- # ...
-
-# spout definitions
-spouts:
- - id: "sentence-spout"
- className: "org.apache.storm.flux.wrappers.spouts.FluxShellSpout"
- # shell spout constructor takes 2 arguments: String[], String[]
- constructorArgs:
- # command line
- - ["node", "randomsentence.js"]
- # output fields
- - ["word"]
- parallelism: 1
- # ...
-
-# bolt definitions
-bolts:
- - id: "splitsentence"
- className: "org.apache.storm.flux.wrappers.bolts.FluxShellBolt"
- constructorArgs:
- # command line
- - ["python", "splitsentence.py"]
- # output fields
- - ["word"]
- parallelism: 1
- # ...
-
- - id: "log"
- className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
- parallelism: 1
- # ...
-
- - id: "count"
- className: "org.apache.storm.testing.TestWordCounter"
- parallelism: 1
- # ...
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-# custom stream groupings are also supported
-
-streams:
- - name: "spout --> split" # name isn't used (placeholder for logging, UI, etc.)
- from: "sentence-spout"
- to: "splitsentence"
- grouping:
- type: SHUFFLE
-
- - name: "split --> count"
- from: "splitsentence"
- to: "count"
- grouping:
- type: FIELDS
- args: ["word"]
-
- - name: "count --> log"
- from: "count"
- to: "log"
- grouping:
- type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/simple_hbase.yaml
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/simple_hbase.yaml b/external/flux/flux-examples/src/main/resources/simple_hbase.yaml
deleted file mode 100644
index 93a2781..0000000
--- a/external/flux/flux-examples/src/main/resources/simple_hbase.yaml
+++ /dev/null
@@ -1,92 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
----
-# NOTE: To use this example, you will need to modify `src/main/resources/hbase-site.xml`
-# to point to your HBase instance, and then repackage with `mvn package`.
-# This is a known issue.
-
-# topology definition
-# name to be used when submitting
-name: "hbase-persistent-wordcount"
-
-# Components
-components:
- - id: "columnFields"
- className: "org.apache.storm.tuple.Fields"
- constructorArgs:
- - ["word"]
-
- - id: "counterFields"
- className: "org.apache.storm.tuple.Fields"
- constructorArgs:
- - ["count"]
-
- - id: "mapper"
- className: "org.apache.storm.hbase.bolt.mapper.SimpleHBaseMapper"
- configMethods:
- - name: "withRowKeyField"
- args: ["word"]
- - name: "withColumnFields"
- args: [ref: "columnFields"]
- - name: "withCounterFields"
- args: [ref: "counterFields"]
- - name: "withColumnFamily"
- args: ["cf"]
-
-# topology configuration
-# this will be passed to the submitter as a map of config options
-config:
- topology.workers: 1
- hbase.conf:
- hbase.rootdir: "${hbase.rootdir}"
- hbase.zookeeper.quorum: "${hbase.zookeeper.quorum}"
-
-# spout definitions
-spouts:
- - id: "word-spout"
- className: "org.apache.storm.testing.TestWordSpout"
- parallelism: 1
-
-# bolt definitions
-
-bolts:
- - id: "count-bolt"
- className: "org.apache.storm.flux.examples.WordCounter"
- parallelism: 1
-
- - id: "hbase-bolt"
- className: "org.apache.storm.hbase.bolt.HBaseBolt"
- constructorArgs:
- - "WordCount" # HBase table name
- - ref: "mapper"
- configMethods:
- - name: "withConfigKey"
- args: ["hbase.conf"]
- parallelism: 1
-
-streams:
- - name: "" # name isn't used (placeholder for logging, UI, etc.)
- from: "word-spout"
- to: "count-bolt"
- grouping:
- type: SHUFFLE
-
- - name: "" # name isn't used (placeholder for logging, UI, etc.)
- from: "count-bolt"
- to: "hbase-bolt"
- grouping:
- type: FIELDS
- args: ["word"]
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/simple_hdfs.yaml
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/simple_hdfs.yaml b/external/flux/flux-examples/src/main/resources/simple_hdfs.yaml
deleted file mode 100644
index b8d4020..0000000
--- a/external/flux/flux-examples/src/main/resources/simple_hdfs.yaml
+++ /dev/null
@@ -1,105 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Test ability to wire together shell spouts/bolts
----
-
-# topology definition
-# name to be used when submitting
-name: "hdfs-topology"
-
-# Components
-# Components are analagous to Spring beans. They are meant to be used as constructor,
-# property(setter), and builder arguments.
-#
-# for the time being, components must be declared in the order they are referenced
-components:
- - id: "syncPolicy"
- className: "org.apache.storm.hdfs.bolt.sync.CountSyncPolicy"
- constructorArgs:
- - 1000
- - id: "rotationPolicy"
- className: "org.apache.storm.hdfs.bolt.rotation.TimedRotationPolicy"
- constructorArgs:
- - 30
- - SECONDS
-
- - id: "fileNameFormat"
- className: "org.apache.storm.hdfs.bolt.format.DefaultFileNameFormat"
- configMethods:
- - name: "withPath"
- args: ["${hdfs.write.dir}"]
- - name: "withExtension"
- args: [".txt"]
-
- - id: "recordFormat"
- className: "org.apache.storm.hdfs.bolt.format.DelimitedRecordFormat"
- configMethods:
- - name: "withFieldDelimiter"
- args: ["|"]
-
- - id: "rotationAction"
- className: "org.apache.storm.hdfs.common.rotation.MoveFileAction"
- configMethods:
- - name: "toDestination"
- args: ["${hdfs.dest.dir}"]
-
-# spout definitions
-spouts:
- - id: "spout-1"
- className: "org.apache.storm.testing.TestWordSpout"
- parallelism: 1
- # ...
-
-# bolt definitions
-
-bolts:
- - id: "bolt-1"
- className: "org.apache.storm.hdfs.bolt.HdfsBolt"
- configMethods:
- - name: "withConfigKey"
- args: ["hdfs.config"]
- - name: "withFsUrl"
- args: ["${hdfs.url}"]
- - name: "withFileNameFormat"
- args: [ref: "fileNameFormat"]
- - name: "withRecordFormat"
- args: [ref: "recordFormat"]
- - name: "withRotationPolicy"
- args: [ref: "rotationPolicy"]
- - name: "withSyncPolicy"
- args: [ref: "syncPolicy"]
- - name: "addRotationAction"
- args: [ref: "rotationAction"]
- parallelism: 1
- # ...
-
- - id: "bolt-2"
- className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
- parallelism: 1
-
-streams:
- - name: "" # name isn't used (placeholder for logging, UI, etc.)
- from: "spout-1"
- to: "bolt-1"
- grouping:
- type: SHUFFLE
-
- - name: "" # name isn't used (placeholder for logging, UI, etc.)
- from: "spout-1"
- to: "bolt-2"
- grouping:
- type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/simple_stateful_wordcount.yaml
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/simple_stateful_wordcount.yaml b/external/flux/flux-examples/src/main/resources/simple_stateful_wordcount.yaml
deleted file mode 100644
index 14b9b3a..0000000
--- a/external/flux/flux-examples/src/main/resources/simple_stateful_wordcount.yaml
+++ /dev/null
@@ -1,60 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-
-# topology definition
-# name to be used when submitting
-name: "stateful-wordcount-topology"
-
-# topology configuration
-# this will be passed to the submitter as a map of config options
-#
-config:
- topology.workers: 1
-
-# spout definitions
-spouts:
- - id: "spout-1"
- className: "org.apache.storm.testing.TestWordSpout"
- parallelism: 1
-
-# bolt definitions
-bolts:
- - id: "bolt-1"
- className: "org.apache.storm.flux.examples.StatefulWordCounter"
- parallelism: 1
-
- - id: "bolt-2"
- className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
- parallelism: 1
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-streams:
- - name: "spout-1 --> bolt-1" # name isn't used (placeholder for logging, UI, etc.)
- from: "spout-1"
- to: "bolt-1"
- grouping:
- type: FIELDS
- args: ["word"]
-
- - name: "bolt-1 --> bolt2"
- from: "bolt-1"
- to: "bolt-2"
- grouping:
- type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/simple_windowing.yaml
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/simple_windowing.yaml b/external/flux/flux-examples/src/main/resources/simple_windowing.yaml
deleted file mode 100755
index f2f74ff..0000000
--- a/external/flux/flux-examples/src/main/resources/simple_windowing.yaml
+++ /dev/null
@@ -1,69 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-
-name: "sliding-window-topology"
-
-components:
- - id: "windowLength"
- className: "org.apache.storm.topology.base.BaseWindowedBolt$Count"
- constructorArgs:
- - 5
- - id: "slidingInterval"
- className: "org.apache.storm.topology.base.BaseWindowedBolt$Count"
- constructorArgs:
- - 3
-
-config:
- topology.workers: 1
-
-# spout definitions
-spouts:
- - id: "spout-1"
- className: "org.apache.storm.testing.TestWordSpout"
- parallelism: 1
-
-# bolt definitions
-bolts:
- - id: "bolt-1"
- className: "org.apache.storm.flux.examples.TestWindowBolt"
- configMethods:
- - name: "withWindow"
- args: [ref: "windowLength", ref: "slidingInterval"]
- parallelism: 1
- - id: "bolt-2"
- className: "org.apache.storm.flux.examples.TestPrintBolt"
- parallelism: 1
-
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-streams:
- - name: "spout-1 --> bolt-1" # name isn't used (placeholder for logging, UI, etc.)
-# id: "connection-1"
- from: "spout-1"
- to: "bolt-1"
- grouping:
- type: FIELDS
- args: ["word"]
- - name: "bolt-1 --> bolt-2" # name isn't used (placeholder for logging, UI, etc.)
-# id: "connection-1"
- from: "bolt-1"
- to: "bolt-2"
- grouping:
- type: SHUFFLE
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/flux-examples/src/main/resources/simple_wordcount.yaml
----------------------------------------------------------------------
diff --git a/external/flux/flux-examples/src/main/resources/simple_wordcount.yaml b/external/flux/flux-examples/src/main/resources/simple_wordcount.yaml
deleted file mode 100644
index 6443a97..0000000
--- a/external/flux/flux-examples/src/main/resources/simple_wordcount.yaml
+++ /dev/null
@@ -1,68 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-
-# topology definition
-# name to be used when submitting
-name: "yaml-topology"
-
-# topology configuration
-# this will be passed to the submitter as a map of config options
-#
-config:
- topology.workers: 1
-
-# spout definitions
-spouts:
- - id: "spout-1"
- className: "org.apache.storm.testing.TestWordSpout"
- parallelism: 1
-
-# bolt definitions
-bolts:
- - id: "bolt-1"
- className: "org.apache.storm.testing.TestWordCounter"
- parallelism: 1
-
- - id: "bolt-2"
- className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
- parallelism: 1
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-streams:
- - name: "spout-1 --> bolt-1" # name isn't used (placeholder for logging, UI, etc.)
-# id: "connection-1"
- from: "spout-1"
- to: "bolt-1"
- grouping:
- type: FIELDS
- args: ["word"]
-
- - name: "bolt-1 --> bolt2"
- from: "bolt-1"
- to: "bolt-2"
- grouping:
- type: SHUFFLE
-
-
-
-
-
-
-
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/flux/pom.xml
----------------------------------------------------------------------
diff --git a/external/flux/pom.xml b/external/flux/pom.xml
index b51a505..45a7afb 100644
--- a/external/flux/pom.xml
+++ b/external/flux/pom.xml
@@ -38,30 +38,9 @@
</developer>
</developers>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <!-- see comment below... This fixes an annoyance with intellij -->
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <!--
- Hack to make intellij behave.
- If you use intellij, enable this profile in your IDE.
- It should make life easier.
- -->
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<modules>
<module>flux-wrappers</module>
<module>flux-core</module>
- <module>flux-examples</module>
</modules>
<dependencies>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/sql/storm-sql-core/pom.xml
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-core/pom.xml b/external/sql/storm-sql-core/pom.xml
index 776a54c..79b109f 100644
--- a/external/sql/storm-sql-core/pom.xml
+++ b/external/sql/storm-sql-core/pom.xml
@@ -40,13 +40,13 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-sql-runtime</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/sql/storm-sql-external/storm-sql-hdfs/pom.xml
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-external/storm-sql-hdfs/pom.xml b/external/sql/storm-sql-external/storm-sql-hdfs/pom.xml
index 9e0a599..69f214a 100644
--- a/external/sql/storm-sql-external/storm-sql-hdfs/pom.xml
+++ b/external/sql/storm-sql-external/storm-sql-hdfs/pom.xml
@@ -40,7 +40,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
<exclusions>
<!--log4j-over-slf4j must be excluded for hadoop-minicluster
see: http://stackoverflow.com/q/20469026/3542091 -->
@@ -54,7 +54,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-sql-runtime</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
@@ -67,7 +67,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-hdfs</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/sql/storm-sql-external/storm-sql-kafka/pom.xml
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-external/storm-sql-kafka/pom.xml b/external/sql/storm-sql-external/storm-sql-kafka/pom.xml
index a7bdf7a..10e2b09 100644
--- a/external/sql/storm-sql-external/storm-sql-kafka/pom.xml
+++ b/external/sql/storm-sql-external/storm-sql-kafka/pom.xml
@@ -40,13 +40,13 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-sql-runtime</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
@@ -59,7 +59,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-kafka</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/sql/storm-sql-external/storm-sql-mongodb/pom.xml
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-external/storm-sql-mongodb/pom.xml b/external/sql/storm-sql-external/storm-sql-mongodb/pom.xml
index 40fde8a..6d15803 100644
--- a/external/sql/storm-sql-external/storm-sql-mongodb/pom.xml
+++ b/external/sql/storm-sql-external/storm-sql-mongodb/pom.xml
@@ -40,13 +40,13 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-sql-runtime</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
@@ -59,7 +59,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-mongodb</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/sql/storm-sql-external/storm-sql-redis/pom.xml
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-external/storm-sql-redis/pom.xml b/external/sql/storm-sql-external/storm-sql-redis/pom.xml
index 19cc699..5997376 100644
--- a/external/sql/storm-sql-external/storm-sql-redis/pom.xml
+++ b/external/sql/storm-sql-external/storm-sql-redis/pom.xml
@@ -32,13 +32,13 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-sql-runtime</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
@@ -51,7 +51,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-redis</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/sql/storm-sql-runtime/pom.xml
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-runtime/pom.xml b/external/sql/storm-sql-runtime/pom.xml
index 4666df4..08a776c 100644
--- a/external/sql/storm-sql-runtime/pom.xml
+++ b/external/sql/storm-sql-runtime/pom.xml
@@ -40,7 +40,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.calcite</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-cassandra/pom.xml b/external/storm-cassandra/pom.xml
index 0eff9f6..d912ecc 100644
--- a/external/storm-cassandra/pom.xml
+++ b/external/storm-cassandra/pom.xml
@@ -73,7 +73,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-druid/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-druid/pom.xml b/external/storm-druid/pom.xml
index d1949a4..3f9601c 100644
--- a/external/storm-druid/pom.xml
+++ b/external/storm-druid/pom.xml
@@ -34,7 +34,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>io.druid</groupId>
@@ -90,44 +90,4 @@
<scope>test</scope>
</dependency>
</dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <filters>
- <filter>
- <artifact>*:*</artifact>
- <excludes>
- <exclude>META-INF/*.SF</exclude>
- <exclude>META-INF/*.DSA</exclude>
- <exclude>META-INF/*.RSA</exclude>
- </excludes>
- </filter>
- </filters>
- <relocations>
- <relocation>
- <pattern>com.fasterxml.jackson</pattern>
- <shadedPattern>org.apache.storm.druid.bolt.com.fasterxml.jackson</shadedPattern>
- </relocation>
- <relocation>
- <pattern>org.jboss.netty</pattern>
- <shadedPattern>org.apache.storm.druid.bolt.org.jboss.netty</shadedPattern>
- </relocation>
- </relocations>
- <createDependencyReducedPom>true</createDependencyReducedPom>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-elasticsearch/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-elasticsearch/pom.xml b/external/storm-elasticsearch/pom.xml
index 09d4794..c676179 100644
--- a/external/storm-elasticsearch/pom.xml
+++ b/external/storm-elasticsearch/pom.xml
@@ -50,7 +50,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-eventhubs/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-eventhubs/pom.xml b/external/storm-eventhubs/pom.xml
index 21738a5..05d8c3b 100755
--- a/external/storm-eventhubs/pom.xml
+++ b/external/storm-eventhubs/pom.xml
@@ -17,75 +17,37 @@
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
-
+
<parent>
<artifactId>storm</artifactId>
<groupId>org.apache.storm</groupId>
<version>2.0.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
-
+
<artifactId>storm-eventhubs</artifactId>
- <version>2.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>storm-eventhubs</name>
<description>EventHubs Storm Spout</description>
-
+
<build>
<plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>shade</goal>
- </goals>
- <phase>package</phase>
- </execution>
- </executions>
- <configuration>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
- </transformer>
- </transformers>
- <outputFile>target/${project.artifactId}-${project.version}-jar-with-dependencies.jar</outputFile>
- <createDependencyReducedPom>true</createDependencyReducedPom>
- <filters>
- <filter>
- <artifact>*:*</artifact>
- <excludes>
- <exclude>META-INF/*.SF</exclude>
- <exclude>META-INF/*.sf</exclude>
- <exclude>META-INF/*.DSA</exclude>
- <exclude>META-INF/*.dsa</exclude>
- <exclude>META-INF/*.RSA</exclude>
- <exclude>META-INF/*.rsa</exclude>
- <exclude>META-INF/*.EC</exclude>
- <exclude>META-INF/*.ec</exclude>
- <exclude>META-INF/MSFTSIG.SF</exclude>
- <exclude>META-INF/MSFTSIG.RSA</exclude>
- </excludes>
- </filter>
- </filters>
- </configuration>
- </plugin>
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
- <execution>
- <phase>package</phase>
- <configuration>
- <tasks>
- <copy file="src/main/resources/config.properties" tofile="target/eventhubs-config.properties" />
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <copy file="src/main/resources/config.properties" tofile="target/eventhubs-config.properties" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
<dependencies>
@@ -100,7 +62,7 @@
<version>${project.version}</version>
<!-- keep storm out of the jar-with-dependencies -->
<type>jar</type>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
@@ -132,5 +94,11 @@
<artifactId>qpid-amqp-1-0-common</artifactId>
<version>${qpid.version}</version>
</dependency>
- </dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-hbase/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-hbase/pom.xml b/external/storm-hbase/pom.xml
index 293961d..3d6aa0c 100644
--- a/external/storm-hbase/pom.xml
+++ b/external/storm-hbase/pom.xml
@@ -46,7 +46,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-hdfs/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-hdfs/pom.xml b/external/storm-hdfs/pom.xml
index aba0da6..281732e 100644
--- a/external/storm-hdfs/pom.xml
+++ b/external/storm-hdfs/pom.xml
@@ -47,7 +47,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
<exclusions>
<!--log4j-over-slf4j must be excluded for hadoop-minicluster
see: http://stackoverflow.com/q/20469026/3542091 -->
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-hive/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-hive/pom.xml b/external/storm-hive/pom.xml
index a564e85..d4d076d 100644
--- a/external/storm-hive/pom.xml
+++ b/external/storm-hive/pom.xml
@@ -42,7 +42,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jdbc/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-jdbc/pom.xml b/external/storm-jdbc/pom.xml
index a8c3de0..1ab2e1c 100644
--- a/external/storm-jdbc/pom.xml
+++ b/external/storm-jdbc/pom.xml
@@ -44,7 +44,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/pom.xml b/external/storm-jms/core/pom.xml
deleted file mode 100644
index 2e435e7..0000000
--- a/external/storm-jms/core/pom.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-jms-parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
-
-
- <artifactId>storm-jms</artifactId>
-
-
-
- <developers>
- <developer>
- <id>ptgoetz</id>
- <name>P. Taylor Goetz</name>
- <email>ptgoetz@gmail.com</email>
- </developer>
- </developers>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-core</artifactId>
- <version>${project.version}</version>
- <!-- keep storm out of the jar-with-dependencies -->
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-jms_1.1_spec</artifactId>
- <version>1.1.1</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.10</version>
- <scope>test</scope>
- </dependency>
-
- <!-- Active MQ -->
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-core</artifactId>
- <version>5.5.1</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </exclusion>
- <exclusion>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
- </dependencies>
-
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <version>2.9</version>
- <configuration>
- <additionalparam>-Xdoclint:none</additionalparam>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsMessageProducer.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsMessageProducer.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsMessageProducer.java
deleted file mode 100644
index 4932929..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsMessageProducer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms;
-
-import java.io.Serializable;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-
-import org.apache.storm.tuple.ITuple;
-
-/**
- * JmsMessageProducer implementations are responsible for translating
- * a <code>org.apache.storm.tuple.Values</code> instance into a
- * <code>javax.jms.Message</code> object.
- * <p>
- */
-public interface JmsMessageProducer extends Serializable {
-
- /**
- * Translate a <code>org.apache.storm.tuple.Tuple</code> object
- * to a <code>javax.jms.Message</code object.
- *
- * @param session
- * @param input
- * @return
- * @throws JMSException
- */
- public Message toMessage(Session session, ITuple input) throws JMSException;
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsProvider.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsProvider.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsProvider.java
deleted file mode 100644
index d976326..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms;
-
-import java.io.Serializable;
-
-import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
-
-/**
- * A <code>JmsProvider</code> object encapsulates the <code>ConnectionFactory</code>
- * and <code>Destination</code> JMS objects the <code>JmsSpout</code> needs to manage
- * a topic/queue connection over the course of it's lifecycle.
- *
- */
-public interface JmsProvider extends Serializable {
- /**
- * Provides the JMS <code>ConnectionFactory</code>
- *
- * @return the connection factory
- * @throws Exception
- */
- public ConnectionFactory connectionFactory() throws Exception;
-
- /**
- * Provides the <code>Destination</code> (topic or queue) from which the
- * <code>JmsSpout</code> will receive messages.
- *
- * @return
- * @throws Exception
- */
- public Destination destination() throws Exception;
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsTupleProducer.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsTupleProducer.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsTupleProducer.java
deleted file mode 100644
index 0bbb3a0..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/JmsTupleProducer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms;
-
-import java.io.Serializable;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.tuple.Values;
-
-/**
- * Interface to define classes that can produce a Storm <code>Values</code> objects
- * from a <code>javax.jms.Message</code> object>.
- * <p>
- * Implementations are also responsible for declaring the output
- * fields they produce.
- * <p>
- * If for some reason the implementation can't process a message
- * (for example if it received a <code>javax.jms.ObjectMessage</code>
- * when it was expecting a <code>javax.jms.TextMessage</code> it should
- * return <code>null</code> to indicate to the <code>JmsSpout</code> that
- * the message could not be processed.
- *
- */
-public interface JmsTupleProducer extends Serializable {
- /**
- * Process a JMS message object to create a Values object.
- *
- * @param msg - the JMS message
- * @return the Values tuple, or null if the message couldn't be processed.
- * @throws JMSException
- */
- Values toTuple(Message msg) throws JMSException;
-
- /**
- * Declare the output fields produced by this JmsTupleProducer.
- *
- * @param declarer The OuputFieldsDeclarer for the spout.
- */
- void declareOutputFields(OutputFieldsDeclarer declarer);
-}
[02/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/java/org/apache/storm/perf/utils/MetricsSample.java
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/java/org/apache/storm/perf/utils/MetricsSample.java b/storm-perf/src/main/java/org/apache/storm/perf/utils/MetricsSample.java
deleted file mode 100755
index a934120..0000000
--- a/storm-perf/src/main/java/org/apache/storm/perf/utils/MetricsSample.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package org.apache.storm.perf.utils;
-
-import org.apache.storm.LocalCluster;
-import org.apache.storm.generated.ClusterSummary;
-import org.apache.storm.generated.ExecutorSpecificStats;
-import org.apache.storm.generated.ExecutorStats;
-import org.apache.storm.generated.ExecutorSummary;
-import org.apache.storm.generated.Nimbus;
-import org.apache.storm.generated.SpoutStats;
-import org.apache.storm.generated.TopologyInfo;
-import org.apache.storm.generated.TopologySummary;
-import org.apache.storm.utils.Utils;
-
-import java.util.List;
-import java.util.Map;
-
-public class MetricsSample {
-
- private long sampleTime = -1;
- private long totalTransferred = 0l;
- private long totalEmitted = 0l;
- private long totalAcked = 0l;
- private long totalFailed = 0l;
-
- private double totalLatency;
-
- private long spoutEmitted = 0l;
- private long spoutTransferred = 0l;
- private int spoutExecutors = 0;
-
- private int numSupervisors = 0;
- private int numWorkers = 0;
- private int numTasks = 0;
- private int numExecutors = 0;
-
- private int totalSlots = 0;
- private int usedSlots = 0;
-
- public static MetricsSample factory(Nimbus.Client client, String topologyName) throws Exception {
- // "************ Sampling Metrics *****************
-
- ClusterSummary clusterSummary = client.getClusterInfo();
- // get topology info
- TopologySummary topSummary = getTopologySummary(clusterSummary, topologyName);
- int topologyExecutors = topSummary.get_num_executors();
- int topologyWorkers = topSummary.get_num_workers();
- int topologyTasks = topSummary.get_num_tasks();
- TopologyInfo topInfo = client.getTopologyInfo(topSummary.get_id());
-
- MetricsSample sample = getMetricsSample( topInfo);
- sample.numWorkers = topologyWorkers;
- sample.numExecutors = topologyExecutors;
- sample.numTasks = topologyTasks;
- return sample;
- }
-
- public static MetricsSample factory(LocalCluster localCluster, String topologyName) throws Exception {
- TopologyInfo topologyInfo = localCluster.getTopologyInfo(topologyName);;
- return getMetricsSample(topologyInfo);
- }
-
-
- private static MetricsSample getMetricsSample(TopologyInfo topInfo) {
- List<ExecutorSummary> executorSummaries = topInfo.get_executors();
-
- // totals
- long totalTransferred = 0l;
- long totalEmitted = 0l;
- long totalAcked = 0l;
- long totalFailed = 0l;
-
- // number of spout executors
- int spoutExecCount = 0;
- double spoutLatencySum = 0.0;
-
- long spoutEmitted = 0l;
- long spoutTransferred = 0l;
-
- // Executor summaries
- for(ExecutorSummary executorSummary : executorSummaries){
- ExecutorStats execuatorStats = executorSummary.get_stats();
- if(execuatorStats == null){
- continue;
- }
-
- ExecutorSpecificStats executorSpecificStats = execuatorStats.get_specific();
- if(executorSpecificStats == null){
- // bail out
- continue;
- }
-
- // transferred totals
- Map<String,Map<String,Long>> transferred = execuatorStats.get_transferred();
- Map<String, Long> txMap = transferred.get(":all-time");
- if(txMap == null){
- continue;
- }
- for(String key : txMap.keySet()){
- // todo, ignore the master batch coordinator ?
- if(!Utils.isSystemId(key)){
- Long count = txMap.get(key);
- totalTransferred += count;
- if(executorSpecificStats.is_set_spout()){
- spoutTransferred += count;
- }
- }
- }
-
- // we found a spout
- if(executorSpecificStats.isSet(2)) { // spout
-
- SpoutStats spoutStats = executorSpecificStats.get_spout();
- Map<String, Long> acked = spoutStats.get_acked().get(":all-time");
- if(acked != null){
- for(String key : acked.keySet()) {
- totalAcked += acked.get(key);
- }
- }
-
- Map<String, Long> failed = spoutStats.get_failed().get(":all-time");
- if(failed != null){
- for(String key : failed.keySet()) {
- totalFailed += failed.get(key);
- }
- }
-
- Double total = 0d;
- Map<String, Double> vals = spoutStats.get_complete_ms_avg().get(":all-time");
- for(String key : vals.keySet()){
- total += vals.get(key);
- }
- Double latency = total / vals.size();
-
- spoutExecCount++;
- spoutLatencySum += latency;
- }
-
-
- } // end executor summary
-
- MetricsSample ret = new MetricsSample();
- ret.totalEmitted = totalEmitted;
- ret.totalTransferred = totalTransferred;
- ret.totalAcked = totalAcked;
- ret.totalFailed = totalFailed;
- ret.totalLatency = spoutLatencySum/spoutExecCount;
- ret.spoutEmitted = spoutEmitted;
- ret.spoutTransferred = spoutTransferred;
- ret.sampleTime = System.currentTimeMillis();
-// ret.numSupervisors = clusterSummary.get_supervisors_size();
- ret.numWorkers = 0;
- ret.numExecutors = 0;
- ret.numTasks = 0;
- ret.spoutExecutors = spoutExecCount;
- return ret;
- }
-
- public static TopologySummary getTopologySummary(ClusterSummary cs, String name) {
- for (TopologySummary ts : cs.get_topologies()) {
- if (name.equals(ts.get_name())) {
- return ts;
- }
- }
- return null;
- }
-
-
-
- // getters
- public long getSampleTime() {
- return sampleTime;
- }
-
- public long getTotalTransferred() {
- return totalTransferred;
- }
-
- public long getTotalEmitted() {
- return totalEmitted;
- }
-
- public long getTotalAcked() {
- return totalAcked;
- }
-
- public long getTotalFailed() {
- return totalFailed;
- }
-
- public double getTotalLatency() {
- return totalLatency;
- }
-
- public long getSpoutEmitted() {
- return spoutEmitted;
- }
-
- public long getSpoutTransferred() {
- return spoutTransferred;
- }
-
- public int getNumSupervisors() {
- return numSupervisors;
- }
-
- public int getNumWorkers() {
- return numWorkers;
- }
-
- public int getNumTasks() {
- return numTasks;
- }
-
- public int getTotalSlots() {
- return totalSlots;
- }
-
- public int getSpoutExecutors(){
- return this.spoutExecutors;
- }
-
- public int getNumExecutors() {
- return this.numExecutors;
- }
-
- public int getUsedSlots() {
- return this.usedSlots;
- }
-
-}
\ No newline at end of file
[05/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/pom.xml b/external/storm-mqtt/core/pom.xml
deleted file mode 100644
index dbb0396..0000000
--- a/external/storm-mqtt/core/pom.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>storm-mqtt</artifactId>
- <packaging>jar</packaging>
-
- <name>storm-mqtt</name>
-
- <parent>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-mqtt-parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
-
-
-
- <repositories>
- <repository>
- <id>bintray</id>
- <url>http://dl.bintray.com/andsel/maven/</url>
- <releases>
- <enabled>true</enabled>
- </releases>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-broker</artifactId>
- <version>5.9.0</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-mqtt</artifactId>
- <version>5.9.0</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-kahadb-store</artifactId>
- <version>5.9.0</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-core</artifactId>
- <version>${project.version}</version>
- <scope>${provided.scope}</scope>
- </dependency>
- <dependency>
- <groupId>org.fusesource.mqtt-client</groupId>
- <artifactId>mqtt-client</artifactId>
- <version>1.10</version>
- </dependency>
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.5</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <forkMode>perTest</forkMode>
- <enableAssertions>false</enableAssertions>
- <redirectTestOutputToFile>true</redirectTestOutputToFile>
- <excludedGroups>${java.unit.test.exclude}</excludedGroups>
- <includes>
- <include>${java.unit.test.include}</include>
- </includes>
- <argLine>-Djava.net.preferIPv4Stack=true -Xmx1536m</argLine>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-failsafe-plugin</artifactId>
- <version>${maven-surefire.version}</version>
- <configuration>
- <forkMode>perTest</forkMode>
- <enableAssertions>false</enableAssertions>
- <redirectTestOutputToFile>true</redirectTestOutputToFile>
- <includes>
- <include>${java.integration.test.include}</include>
- </includes>
- <groups>${java.integration.test.group}</groups> <!--set in integration-test the profile-->
- <argLine>-Djava.net.preferIPv4Stack=true -Xmx1536m</argLine>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>integration-test</goal>
- <goal>verify</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
-</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttLogger.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttLogger.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttLogger.java
deleted file mode 100644
index 3af73fd..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttLogger.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt;
-
-import org.fusesource.mqtt.client.Tracer;
-import org.fusesource.mqtt.codec.MQTTFrame;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Wrapper around SLF4J logger that allows MQTT messages to be logged.
- */
-public class MqttLogger extends Tracer {
- private static final Logger LOG = LoggerFactory.getLogger(MqttLogger.class);
-
- @Override
- public void debug(String message, Object... args) {
- LOG.debug(String.format(message, args));
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttMessage.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttMessage.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttMessage.java
deleted file mode 100644
index 5436dda..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttMessage.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt;
-
-/**
- * Represents an MQTT Message consisting of a topic string (e.g. "/users/ptgoetz/office/thermostat")
- * and a byte array message/payload.
- *
- */
-public class MqttMessage {
- private String topic;
- private byte[] message;
-
-
- public MqttMessage(String topic, byte[] payload){
- this.topic = topic;
- this.message = payload;
- }
- public byte[] getMessage(){
- return this.message;
- }
-
- public String getTopic(){
- return this.topic;
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttMessageMapper.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttMessageMapper.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttMessageMapper.java
deleted file mode 100644
index c6173f4..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttMessageMapper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt;
-
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-
-import java.io.Serializable;
-
-/**
- * Represents an object that can be converted to a Storm Tuple from an AckableMessage,
- * given a MQTT Topic Name and a byte array payload.
- */
-public interface MqttMessageMapper extends Serializable {
- /**
- * Convert a `MqttMessage` to a set of Values that can be emitted as a Storm Tuple.
- *
- * @param message An MQTT Message.
- * @return Values representing a Storm Tuple.
- */
- Values toValues(MqttMessage message);
-
- /**
- * Returns the list of output fields this Mapper produces.
- *
- * @return the list of output fields this mapper produces.
- */
- Fields outputFields();
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttTupleMapper.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttTupleMapper.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttTupleMapper.java
deleted file mode 100644
index c46c069..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/MqttTupleMapper.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt;
-
-
-import org.apache.storm.tuple.ITuple;
-
-import java.io.Serializable;
-
-/**
- * Given a Tuple, converts it to an MQTT message.
- */
-public interface MqttTupleMapper extends Serializable{
-
- /**
- * Converts a Tuple to a MqttMessage
- * @param tuple the incoming tuple
- * @return the message to publish
- */
- MqttMessage toMessage(ITuple tuple);
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/bolt/MqttBolt.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/bolt/MqttBolt.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/bolt/MqttBolt.java
deleted file mode 100644
index f6ca1bf..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/bolt/MqttBolt.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.bolt;
-
-import org.apache.storm.Config;
-import org.apache.storm.mqtt.MqttMessage;
-import org.apache.storm.mqtt.common.MqttOptions;
-import org.apache.storm.mqtt.MqttTupleMapper;
-import org.apache.storm.mqtt.common.MqttPublisher;
-import org.apache.storm.mqtt.common.SslUtils;
-import org.apache.storm.mqtt.ssl.KeyStoreLoader;
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichBolt;
-import org.apache.storm.topology.base.BaseTickTupleAwareRichBolt;
-import org.apache.storm.tuple.Tuple;
-import org.apache.storm.utils.TupleUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Map;
-
-
-public class MqttBolt extends BaseTickTupleAwareRichBolt {
- private static final Logger LOG = LoggerFactory.getLogger(MqttBolt.class);
- private MqttTupleMapper mapper;
- private transient MqttPublisher publisher;
- private boolean retain = false;
- private transient OutputCollector collector;
- private MqttOptions options;
- private KeyStoreLoader keyStoreLoader;
- private transient String topologyName;
-
-
- public MqttBolt(MqttOptions options, MqttTupleMapper mapper){
- this(options, mapper, null, false);
- }
-
- public MqttBolt(MqttOptions options, MqttTupleMapper mapper, boolean retain){
- this(options, mapper, null, retain);
- }
-
- public MqttBolt(MqttOptions options, MqttTupleMapper mapper, KeyStoreLoader keyStoreLoader){
- this(options, mapper, keyStoreLoader, false);
- }
-
- public MqttBolt(MqttOptions options, MqttTupleMapper mapper, KeyStoreLoader keyStoreLoader, boolean retain){
- this.options = options;
- this.mapper = mapper;
- this.retain = retain;
- this.keyStoreLoader = keyStoreLoader;
- // the following code is duplicated in the constructor of MqttPublisher
- // we reproduce it here so we fail on the client side if SSL is misconfigured, rather than when the topology
- // is deployed to the cluster
- SslUtils.checkSslConfig(this.options.getUrl(), keyStoreLoader);
- }
-
- @Override
- public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
- this.collector = collector;
- this.topologyName = (String)conf.get(Config.TOPOLOGY_NAME);
- this.publisher = new MqttPublisher(this.options, this.keyStoreLoader, this.retain);
- try {
- this.publisher.connectMqtt(this.topologyName + "-" + context.getThisComponentId() + "-" + context.getThisTaskId());
- } catch (Exception e) {
- LOG.error("Unable to connect to MQTT Broker.", e);
- throw new RuntimeException("Unable to connect to MQTT Broker.", e);
- }
- }
-
- @Override
- protected void process(Tuple input) {
- MqttMessage message = this.mapper.toMessage(input);
- try {
- this.publisher.publish(message);
- this.collector.ack(input);
- } catch (Exception e) {
- LOG.warn("Error publishing MQTT message. Failing tuple.", e);
- // should we fail the tuple or kill the worker?
- collector.reportError(e);
- collector.fail(input);
- }
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- // this bolt does not emit tuples
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttOptions.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttOptions.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttOptions.java
deleted file mode 100644
index 2b09d6e..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttOptions.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.common;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * MQTT Configuration Options
- */
-public class MqttOptions implements Serializable {
- private String url = "tcp://localhost:1883";
- private List<String> topics = null;
- private boolean cleanConnection = false;
-
- private String willTopic;
- private String willPayload;
- private int willQos = 1;
- private boolean willRetain = false;
-
- private long reconnectDelay = 10;
- private long reconnectDelayMax = 30*1000;
- private double reconnectBackOffMultiplier = 2.0f;
- private long reconnectAttemptsMax = -1;
- private long connectAttemptsMax = -1;
-
- private String userName = "";
- private String password = "";
-
- private int qos = 1;
-
- public String getUrl() {
- return url;
- }
-
- /**
- * Sets the url for connecting to the MQTT broker.
- *
- * Default: `tcp://localhost:1883'
- * @param url
- */
- public void setUrl(String url) {
- this.url = url;
- }
-
- public List<String> getTopics() {
- return topics;
- }
-
- /**
- * A list of MQTT topics to subscribe to.
- *
- * @param topics
- */
- public void setTopics(List<String> topics) {
- this.topics = topics;
- }
-
- public boolean isCleanConnection() {
- return cleanConnection;
- }
-
- /**
- * Set to false if you want the MQTT server to persist topic subscriptions and ack positions across client sessions.
- * Defaults to false.
- *
- * @param cleanConnection
- */
- public void setCleanConnection(boolean cleanConnection) {
- this.cleanConnection = cleanConnection;
- }
-
- public String getWillTopic() {
- return willTopic;
- }
-
- /**
- * If set the server will publish the client's Will message to the specified topics if the client has an unexpected
- * disconnection.
- *
- * @param willTopic
- */
- public void setWillTopic(String willTopic) {
- this.willTopic = willTopic;
- }
-
- public String getWillPayload() {
- return willPayload;
- }
-
- /**
- * The Will message to send. Defaults to a zero length message.
- *
- * @param willPayload
- */
- public void setWillPayload(String willPayload) {
- this.willPayload = willPayload;
- }
-
- public long getReconnectDelay() {
- return reconnectDelay;
- }
-
- /**
- * How long to wait in ms before the first reconnect attempt. Defaults to 10.
- *
- * @param reconnectDelay
- */
- public void setReconnectDelay(long reconnectDelay) {
- this.reconnectDelay = reconnectDelay;
- }
-
- public long getReconnectDelayMax() {
- return reconnectDelayMax;
- }
-
- /**
- * The maximum amount of time in ms to wait between reconnect attempts. Defaults to 30,000.
- *
- * @param reconnectDelayMax
- */
- public void setReconnectDelayMax(long reconnectDelayMax) {
- this.reconnectDelayMax = reconnectDelayMax;
- }
-
- public double getReconnectBackOffMultiplier() {
- return reconnectBackOffMultiplier;
- }
-
- /**
- * The Exponential backoff be used between reconnect attempts. Set to 1 to disable exponential backoff. Defaults to
- * 2.
- *
- * @param reconnectBackOffMultiplier
- */
- public void setReconnectBackOffMultiplier(double reconnectBackOffMultiplier) {
- this.reconnectBackOffMultiplier = reconnectBackOffMultiplier;
- }
-
- public long getReconnectAttemptsMax() {
- return reconnectAttemptsMax;
- }
-
- /**
- * The maximum number of reconnect attempts before an error is reported back to the client after a server
- * connection had previously been established. Set to -1 to use unlimited attempts. Defaults to -1.
- *
- * @param reconnectAttemptsMax
- */
- public void setReconnectAttemptsMax(long reconnectAttemptsMax) {
- this.reconnectAttemptsMax = reconnectAttemptsMax;
- }
-
- public long getConnectAttemptsMax() {
- return connectAttemptsMax;
- }
-
- /**
- * The maximum number of reconnect attempts before an error is reported back to the client on the first attempt by
- * the client to connect to a server. Set to -1 to use unlimited attempts. Defaults to -1.
- *
- * @param connectAttemptsMax
- */
- public void setConnectAttemptsMax(long connectAttemptsMax) {
- this.connectAttemptsMax = connectAttemptsMax;
- }
-
- public String getUserName() {
- return userName;
- }
-
- /**
- * The username for authenticated sessions.
- *
- * @param userName
- */
- public void setUserName(String userName) {
- this.userName = userName;
- }
-
- public String getPassword() {
- return password;
- }
-
- /**
- * The password for authenticated sessions.
- * @param password
- */
- public void setPassword(String password) {
- this.password = password;
- }
-
- public int getQos(){
- return this.qos;
- }
-
- /**
- * Sets the quality of service to use for MQTT messages. Defaults to 1 (at least once).
- * @param qos
- */
- public void setQos(int qos){
- if(qos < 0 || qos > 2){
- throw new IllegalArgumentException("MQTT QoS must be >= 0 and <= 2");
- }
- this.qos = qos;
- }
-
- public int getWillQos(){
- return this.willQos;
- }
-
- /**
- * Sets the quality of service to use for the MQTT Will message. Defaults to 1 (at least once).
- *
- * @param qos
- */
- public void setWillQos(int qos){
- if(qos < 0 || qos > 2){
- throw new IllegalArgumentException("MQTT Will QoS must be >= 0 and <= 2");
- }
- this.willQos = qos;
- }
-
- public boolean getWillRetain(){
- return this.willRetain;
- }
-
- /**
- * Set to true if you want the Will message to be published with the retain option.
- * @param retain
- */
- public void setWillRetain(boolean retain){
- this.willRetain = retain;
- }
-
- public static class Builder {
- private MqttOptions options = new MqttOptions();
-
- public Builder url(String url) {
- this.options.url = url;
- return this;
- }
-
-
- public Builder topics(List<String> topics) {
- this.options.topics = topics;
- return this;
- }
-
- public Builder cleanConnection(boolean cleanConnection) {
- this.options.cleanConnection = cleanConnection;
- return this;
- }
-
- public Builder willTopic(String willTopic) {
- this.options.willTopic = willTopic;
- return this;
- }
-
- public Builder willPayload(String willPayload) {
- this.options.willPayload = willPayload;
- return this;
- }
-
- public Builder willRetain(boolean retain){
- this.options.willRetain = retain;
- return this;
- }
-
- public Builder willQos(int qos){
- this.options.setWillQos(qos);
- return this;
- }
-
- public Builder reconnectDelay(long reconnectDelay) {
- this.options.reconnectDelay = reconnectDelay;
- return this;
- }
-
- public Builder reconnectDelayMax(long reconnectDelayMax) {
- this.options.reconnectDelayMax = reconnectDelayMax;
- return this;
- }
-
- public Builder reconnectBackOffMultiplier(double reconnectBackOffMultiplier) {
- this.options.reconnectBackOffMultiplier = reconnectBackOffMultiplier;
- return this;
- }
-
- public Builder reconnectAttemptsMax(long reconnectAttemptsMax) {
- this.options.reconnectAttemptsMax = reconnectAttemptsMax;
- return this;
- }
-
- public Builder connectAttemptsMax(long connectAttemptsMax) {
- this.options.connectAttemptsMax = connectAttemptsMax;
- return this;
- }
-
- public Builder userName(String userName) {
- this.options.userName = userName;
- return this;
- }
-
- public Builder password(String password) {
- this.options.password = password;
- return this;
- }
-
- public Builder qos(int qos){
- this.options.setQos(qos);
- return this;
- }
-
- public MqttOptions build() {
- return this.options;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttPublisher.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttPublisher.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttPublisher.java
deleted file mode 100644
index 9b36b78..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttPublisher.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.common;
-
-
-import org.apache.storm.mqtt.MqttLogger;
-import org.apache.storm.mqtt.MqttMessage;
-import org.apache.storm.mqtt.ssl.KeyStoreLoader;
-import org.fusesource.mqtt.client.BlockingConnection;
-import org.fusesource.mqtt.client.MQTT;
-import org.fusesource.mqtt.client.QoS;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.URI;
-
-public class MqttPublisher {
- private static final Logger LOG = LoggerFactory.getLogger(MqttPublisher.class);
-
- private MqttOptions options;
- private transient BlockingConnection connection;
- private KeyStoreLoader keyStoreLoader;
- private QoS qos;
- private boolean retain = false;
-
-
- public MqttPublisher(MqttOptions options){
- this(options, null, false);
- }
-
- public MqttPublisher(MqttOptions options, boolean retain){
- this(options, null, retain);
- }
-
- public MqttPublisher(MqttOptions options, KeyStoreLoader keyStoreLoader, boolean retain){
- this.retain = retain;
- this.options = options;
- this.keyStoreLoader = keyStoreLoader;
- SslUtils.checkSslConfig(this.options.getUrl(), keyStoreLoader);
- this.qos = MqttUtils.qosFromInt(this.options.getQos());
- }
-
- public void publish(MqttMessage message) throws Exception {
- this.connection.publish(message.getTopic(), message.getMessage(), this.qos, this.retain);
- }
-
- public void connectMqtt(String clientId) throws Exception {
- MQTT client = MqttUtils.configureClient(this.options, clientId, this.keyStoreLoader);
- this.connection = client.blockingConnection();
- this.connection.connect();
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttUtils.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttUtils.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttUtils.java
deleted file mode 100644
index 4ca0145..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/MqttUtils.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.common;
-
-
-import org.apache.storm.mqtt.MqttLogger;
-import org.apache.storm.mqtt.ssl.KeyStoreLoader;
-import org.fusesource.mqtt.client.MQTT;
-import org.fusesource.mqtt.client.QoS;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.URI;
-
-public class MqttUtils {
- private static final Logger LOG = LoggerFactory.getLogger(MqttUtils.class);
-
- private MqttUtils(){}
-
- public static QoS qosFromInt(int i){
- QoS qos = null;
- switch(i) {
- case 0:
- qos = QoS.AT_MOST_ONCE;
- break;
- case 1:
- qos = QoS.AT_LEAST_ONCE;
- break;
- case 2:
- qos = QoS.EXACTLY_ONCE;
- break;
- default:
- throw new IllegalArgumentException(i + "is not a valid MQTT QoS.");
- }
- return qos;
- }
-
-
- public static MQTT configureClient(MqttOptions options, String clientId, KeyStoreLoader keyStoreLoader)
- throws Exception{
-
- MQTT client = new MQTT();
- URI uri = URI.create(options.getUrl());
-
- client.setHost(uri);
- if(!uri.getScheme().toLowerCase().equals("tcp")){
- client.setSslContext(SslUtils.sslContext(uri.getScheme(), keyStoreLoader));
- }
- client.setClientId(clientId);
- LOG.info("MQTT ClientID: {}", client.getClientId().toString());
- client.setCleanSession(options.isCleanConnection());
-
- client.setReconnectDelay(options.getReconnectDelay());
- client.setReconnectDelayMax(options.getReconnectDelayMax());
- client.setReconnectBackOffMultiplier(options.getReconnectBackOffMultiplier());
- client.setConnectAttemptsMax(options.getConnectAttemptsMax());
- client.setReconnectAttemptsMax(options.getReconnectAttemptsMax());
-
-
- client.setUserName(options.getUserName());
- client.setPassword(options.getPassword());
- client.setTracer(new MqttLogger());
-
- if(options.getWillTopic() != null && options.getWillPayload() != null){
- QoS qos = MqttUtils.qosFromInt(options.getWillQos());
- client.setWillQos(qos);
- client.setWillTopic(options.getWillTopic());
- client.setWillMessage(options.getWillPayload());
- client.setWillRetain(options.getWillRetain());
- }
- return client;
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/SslUtils.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/SslUtils.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/SslUtils.java
deleted file mode 100644
index 681fc1d..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/common/SslUtils.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.common;
-
-
-import org.apache.storm.mqtt.ssl.KeyStoreLoader;
-
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import java.net.URI;
-import java.security.KeyStore;
-
-public class SslUtils {
- private SslUtils(){}
-
- public static void checkSslConfig(String url, KeyStoreLoader loader){
- URI uri = URI.create(url);
- String scheme = uri.getScheme().toLowerCase();
- if(!(scheme.equals("tcp") || scheme.startsWith("tls") || scheme.startsWith("ssl"))){
- throw new IllegalArgumentException("Unrecognized URI scheme: " + scheme);
- }
- if(!scheme.equalsIgnoreCase("tcp") && loader == null){
- throw new IllegalStateException("A TLS/SSL MQTT URL was specified, but no KeyStoreLoader configured. " +
- "A KeyStoreLoader implementation is required when using TLS/SSL.");
- }
- }
-
- public static SSLContext sslContext(String scheme, KeyStoreLoader keyStoreLoader) throws Exception {
- KeyStore ks = KeyStore.getInstance("JKS");
- ks.load(keyStoreLoader.keyStoreInputStream(), keyStoreLoader.keyStorePassword().toCharArray());
-
- KeyStore ts = KeyStore.getInstance("JKS");
- ts.load(keyStoreLoader.trustStoreInputStream(), keyStoreLoader.trustStorePassword().toCharArray());
-
- KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
- kmf.init(ks, keyStoreLoader.keyPassword().toCharArray());
-
- TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
- tmf.init(ts);
-
- SSLContext sc = SSLContext.getInstance(scheme.toUpperCase());
- TrustManager[] trustManagers = tmf.getTrustManagers();
- sc.init(kmf.getKeyManagers(), trustManagers, null);
-
- return sc;
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/mappers/ByteArrayMessageMapper.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/mappers/ByteArrayMessageMapper.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/mappers/ByteArrayMessageMapper.java
deleted file mode 100644
index a19fce4..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/mappers/ByteArrayMessageMapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.mappers;
-
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-import org.apache.storm.mqtt.MqttMessage;
-import org.apache.storm.mqtt.MqttMessageMapper;
-
-
-public class ByteArrayMessageMapper implements MqttMessageMapper {
- public Values toValues(MqttMessage message) {
- return new Values(message.getTopic(), message.getMessage());
- }
-
- public Fields outputFields() {
- return new Fields("topic", "message");
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/mappers/StringMessageMapper.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/mappers/StringMessageMapper.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/mappers/StringMessageMapper.java
deleted file mode 100644
index e5f309b..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/mappers/StringMessageMapper.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.mappers;
-
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-import org.apache.storm.mqtt.MqttMessage;
-import org.apache.storm.mqtt.MqttMessageMapper;
-
-/**
- * Given a String topic and byte[] message, emits a tuple with fields
- * "topic" and "message", both of which are Strings.
- */
-public class StringMessageMapper implements MqttMessageMapper {
- public Values toValues(MqttMessage message) {
- return new Values(message.getTopic(), new String(message.getMessage()));
- }
-
- public Fields outputFields() {
- return new Fields("topic", "message");
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/spout/AckableMessage.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/spout/AckableMessage.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/spout/AckableMessage.java
deleted file mode 100644
index 08348c9..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/spout/AckableMessage.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.spout;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.storm.mqtt.MqttMessage;
-
-/**
- * Represents an MQTT Message consisting of a topic string (e.g. "/users/ptgoetz/office/thermostat")
- * and a byte array message/payload.
- *
- */
-class AckableMessage {
- private String topic;
- private byte[] message;
- private Runnable ack;
-
- AckableMessage(String topic, byte[] message, Runnable ack){
- this.topic = topic;
- this.message = message;
- this.ack = ack;
- }
-
- public MqttMessage getMessage(){
- return new MqttMessage(this.topic, this.message);
- }
-
- @Override
- public int hashCode() {
- return new HashCodeBuilder(71, 123)
- .append(this.topic)
- .append(this.message)
- .toHashCode();
- }
-
-
- @Override
- public boolean equals(Object obj) {
- if (obj == null) { return false; }
- if (obj == this) { return true; }
- if (obj.getClass() != getClass()) {
- return false;
- }
- AckableMessage tm = (AckableMessage)obj;
- return new EqualsBuilder()
- .appendSuper(super.equals(obj))
- .append(this.topic, tm.topic)
- .append(this.message, tm.message)
- .isEquals();
- }
-
- Runnable ack(){
- return this.ack;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/spout/MqttSpout.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/spout/MqttSpout.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/spout/MqttSpout.java
deleted file mode 100644
index 7f10cc5..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/spout/MqttSpout.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.spout;
-
-import org.apache.storm.Config;
-import org.apache.storm.spout.SpoutOutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.IRichSpout;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.mqtt.MqttMessageMapper;
-import org.apache.storm.mqtt.common.MqttOptions;
-import org.apache.storm.mqtt.common.MqttUtils;
-import org.apache.storm.mqtt.common.SslUtils;
-import org.apache.storm.mqtt.ssl.KeyStoreLoader;
-import org.fusesource.hawtbuf.Buffer;
-import org.fusesource.hawtbuf.UTF8Buffer;
-import org.fusesource.mqtt.client.Callback;
-import org.fusesource.mqtt.client.CallbackConnection;
-import org.fusesource.mqtt.client.Listener;
-import org.fusesource.mqtt.client.MQTT;
-import org.fusesource.mqtt.client.QoS;
-import org.fusesource.mqtt.client.Topic;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.LinkedBlockingQueue;
-
-public class MqttSpout implements IRichSpout, Listener {
- private static final Logger LOG = LoggerFactory.getLogger(MqttSpout.class);
-
- private String topologyName;
-
-
- private CallbackConnection connection;
-
- protected transient SpoutOutputCollector collector;
- protected transient TopologyContext context;
- protected transient LinkedBlockingQueue<AckableMessage> incoming;
- protected transient HashMap<Long, AckableMessage> pending;
- private transient Map conf;
- protected MqttMessageMapper type;
- protected MqttOptions options;
- protected KeyStoreLoader keyStoreLoader;
-
- private boolean mqttConnected = false;
- private boolean mqttConnectFailed = false;
-
-
- private Long sequence = Long.MIN_VALUE;
-
- private Long nextId(){
- this.sequence++;
- if(this.sequence == Long.MAX_VALUE){
- this.sequence = Long.MIN_VALUE;
- }
- return this.sequence;
- }
-
- protected MqttSpout(){}
-
- public MqttSpout(MqttMessageMapper type, MqttOptions options){
- this(type, options, null);
- }
-
- public MqttSpout(MqttMessageMapper type, MqttOptions options, KeyStoreLoader keyStoreLoader){
- this.type = type;
- this.options = options;
- this.keyStoreLoader = keyStoreLoader;
- SslUtils.checkSslConfig(this.options.getUrl(), this.keyStoreLoader);
- }
-
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(this.type.outputFields());
- }
-
- public Map<String, Object> getComponentConfiguration() {
- return null;
- }
-
- public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
- this.topologyName = (String)conf.get(Config.TOPOLOGY_NAME);
-
- this.collector = collector;
- this.context = context;
- this.conf = conf;
-
- this.incoming = new LinkedBlockingQueue<>();
- this.pending = new HashMap<>();
-
- try {
- connectMqtt();
- } catch (Exception e) {
- this.collector.reportError(e);
- throw new RuntimeException("MQTT Connection failed.", e);
- }
-
- }
-
- private void connectMqtt() throws Exception {
- String clientId = this.topologyName + "-" + this.context.getThisComponentId() + "-" +
- this.context.getThisTaskId();
-
- MQTT client = MqttUtils.configureClient(this.options, clientId, this.keyStoreLoader);
- this.connection = client.callbackConnection();
- this.connection.listener(this);
- this.connection.connect(new ConnectCallback());
-
- while(!this.mqttConnected && !this.mqttConnectFailed){
- LOG.info("Waiting for connection...");
- Thread.sleep(500);
- }
-
- if(this.mqttConnected){
- List<String> topicList = this.options.getTopics();
- Topic[] topics = new Topic[topicList.size()];
- QoS qos = MqttUtils.qosFromInt(this.options.getQos());
- for(int i = 0;i < topicList.size();i++){
- topics[i] = new Topic(topicList.get(i), qos);
- }
- connection.subscribe(topics, new SubscribeCallback());
- }
- }
-
-
-
- public void close() {
- this.connection.disconnect(new DisconnectCallback());
- }
-
- public void activate() {
- }
-
- public void deactivate() {
- }
-
- /**
- * When this method is called, Storm is requesting that the Spout emit tuples to the
- * output collector. This method should be non-blocking, so if the Spout has no tuples
- * to emit, this method should return. nextTuple, ack, and fail are all called in a tight
- * loop in a single thread in the spout task. When there are no tuples to emit, it is courteous
- * to have nextTuple sleep for a short amount of time (like a single millisecond)
- * so as not to waste too much CPU.
- */
- public void nextTuple() {
- AckableMessage tm = this.incoming.poll();
- if(tm != null){
- Long id = nextId();
- this.collector.emit(this.type.toValues(tm.getMessage()), id);
- this.pending.put(id, tm);
- } else {
- Thread.yield();
- }
-
- }
-
- /**
- * Storm has determined that the tuple emitted by this spout with the msgId identifier
- * has been fully processed. Typically, an implementation of this method will take that
- * message off the queue and prevent it from being replayed.
- *
- * @param msgId
- */
- public void ack(Object msgId) {
- AckableMessage msg = this.pending.remove(msgId);
- this.connection.getDispatchQueue().execute(msg.ack());
- }
-
- /**
- * The tuple emitted by this spout with the msgId identifier has failed to be
- * fully processed. Typically, an implementation of this method will put that
- * message back on the queue to be replayed at a later time.
- *
- * @param msgId
- */
- public void fail(Object msgId) {
- try {
- this.incoming.put(this.pending.remove(msgId));
- } catch (InterruptedException e) {
- LOG.warn("Interrupted while re-queueing message.", e);
- }
- }
-
-
- // ################# Listener Implementation ######################
- public void onConnected() {
- // this gets called repeatedly for no apparent reason, don't do anything
- }
-
- public void onDisconnected() {
- // this gets called repeatedly for no apparent reason, don't do anything
- }
-
- public void onPublish(UTF8Buffer topic, Buffer payload, Runnable ack) {
- LOG.debug("Received message: topic={}, payload={}", topic.toString(), new String(payload.toByteArray()));
- try {
- this.incoming.put(new AckableMessage(topic.toString(), payload.toByteArray(), ack));
- } catch (InterruptedException e) {
- LOG.warn("Interrupted while queueing an MQTT message.");
- }
- }
-
- public void onFailure(Throwable throwable) {
- LOG.error("MQTT Connection Failure.", throwable);
- MqttSpout.this.connection.disconnect(new DisconnectCallback());
- throw new RuntimeException("MQTT Connection failure.", throwable);
- }
-
- // ################# Connect Callback Implementation ######################
- private class ConnectCallback implements Callback<Void> {
- public void onSuccess(Void v) {
- LOG.info("MQTT Connected. Subscribing to topic...");
- MqttSpout.this.mqttConnected = true;
- }
-
- public void onFailure(Throwable throwable) {
- LOG.info("MQTT Connection failed.");
- MqttSpout.this.mqttConnectFailed = true;
- }
- }
-
- // ################# Subscribe Callback Implementation ######################
- private class SubscribeCallback implements Callback<byte[]>{
- public void onSuccess(byte[] qos) {
- LOG.info("Subscripton sucessful.");
- }
-
- public void onFailure(Throwable throwable) {
- LOG.error("MQTT Subscripton failed.", throwable);
- throw new RuntimeException("MQTT Subscribe failed.", throwable);
- }
- }
-
- // ################# Subscribe Callback Implementation ######################
- private class DisconnectCallback implements Callback<Void>{
- public void onSuccess(Void aVoid) {
- LOG.info("MQTT Disconnect successful.");
- }
-
- public void onFailure(Throwable throwable) {
- // Disconnects don't fail.
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/ssl/DefaultKeyStoreLoader.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/ssl/DefaultKeyStoreLoader.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/ssl/DefaultKeyStoreLoader.java
deleted file mode 100644
index 8bca407..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/ssl/DefaultKeyStoreLoader.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.ssl;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-/**
- * KeyStoreLoader implementation that uses local files.
- */
-public class DefaultKeyStoreLoader implements KeyStoreLoader {
- private String ksFile = null;
- private String tsFile = null;
- private String keyStorePassword = "";
- private String trustStorePassword = "";
- private String keyPassword = "";
-
- /**
- * Creates a DefaultKeystoreLoader that uses the same file
- * for both the keystore and truststore.
- *
- * @param keystore path to keystore file
- */
- public DefaultKeyStoreLoader(String keystore){
- this.ksFile = keystore;
- }
-
- /**
- * Creates a DefaultKeystoreLoader that uses separate files
- * for the keystore and truststore.
- *
- * @param keystore path to keystore file
- * @param truststore path to truststore file
- */
- public DefaultKeyStoreLoader(String keystore, String truststore){
- this.ksFile = keystore;
- this.tsFile = truststore;
- }
-
- public void setKeyStorePassword(String keyStorePassword) {
- this.keyStorePassword = keyStorePassword;
- }
-
- public void setTrustStorePassword(String trustStorePassword) {
- this.trustStorePassword = trustStorePassword;
- }
-
- public void setKeyPassword(String keyPassword) {
- this.keyPassword = keyPassword;
- }
-
- @Override
- public InputStream keyStoreInputStream() throws FileNotFoundException {
- return new FileInputStream(this.ksFile);
- }
-
- @Override
- public InputStream trustStoreInputStream() throws FileNotFoundException {
- // if no truststore file, assume the truststore is the keystore.
- if(this.tsFile == null){
- return new FileInputStream(this.ksFile);
- } else {
- return new FileInputStream(this.tsFile);
- }
- }
-
- @Override
- public String keyStorePassword() {
- return this.keyStorePassword;
- }
-
- @Override
- public String trustStorePassword() {
- return this.trustStorePassword;
- }
-
- @Override
- public String keyPassword() {
- return this.keyPassword;
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/ssl/KeyStoreLoader.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/ssl/KeyStoreLoader.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/ssl/KeyStoreLoader.java
deleted file mode 100644
index 297efcc..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/ssl/KeyStoreLoader.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.ssl;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-/**
- * Abstraction for loading keystore/truststore data. This allows keystores
- * to be loaded from different sources (File system, HDFS, etc.).
- */
-public interface KeyStoreLoader extends Serializable {
-
- String keyStorePassword();
- String trustStorePassword();
- String keyPassword();
- InputStream keyStoreInputStream() throws IOException;
- InputStream trustStoreInputStream() throws IOException;
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/trident/MqttPublishFunction.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/trident/MqttPublishFunction.java b/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/trident/MqttPublishFunction.java
deleted file mode 100644
index e53c983..0000000
--- a/external/storm-mqtt/core/src/main/java/org/apache/storm/mqtt/trident/MqttPublishFunction.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt.trident;
-
-import org.apache.storm.Config;
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.topology.FailedException;
-import org.apache.storm.mqtt.MqttMessage;
-import org.apache.storm.mqtt.common.MqttOptions;
-import org.apache.storm.mqtt.MqttTupleMapper;
-import org.apache.storm.mqtt.common.MqttPublisher;
-import org.apache.storm.mqtt.common.SslUtils;
-import org.apache.storm.mqtt.ssl.KeyStoreLoader;
-import org.apache.storm.trident.operation.BaseFunction;
-import org.apache.storm.trident.operation.TridentCollector;
-import org.apache.storm.trident.operation.TridentOperationContext;
-import org.apache.storm.trident.tuple.TridentTuple;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-import java.util.Map;
-
-public class MqttPublishFunction extends BaseFunction {
- private static final Logger LOG = LoggerFactory.getLogger(MqttPublishFunction.class);
- private MqttTupleMapper mapper;
- private transient MqttPublisher publisher;
- private boolean retain = false;
- private transient OutputCollector collector;
- private MqttOptions options;
- private KeyStoreLoader keyStoreLoader;
- private transient String topologyName;
-
-
- public MqttPublishFunction(MqttOptions options, MqttTupleMapper mapper, KeyStoreLoader keyStoreLoader, boolean retain){
- this.options = options;
- this.mapper = mapper;
- this.retain = retain;
- this.keyStoreLoader = keyStoreLoader;
- // the following code is duplicated in the constructor of MqttPublisher
- // we reproduce it here so we fail on the client side if SSL is misconfigured, rather than when the topology
- // is deployed to the cluster
- SslUtils.checkSslConfig(this.options.getUrl(), keyStoreLoader);
- }
-
-
- @Override
- public void prepare(Map conf, TridentOperationContext context) {
- this.topologyName = (String)conf.get(Config.TOPOLOGY_NAME);
- this.publisher = new MqttPublisher(this.options, this.keyStoreLoader, this.retain);
- try {
- this.publisher.connectMqtt(this.topologyName + "-" + context.getPartitionIndex());
- } catch (Exception e) {
- LOG.error("Unable to connect to MQTT Broker.", e);
- throw new RuntimeException("Unable to connect to MQTT Broker.", e);
- }
- }
-
- @Override
- public void execute(TridentTuple tuple, TridentCollector collector) {
- MqttMessage message = this.mapper.toMessage(tuple);
- try {
- this.publisher.publish(message);
- } catch (Exception e) {
- LOG.warn("Error publishing MQTT message. Failing tuple.", e);
- // should we fail the batch or kill the worker?
- throw new FailedException();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/core/src/test/java/org/apache/storm/mqtt/StormMqttIntegrationTest.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/core/src/test/java/org/apache/storm/mqtt/StormMqttIntegrationTest.java b/external/storm-mqtt/core/src/test/java/org/apache/storm/mqtt/StormMqttIntegrationTest.java
deleted file mode 100644
index 0dd4d73..0000000
--- a/external/storm-mqtt/core/src/test/java/org/apache/storm/mqtt/StormMqttIntegrationTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.mqtt;
-
-import org.apache.storm.Config;
-import org.apache.storm.LocalCluster;
-import org.apache.storm.LocalCluster.LocalTopology;
-import org.apache.storm.generated.StormTopology;
-import org.apache.storm.testing.IntegrationTest;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.tuple.ITuple;
-import org.apache.activemq.broker.BrokerService;
-import org.apache.storm.mqtt.bolt.MqttBolt;
-import org.apache.storm.mqtt.common.MqttOptions;
-import org.apache.storm.mqtt.common.MqttPublisher;
-import org.apache.storm.mqtt.mappers.StringMessageMapper;
-import org.apache.storm.mqtt.spout.MqttSpout;
-import org.fusesource.mqtt.client.BlockingConnection;
-import org.fusesource.mqtt.client.MQTT;
-import org.fusesource.mqtt.client.Message;
-import org.fusesource.mqtt.client.QoS;
-import org.fusesource.mqtt.client.Topic;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Serializable;
-import java.net.URI;
-import java.util.Arrays;
-
-@Category(IntegrationTest.class)
-public class StormMqttIntegrationTest implements Serializable{
- private static final Logger LOG = LoggerFactory.getLogger(StormMqttIntegrationTest.class);
- private static BrokerService broker;
- static boolean spoutActivated = false;
-
- private static final String TEST_TOPIC = "/mqtt-topology";
- private static final String RESULT_TOPIC = "/integration-result";
- private static final String RESULT_PAYLOAD = "Storm MQTT Spout";
-
- public static class TestSpout extends MqttSpout{
- public TestSpout(MqttMessageMapper type, MqttOptions options){
- super(type, options);
- }
-
- @Override
- public void activate() {
- super.activate();
- LOG.info("Spout activated.");
- spoutActivated = true;
- }
- }
-
-
- @AfterClass
- public static void cleanup() throws Exception {
- broker.stop();
- }
-
- @BeforeClass
- public static void start() throws Exception {
- LOG.warn("Starting broker...");
- broker = new BrokerService();
- broker.addConnector("mqtt://localhost:1883");
- broker.setDataDirectory("target");
- broker.start();
- LOG.debug("MQTT broker started");
- }
-
-
- @Test
- public void testMqttTopology() throws Exception {
- MQTT client = new MQTT();
- client.setTracer(new MqttLogger());
- URI uri = URI.create("tcp://localhost:1883");
- client.setHost(uri);
-
- client.setClientId("MQTTSubscriber");
- client.setCleanSession(false);
- BlockingConnection connection = client.blockingConnection();
- connection.connect();
- Topic[] topics = {new Topic("/integration-result", QoS.AT_LEAST_ONCE)};
- byte[] qoses = connection.subscribe(topics);
-
- try (LocalCluster cluster = new LocalCluster();
- LocalTopology topo = cluster.submitTopology("test", new Config(), buildMqttTopology());) {
-
- LOG.info("topology started");
- while(!spoutActivated) {
- Thread.sleep(500);
- }
-
- // publish a retained message to the broker
- MqttOptions options = new MqttOptions();
- options.setCleanConnection(false);
- MqttPublisher publisher = new MqttPublisher(options, true);
- publisher.connectMqtt("MqttPublisher");
- publisher.publish(new MqttMessage(TEST_TOPIC, "test".getBytes()));
-
- LOG.info("published message");
-
- Message message = connection.receive();
- LOG.info("Message recieved on topic: {}", message.getTopic());
- LOG.info("Payload: {}", new String(message.getPayload()));
- message.ack();
-
- Assert.assertArrayEquals(message.getPayload(), RESULT_PAYLOAD.getBytes());
- Assert.assertEquals(message.getTopic(), RESULT_TOPIC);
- }
- }
-
- public StormTopology buildMqttTopology(){
- TopologyBuilder builder = new TopologyBuilder();
-
- MqttOptions options = new MqttOptions();
- options.setTopics(Arrays.asList(TEST_TOPIC));
- options.setCleanConnection(false);
- TestSpout spout = new TestSpout(new StringMessageMapper(), options);
-
- MqttBolt bolt = new MqttBolt(options, new MqttTupleMapper() {
- @Override
- public MqttMessage toMessage(ITuple tuple) {
- LOG.info("Received: {}", tuple);
- return new MqttMessage(RESULT_TOPIC, RESULT_PAYLOAD.getBytes());
- }
- });
-
- builder.setSpout("mqtt-spout", spout);
- builder.setBolt("mqtt-bolt", bolt).shuffleGrouping("mqtt-spout");
-
- return builder.createTopology();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/pom.xml b/external/storm-mqtt/pom.xml
index 7b870b2..37c19d7 100644
--- a/external/storm-mqtt/pom.xml
+++ b/external/storm-mqtt/pom.xml
@@ -14,44 +14,112 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>storm</artifactId>
- <groupId>org.apache.storm</groupId>
- <version>2.0.0-SNAPSHOT</version>
- <relativePath>../../pom.xml</relativePath>
- </parent>
-
- <artifactId>storm-mqtt-parent</artifactId>
- <packaging>pom</packaging>
-
- <name>storm-mqtt-parent</name>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <!-- see comment below... This fixes an annoyance with intellij -->
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <!--
- Hack to make intellij behave.
- If you use intellij, enable this profile in your IDE.
- It should make life easier.
- -->
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
- <modules>
- <module>core</module>
- </modules>
+ <artifactId>storm-mqtt</artifactId>
+ <packaging>jar</packaging>
+
+ <name>storm-mqtt</name>
+
+ <parent>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm</artifactId>
+ <version>2.0.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+
+
+
+ <repositories>
+ <repository>
+ <id>bintray</id>
+ <url>http://dl.bintray.com/andsel/maven/</url>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-broker</artifactId>
+ <version>5.9.0</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-mqtt</artifactId>
+ <version>5.9.0</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-kahadb-store</artifactId>
+ <version>5.9.0</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-core</artifactId>
+ <version>${project.version}</version>
+ <scope>${provided.scope}</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.fusesource.mqtt-client</groupId>
+ <artifactId>mqtt-client</artifactId>
+ <version>1.10</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.5</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <forkMode>perTest</forkMode>
+ <enableAssertions>false</enableAssertions>
+ <redirectTestOutputToFile>true</redirectTestOutputToFile>
+ <excludedGroups>${java.unit.test.exclude}</excludedGroups>
+ <includes>
+ <include>${java.unit.test.include}</include>
+ </includes>
+ <argLine>-Djava.net.preferIPv4Stack=true -Xmx1536m</argLine>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <version>${maven-surefire.version}</version>
+ <configuration>
+ <forkMode>perTest</forkMode>
+ <enableAssertions>false</enableAssertions>
+ <redirectTestOutputToFile>true</redirectTestOutputToFile>
+ <includes>
+ <include>${java.integration.test.include}</include>
+ </includes>
+ <groups>${java.integration.test.group}</groups> <!--set in integration-test the profile-->
+ <argLine>-Djava.net.preferIPv4Stack=true -Xmx1536m</argLine>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttLogger.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttLogger.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttLogger.java
new file mode 100644
index 0000000..3af73fd
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttLogger.java
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt;
+
+import org.fusesource.mqtt.client.Tracer;
+import org.fusesource.mqtt.codec.MQTTFrame;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Wrapper around SLF4J logger that allows MQTT messages to be logged.
+ */
+public class MqttLogger extends Tracer {
+ private static final Logger LOG = LoggerFactory.getLogger(MqttLogger.class);
+
+ @Override
+ public void debug(String message, Object... args) {
+ LOG.debug(String.format(message, args));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttMessage.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttMessage.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttMessage.java
new file mode 100644
index 0000000..5436dda
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttMessage.java
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt;
+
+/**
+ * Represents an MQTT Message consisting of a topic string (e.g. "/users/ptgoetz/office/thermostat")
+ * and a byte array message/payload.
+ *
+ */
+public class MqttMessage {
+ private String topic;
+ private byte[] message;
+
+
+ public MqttMessage(String topic, byte[] payload){
+ this.topic = topic;
+ this.message = payload;
+ }
+ public byte[] getMessage(){
+ return this.message;
+ }
+
+ public String getTopic(){
+ return this.topic;
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttMessageMapper.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttMessageMapper.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttMessageMapper.java
new file mode 100644
index 0000000..c6173f4
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttMessageMapper.java
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt;
+
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+
+import java.io.Serializable;
+
+/**
+ * Represents an object that can be converted to a Storm Tuple from an AckableMessage,
+ * given a MQTT Topic Name and a byte array payload.
+ */
+public interface MqttMessageMapper extends Serializable {
+ /**
+ * Convert a `MqttMessage` to a set of Values that can be emitted as a Storm Tuple.
+ *
+ * @param message An MQTT Message.
+ * @return Values representing a Storm Tuple.
+ */
+ Values toValues(MqttMessage message);
+
+ /**
+ * Returns the list of output fields this Mapper produces.
+ *
+ * @return the list of output fields this mapper produces.
+ */
+ Fields outputFields();
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttTupleMapper.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttTupleMapper.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttTupleMapper.java
new file mode 100644
index 0000000..c46c069
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/MqttTupleMapper.java
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt;
+
+
+import org.apache.storm.tuple.ITuple;
+
+import java.io.Serializable;
+
+/**
+ * Given a Tuple, converts it to an MQTT message.
+ */
+public interface MqttTupleMapper extends Serializable{
+
+ /**
+ * Converts a Tuple to a MqttMessage
+ * @param tuple the incoming tuple
+ * @return the message to publish
+ */
+ MqttMessage toMessage(ITuple tuple);
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/bolt/MqttBolt.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/bolt/MqttBolt.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/bolt/MqttBolt.java
new file mode 100644
index 0000000..f6ca1bf
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/bolt/MqttBolt.java
@@ -0,0 +1,105 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.bolt;
+
+import org.apache.storm.Config;
+import org.apache.storm.mqtt.MqttMessage;
+import org.apache.storm.mqtt.common.MqttOptions;
+import org.apache.storm.mqtt.MqttTupleMapper;
+import org.apache.storm.mqtt.common.MqttPublisher;
+import org.apache.storm.mqtt.common.SslUtils;
+import org.apache.storm.mqtt.ssl.KeyStoreLoader;
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichBolt;
+import org.apache.storm.topology.base.BaseTickTupleAwareRichBolt;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.utils.TupleUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+
+public class MqttBolt extends BaseTickTupleAwareRichBolt {
+ private static final Logger LOG = LoggerFactory.getLogger(MqttBolt.class);
+ private MqttTupleMapper mapper;
+ private transient MqttPublisher publisher;
+ private boolean retain = false;
+ private transient OutputCollector collector;
+ private MqttOptions options;
+ private KeyStoreLoader keyStoreLoader;
+ private transient String topologyName;
+
+
+ public MqttBolt(MqttOptions options, MqttTupleMapper mapper){
+ this(options, mapper, null, false);
+ }
+
+ public MqttBolt(MqttOptions options, MqttTupleMapper mapper, boolean retain){
+ this(options, mapper, null, retain);
+ }
+
+ public MqttBolt(MqttOptions options, MqttTupleMapper mapper, KeyStoreLoader keyStoreLoader){
+ this(options, mapper, keyStoreLoader, false);
+ }
+
+ public MqttBolt(MqttOptions options, MqttTupleMapper mapper, KeyStoreLoader keyStoreLoader, boolean retain){
+ this.options = options;
+ this.mapper = mapper;
+ this.retain = retain;
+ this.keyStoreLoader = keyStoreLoader;
+ // the following code is duplicated in the constructor of MqttPublisher
+ // we reproduce it here so we fail on the client side if SSL is misconfigured, rather than when the topology
+ // is deployed to the cluster
+ SslUtils.checkSslConfig(this.options.getUrl(), keyStoreLoader);
+ }
+
+ @Override
+ public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
+ this.collector = collector;
+ this.topologyName = (String)conf.get(Config.TOPOLOGY_NAME);
+ this.publisher = new MqttPublisher(this.options, this.keyStoreLoader, this.retain);
+ try {
+ this.publisher.connectMqtt(this.topologyName + "-" + context.getThisComponentId() + "-" + context.getThisTaskId());
+ } catch (Exception e) {
+ LOG.error("Unable to connect to MQTT Broker.", e);
+ throw new RuntimeException("Unable to connect to MQTT Broker.", e);
+ }
+ }
+
+ @Override
+ protected void process(Tuple input) {
+ MqttMessage message = this.mapper.toMessage(input);
+ try {
+ this.publisher.publish(message);
+ this.collector.ack(input);
+ } catch (Exception e) {
+ LOG.warn("Error publishing MQTT message. Failing tuple.", e);
+ // should we fail the tuple or kill the worker?
+ collector.reportError(e);
+ collector.fail(input);
+ }
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ // this bolt does not emit tuples
+ }
+}
[07/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/bolt/JmsBolt.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/bolt/JmsBolt.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/bolt/JmsBolt.java
deleted file mode 100644
index d691e75..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/bolt/JmsBolt.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.bolt;
-
-import java.util.Map;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-import org.apache.storm.topology.base.BaseRichBolt;
-import org.apache.storm.jms.JmsMessageProducer;
-import org.apache.storm.jms.JmsProvider;
-import org.apache.storm.topology.base.BaseTickTupleAwareRichBolt;
-import org.apache.storm.utils.TupleUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.tuple.Tuple;
-
-/**
- * A JmsBolt receives <code>org.apache.storm.tuple.Tuple</code> objects from a Storm
- * topology and publishes JMS Messages to a destination (topic or queue).
- * <p>
- * To use a JmsBolt in a topology, the following must be supplied:
- * <ol>
- * <li>A <code>JmsProvider</code> implementation.</li>
- * <li>A <code>JmsMessageProducer</code> implementation.</li>
- * </ol>
- * The <code>JmsProvider</code> provides the JMS <code>javax.jms.ConnectionFactory</code>
- * and <code>javax.jms.Destination</code> objects requied to publish JMS messages.
- * <p>
- * The JmsBolt uses a <code>JmsMessageProducer</code> to translate
- * <code>org.apache.storm.tuple.Tuple</code> objects into
- * <code>javax.jms.Message</code> objects for publishing.
- * <p>
- * Both JmsProvider and JmsMessageProducer must be set, or the bolt will
- * fail upon deployment to a cluster.
- * <p>
- * The JmsBolt is typically an endpoint in a topology -- in other words
- * it does not emit any tuples.
- */
-public class JmsBolt extends BaseTickTupleAwareRichBolt {
- private static Logger LOG = LoggerFactory.getLogger(JmsBolt.class);
-
- private boolean autoAck = true;
-
- // javax.jms objects
- private Connection connection;
- private Session session;
- private MessageProducer messageProducer;
-
- // JMS options
- private boolean jmsTransactional = false;
- private int jmsAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;
-
-
- private JmsProvider jmsProvider;
- private JmsMessageProducer producer;
-
-
- private OutputCollector collector;
-
- /**
- * Set the JmsProvider used to connect to the JMS destination topic/queue
- *
- * @param provider
- */
- public void setJmsProvider(JmsProvider provider) {
- this.jmsProvider = provider;
- }
-
- /**
- * Set the JmsMessageProducer used to convert tuples
- * into JMS messages.
- *
- * @param producer
- */
- public void setJmsMessageProducer(JmsMessageProducer producer) {
- this.producer = producer;
- }
-
- /**
- * Sets the JMS acknowledgement mode for JMS messages sent
- * by this bolt.
- * <p>
- * Possible values:
- * <ul>
- * <li>javax.jms.Session.AUTO_ACKNOWLEDGE</li>
- * <li>javax.jms.Session.CLIENT_ACKNOWLEDGE</li>
- * <li>javax.jms.Session.DUPS_OK_ACKNOWLEDGE</li>
- * </ul>
- *
- * @param acknowledgeMode (constant defined in javax.jms.Session)
- */
- public void setJmsAcknowledgeMode(int acknowledgeMode) {
- this.jmsAcknowledgeMode = acknowledgeMode;
- }
-
- /**
- * Set the JMS transactional setting for the JMS session.
- *
- * @param transactional
- */
-// public void setJmsTransactional(boolean transactional){
-// this.jmsTransactional = transactional;
-// }
-
- /**
- * Sets whether or not tuples should be acknowledged by this
- * bolt.
- * <p>
- *
- * @param autoAck
- */
- public void setAutoAck(boolean autoAck) {
- this.autoAck = autoAck;
- }
-
-
- /**
- * Consumes a tuple and sends a JMS message.
- * <p>
- * If autoAck is true, the tuple will be acknowledged
- * after the message is sent.
- * <p>
- * If JMS sending fails, the tuple will be failed.
- */
- @Override
- protected void process(Tuple input) {
- // write the tuple to a JMS destination...
- LOG.debug("Tuple received. Sending JMS message.");
-
- try {
- Message msg = this.producer.toMessage(this.session, input);
- if (msg != null) {
- if (msg.getJMSDestination() != null) {
- this.messageProducer.send(msg.getJMSDestination(), msg);
- } else {
- this.messageProducer.send(msg);
- }
- }
- if (this.autoAck) {
- LOG.debug("ACKing tuple: " + input);
- this.collector.ack(input);
- }
- } catch (JMSException e) {
- // failed to send the JMS message, fail the tuple fast
- LOG.warn("Failing tuple: " + input);
- LOG.warn("Exception: ", e);
- this.collector.fail(input);
- }
- }
-
- /**
- * Releases JMS resources.
- */
- @Override
- public void cleanup() {
- try {
- LOG.debug("Closing JMS connection.");
- this.session.close();
- this.connection.close();
- } catch (JMSException e) {
- LOG.warn("Error closing JMS connection.", e);
- }
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- }
-
- /**
- * Initializes JMS resources.
- */
- @Override
- public void prepare(Map stormConf, TopologyContext context,
- OutputCollector collector) {
- if (this.jmsProvider == null || this.producer == null) {
- throw new IllegalStateException("JMS Provider and MessageProducer not set.");
- }
- this.collector = collector;
- LOG.debug("Connecting JMS..");
- try {
- ConnectionFactory cf = this.jmsProvider.connectionFactory();
- Destination dest = this.jmsProvider.destination();
- this.connection = cf.createConnection();
- this.session = connection.createSession(this.jmsTransactional,
- this.jmsAcknowledgeMode);
- this.messageProducer = session.createProducer(dest);
-
- connection.start();
- } catch (Exception e) {
- LOG.warn("Error creating JMS connection.", e);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/spout/JmsMessageID.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/spout/JmsMessageID.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/spout/JmsMessageID.java
deleted file mode 100644
index b78a41e..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/spout/JmsMessageID.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.spout;
-
-import java.io.Serializable;
-
-public class JmsMessageID implements Comparable<JmsMessageID>, Serializable {
-
- private String jmsID;
-
- private Long sequence;
-
- public JmsMessageID(long sequence, String jmsID){
- this.jmsID = jmsID;
- this.sequence = sequence;
- }
-
-
- public String getJmsID(){
- return this.jmsID;
- }
-
- @Override
- public int compareTo(JmsMessageID jmsMessageID) {
- return (int)(this.sequence - jmsMessageID.sequence);
- }
-
- @Override
- public int hashCode() {
- return this.sequence.hashCode();
- }
-
- @Override
- public boolean equals(Object o) {
- if(o instanceof JmsMessageID){
- JmsMessageID id = (JmsMessageID)o;
- return this.jmsID.equals(id.jmsID);
- } else {
- return false;
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/spout/JmsSpout.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/spout/JmsSpout.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/spout/JmsSpout.java
deleted file mode 100644
index 6aaa7c9..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/spout/JmsSpout.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.spout;
-
-import java.io.Serializable;
-import java.util.*;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.Session;
-
-import org.apache.storm.topology.base.BaseRichSpout;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.storm.jms.JmsProvider;
-import org.apache.storm.jms.JmsTupleProducer;
-import org.apache.storm.spout.SpoutOutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.tuple.Values;
-import org.apache.storm.utils.Utils;
-
-/**
- * A Storm <code>Spout</code> implementation that listens to a JMS topic or queue
- * and outputs tuples based on the messages it receives.
- * <p>
- * <code>JmsSpout</code> instances rely on <code>JmsProducer</code> implementations
- * to obtain the JMS <code>ConnectionFactory</code> and <code>Destination</code> objects
- * necessary to connect to a JMS topic/queue.
- * <p>
- * When a <code>JmsSpout</code> receives a JMS message, it delegates to an
- * internal <code>JmsTupleProducer</code> instance to create a Storm tuple from the
- * incoming message.
- * <p>
- * Typically, developers will supply a custom <code>JmsTupleProducer</code> implementation
- * appropriate for the expected message content.
- */
-@SuppressWarnings("serial")
-public class JmsSpout extends BaseRichSpout implements MessageListener {
- private static final Logger LOG = LoggerFactory.getLogger(JmsSpout.class);
-
- // JMS options
- private int jmsAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;
-
- private boolean distributed = true;
-
- private JmsTupleProducer tupleProducer;
-
- private JmsProvider jmsProvider;
-
- private LinkedBlockingQueue<Message> queue;
- private TreeSet<JmsMessageID> toCommit;
- private HashMap<JmsMessageID, Message> pendingMessages;
- private long messageSequence = 0;
-
- private SpoutOutputCollector collector;
-
- private transient Connection connection;
- private transient Session session;
-
- private boolean hasFailures = false;
- public final Serializable recoveryMutex = "RECOVERY_MUTEX";
- private Timer recoveryTimer = null;
- private long recoveryPeriod = -1; // default to disabled
-
- /**
- * Sets the JMS Session acknowledgement mode for the JMS seesion associated with this spout.
- * <p>
- * Possible values:
- * <ul>
- * <li>javax.jms.Session.AUTO_ACKNOWLEDGE</li>
- * <li>javax.jms.Session.CLIENT_ACKNOWLEDGE</li>
- * <li>javax.jms.Session.DUPS_OK_ACKNOWLEDGE</li>
- * </ul>
- *
- * @param mode JMS Session Acknowledgement mode
- * @throws IllegalArgumentException if the mode is not recognized.
- */
- public void setJmsAcknowledgeMode(int mode) {
- switch (mode) {
- case Session.AUTO_ACKNOWLEDGE:
- case Session.CLIENT_ACKNOWLEDGE:
- case Session.DUPS_OK_ACKNOWLEDGE:
- break;
- default:
- throw new IllegalArgumentException("Unknown Acknowledge mode: " + mode + " (See javax.jms.Session for valid values)");
-
- }
- this.jmsAcknowledgeMode = mode;
- }
-
- /**
- * Returns the JMS Session acknowledgement mode for the JMS seesion associated with this spout.
- *
- * @return
- */
- public int getJmsAcknowledgeMode() {
- return this.jmsAcknowledgeMode;
- }
-
- /**
- * Set the <code>JmsProvider</code>
- * implementation that this Spout will use to connect to
- * a JMS <code>javax.jms.Desination</code>
- *
- * @param provider
- */
- public void setJmsProvider(JmsProvider provider) {
- this.jmsProvider = provider;
- }
-
- /**
- * Set the <code>JmsTupleProducer</code>
- * implementation that will convert <code>javax.jms.Message</code>
- * object to <code>org.apache.storm.tuple.Values</code> objects
- * to be emitted.
- *
- * @param producer
- */
- public void setJmsTupleProducer(JmsTupleProducer producer) {
- this.tupleProducer = producer;
- }
-
- /**
- * <code>javax.jms.MessageListener</code> implementation.
- * <p>
- * Stored the JMS message in an internal queue for processing
- * by the <code>nextTuple()</code> method.
- */
- public void onMessage(Message msg) {
- try {
- LOG.debug("Queuing msg [" + msg.getJMSMessageID() + "]");
- } catch (JMSException e) {
- }
- this.queue.offer(msg);
- }
-
- /**
- * <code>ISpout</code> implementation.
- * <p>
- * Connects the JMS spout to the configured JMS destination
- * topic/queue.
- */
- @SuppressWarnings("rawtypes")
- public void open(Map conf, TopologyContext context,
- SpoutOutputCollector collector) {
- if (this.jmsProvider == null) {
- throw new IllegalStateException("JMS provider has not been set.");
- }
- if (this.tupleProducer == null) {
- throw new IllegalStateException("JMS Tuple Producer has not been set.");
- }
- Integer topologyTimeout = (Integer) conf.get("topology.message.timeout.secs");
- // TODO fine a way to get the default timeout from storm, so we're not hard-coding to 30 seconds (it could change)
- topologyTimeout = topologyTimeout == null ? 30 : topologyTimeout;
- if ((topologyTimeout.intValue() * 1000) > this.recoveryPeriod) {
- LOG.warn("*** WARNING *** : " +
- "Recovery period (" + this.recoveryPeriod + " ms.) is less then the configured " +
- "'topology.message.timeout.secs' of " + topologyTimeout +
- " secs. This could lead to a message replay flood!");
- }
- this.queue = new LinkedBlockingQueue<Message>();
- this.toCommit = new TreeSet<JmsMessageID>();
- this.pendingMessages = new HashMap<JmsMessageID, Message>();
- this.collector = collector;
- try {
- ConnectionFactory cf = this.jmsProvider.connectionFactory();
- Destination dest = this.jmsProvider.destination();
- this.connection = cf.createConnection();
- this.session = connection.createSession(false,
- this.jmsAcknowledgeMode);
- MessageConsumer consumer = session.createConsumer(dest);
- consumer.setMessageListener(this);
- this.connection.start();
- if (this.isDurableSubscription() && this.recoveryPeriod > 0) {
- this.recoveryTimer = new Timer();
- this.recoveryTimer.scheduleAtFixedRate(new RecoveryTask(), 10, this.recoveryPeriod);
- }
-
- } catch (Exception e) {
- LOG.warn("Error creating JMS connection.", e);
- }
-
- }
-
- public void close() {
- try {
- LOG.debug("Closing JMS connection.");
- this.session.close();
- this.connection.close();
- } catch (JMSException e) {
- LOG.warn("Error closing JMS connection.", e);
- }
-
- }
-
- public void nextTuple() {
- Message msg = this.queue.poll();
- if (msg == null) {
- Utils.sleep(50);
- } else {
-
- LOG.debug("sending tuple: " + msg);
- // get the tuple from the handler
- try {
- Values vals = this.tupleProducer.toTuple(msg);
- // ack if we're not in AUTO_ACKNOWLEDGE mode, or the message requests ACKNOWLEDGE
- LOG.debug("Requested deliveryMode: " + toDeliveryModeString(msg.getJMSDeliveryMode()));
- LOG.debug("Our deliveryMode: " + toDeliveryModeString(this.jmsAcknowledgeMode));
- if (this.isDurableSubscription()) {
- LOG.debug("Requesting acks.");
- JmsMessageID messageId = new JmsMessageID(this.messageSequence++, msg.getJMSMessageID());
- this.collector.emit(vals, messageId);
-
- // at this point we successfully emitted. Store
- // the message and message ID so we can do a
- // JMS acknowledge later
- this.pendingMessages.put(messageId, msg);
- this.toCommit.add(messageId);
- } else {
- this.collector.emit(vals);
- }
- } catch (JMSException e) {
- LOG.warn("Unable to convert JMS message: " + msg);
- }
-
- }
-
- }
-
- /*
- * Will only be called if we're transactional or not AUTO_ACKNOWLEDGE
- */
- public void ack(Object msgId) {
-
- Message msg = this.pendingMessages.remove(msgId);
- JmsMessageID oldest = this.toCommit.first();
- if (msgId.equals(oldest)) {
- if (msg != null) {
- try {
- LOG.debug("Committing...");
- msg.acknowledge();
- LOG.debug("JMS Message acked: " + msgId);
- this.toCommit.remove(msgId);
- } catch (JMSException e) {
- LOG.warn("Error acknowldging JMS message: " + msgId, e);
- }
- } else {
- LOG.warn("Couldn't acknowledge unknown JMS message ID: " + msgId);
- }
- } else {
- this.toCommit.remove(msgId);
- }
-
- }
-
- /*
- * Will only be called if we're transactional or not AUTO_ACKNOWLEDGE
- */
- public void fail(Object msgId) {
- LOG.warn("Message failed: " + msgId);
- this.pendingMessages.clear();
- this.toCommit.clear();
- synchronized (this.recoveryMutex) {
- this.hasFailures = true;
- }
- }
-
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- this.tupleProducer.declareOutputFields(declarer);
-
- }
-
- /**
- * Returns <code>true</code> if the spout has received failures
- * from which it has not yet recovered.
- */
- public boolean hasFailures() {
- return this.hasFailures;
- }
-
- protected void recovered() {
- this.hasFailures = false;
- }
-
- /**
- * Sets the periodicity of the timer task that
- * checks for failures and recovers the JMS session.
- *
- * @param period
- */
- public void setRecoveryPeriod(long period) {
- this.recoveryPeriod = period;
- }
-
- public boolean isDistributed() {
- return this.distributed;
- }
-
- /**
- * Sets the "distributed" mode of this spout.
- * <p>
- * If <code>true</code> multiple instances of this spout <i>may</i> be
- * created across the cluster (depending on the "parallelism_hint" in the topology configuration).
- * <p>
- * Setting this value to <code>false</code> essentially means this spout will run as a singleton
- * within the cluster ("parallelism_hint" will be ignored).
- * <p>
- * In general, this should be set to <code>false</code> if the underlying JMS destination is a
- * topic, and <code>true</code> if it is a JMS queue.
- *
- * @param distributed
- */
- public void setDistributed(boolean distributed) {
- this.distributed = distributed;
- }
-
-
- private static final String toDeliveryModeString(int deliveryMode) {
- switch (deliveryMode) {
- case Session.AUTO_ACKNOWLEDGE:
- return "AUTO_ACKNOWLEDGE";
- case Session.CLIENT_ACKNOWLEDGE:
- return "CLIENT_ACKNOWLEDGE";
- case Session.DUPS_OK_ACKNOWLEDGE:
- return "DUPS_OK_ACKNOWLEDGE";
- default:
- return "UNKNOWN";
-
- }
- }
-
- protected Session getSession() {
- return this.session;
- }
-
- private boolean isDurableSubscription() {
- return (this.jmsAcknowledgeMode != Session.AUTO_ACKNOWLEDGE);
- }
-
-
- private class RecoveryTask extends TimerTask {
- private final Logger LOG = LoggerFactory.getLogger(RecoveryTask.class);
-
- public void run() {
- synchronized (JmsSpout.this.recoveryMutex) {
- if (JmsSpout.this.hasFailures()) {
- try {
- LOG.info("Recovering from a message failure.");
- JmsSpout.this.getSession().recover();
- JmsSpout.this.recovered();
- } catch (JMSException e) {
- LOG.warn("Could not recover jms session.", e);
- }
- }
- }
- }
-
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsBatch.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsBatch.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsBatch.java
deleted file mode 100644
index c990058..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsBatch.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.trident;
-
-/**
- * Batch coordination metadata object for the TridentJmsSpout.
- * This implementation does not use batch metadata, so the object is empty.
- *
- */
-public class JmsBatch {
- // Empty class
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsState.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsState.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsState.java
deleted file mode 100644
index bfb78b5..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsState.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.trident;
-
-import org.apache.storm.jms.JmsMessageProducer;
-import org.apache.storm.jms.JmsProvider;
-import org.apache.storm.topology.FailedException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.storm.trident.operation.TridentCollector;
-import org.apache.storm.trident.state.State;
-import org.apache.storm.trident.tuple.TridentTuple;
-
-import javax.jms.*;
-import java.io.Serializable;
-import java.lang.IllegalStateException;
-import java.util.List;
-
-public class JmsState implements State {
-
- private static final Logger LOG = LoggerFactory.getLogger(JmsState.class);
-
- private Options options;
- private Connection connection;
- private Session session;
- private MessageProducer messageProducer;
-
- protected JmsState(Options options) {
- this.options = options;
- }
-
- public static class Options implements Serializable {
- private JmsProvider jmsProvider;
- private JmsMessageProducer msgProducer;
- private int jmsAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;
- private boolean jmsTransactional = true;
-
- public Options withJmsProvider(JmsProvider provider) {
- this.jmsProvider = provider;
- return this;
- }
-
- public Options withMessageProducer(JmsMessageProducer msgProducer) {
- this.msgProducer = msgProducer;
- return this;
- }
-
- public Options withJmsAcknowledgeMode(int jmsAcknowledgeMode) {
- this.jmsAcknowledgeMode = jmsAcknowledgeMode;
- return this;
- }
-
- public Options withJmsTransactional(boolean jmsTransactional) {
- this.jmsTransactional = jmsTransactional;
- return this;
- }
- }
-
- protected void prepare() {
- if(this.options.jmsProvider == null || this.options.msgProducer == null){
- throw new IllegalStateException("JMS Provider and MessageProducer not set.");
- }
- LOG.debug("Connecting JMS..");
- try {
- ConnectionFactory cf = this.options.jmsProvider.connectionFactory();
- Destination dest = this.options.jmsProvider.destination();
- this.connection = cf.createConnection();
- this.session = connection.createSession(this.options.jmsTransactional,
- this.options.jmsAcknowledgeMode);
- this.messageProducer = session.createProducer(dest);
-
- connection.start();
- } catch (Exception e) {
- LOG.warn("Error creating JMS connection.", e);
- }
- }
-
- @Override
- public void beginCommit(Long aLong) {
- }
-
- @Override
- public void commit(Long aLong) {
- LOG.debug("Committing JMS transaction.");
- if(this.options.jmsTransactional) {
- try {
- session.commit();
- } catch(JMSException e){
- LOG.error("JMS Session commit failed.", e);
- }
- }
- }
-
- public void updateState(List<TridentTuple> tuples, TridentCollector collector) throws JMSException {
- try {
- for(TridentTuple tuple : tuples) {
- Message msg = this.options.msgProducer.toMessage(this.session, tuple);
- if (msg != null) {
- if (msg.getJMSDestination() != null) {
- this.messageProducer.send(msg.getJMSDestination(), msg);
- } else {
- this.messageProducer.send(msg);
- }
- }
- }
- } catch (JMSException e) {
- LOG.warn("Failed to send jmd message for a trident batch ", e);
- if(this.options.jmsTransactional) {
- session.rollback();
- }
- throw new FailedException("Failed to write tuples", e);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsStateFactory.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsStateFactory.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsStateFactory.java
deleted file mode 100644
index 9a02ba9..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsStateFactory.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.trident;
-
-import org.apache.storm.task.IMetricsContext;
-import org.apache.storm.trident.state.State;
-import org.apache.storm.trident.state.StateFactory;
-
-import java.util.Map;
-
-public class JmsStateFactory implements StateFactory {
-
- private JmsState.Options options;
-
- public JmsStateFactory(JmsState.Options options) {
- this.options = options;
- }
-
- @Override
- public State makeState(Map map, IMetricsContext iMetricsContext, int partitionIndex, int numPartitions) {
- JmsState state = new JmsState(options);
- state.prepare();
- return state;
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsUpdater.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsUpdater.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsUpdater.java
deleted file mode 100644
index a2709a4..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/JmsUpdater.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.trident;
-
-import org.apache.storm.topology.FailedException;
-import org.apache.storm.trident.operation.TridentCollector;
-import org.apache.storm.trident.state.BaseStateUpdater;
-import org.apache.storm.trident.tuple.TridentTuple;
-
-import javax.jms.JMSException;
-import java.util.List;
-
-public class JmsUpdater extends BaseStateUpdater<JmsState> {
-
- @Override
- public void updateState(JmsState jmsState, List<TridentTuple> tuples, TridentCollector collector) {
- try {
- jmsState.updateState(tuples, collector);
- } catch (JMSException e) {
- throw new FailedException("failed JMS opetation", e);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/TridentJmsSpout.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/TridentJmsSpout.java b/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/TridentJmsSpout.java
deleted file mode 100644
index 55e29bc..0000000
--- a/external/storm-jms/core/src/main/java/org/apache/storm/jms/trident/TridentJmsSpout.java
+++ /dev/null
@@ -1,409 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.trident;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.Session;
-
-import org.apache.storm.jms.JmsProvider;
-import org.apache.storm.jms.JmsTupleProducer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.storm.trident.operation.TridentCollector;
-import org.apache.storm.trident.spout.ITridentSpout;
-import org.apache.storm.trident.topology.TransactionAttempt;
-import org.apache.storm.Config;
-import org.apache.storm.generated.StreamInfo;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsGetter;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-import org.apache.storm.utils.RotatingMap;
-import org.apache.storm.utils.Utils;
-
-/**
- * Trident implementation of the JmsSpout
- * <p>
- *
- */
-public class TridentJmsSpout implements ITridentSpout<JmsBatch> {
-
- public static final String MAX_BATCH_SIZE_CONF = "topology.spout.max.batch.size";
-
- public static final int DEFAULT_BATCH_SIZE = 1000;
-
- private static final long serialVersionUID = -3469351154693356655L;
-
- private JmsTupleProducer tupleProducer;
-
- private JmsProvider jmsProvider;
-
- private int jmsAcknowledgeMode;
-
- private String name;
-
- private static int nameIndex = 1;
-
- /**
- * Create a TridentJmsSpout with a default name and acknowledge mode of AUTO_ACKNOWLEDGE
- */
- public TridentJmsSpout() {
- this.name = "JmsSpout_"+(nameIndex++);
- this.jmsAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;
- }
-
- /**
- * Set the name for this spout, to improve log identification
- * @param name The name to be used in log messages
- * @return This spout
- */
- public TridentJmsSpout named(String name) {
- this.name = name;
- return this;
- }
-
- /**
- * Set the <code>JmsProvider</code>
- * implementation that this Spout will use to connect to
- * a JMS <code>javax.jms.Desination</code>
- *
- * @param provider
- */
- public TridentJmsSpout withJmsProvider(JmsProvider provider){
- this.jmsProvider = provider;
- return this;
- }
-
- /**
- * Set the <code>JmsTupleProducer</code>
- * implementation that will convert <code>javax.jms.Message</code>
- * object to <code>backtype.storm.tuple.Values</code> objects
- * to be emitted.
- *
- * @param tupleProducer
- * @return This spout
- */
- public TridentJmsSpout withTupleProducer(JmsTupleProducer tupleProducer) {
- this.tupleProducer = tupleProducer;
- return this;
- }
-
- /**
- * Set the JMS acknowledge mode for messages being processed by this spout.
- * <p/>
- * Possible values:
- * <ul>
- * <li>javax.jms.Session.AUTO_ACKNOWLEDGE</li>
- * <li>javax.jms.Session.CLIENT_ACKNOWLEDGE</li>
- * <li>javax.jms.Session.DUPS_OK_ACKNOWLEDGE</li>
- * </ul>
- * @param jmsAcknowledgeMode The chosen acknowledge mode
- * @return This spout
- * @throws IllegalArgumentException if the mode is not recognized
- */
- public TridentJmsSpout withJmsAcknowledgeMode(int jmsAcknowledgeMode) {
- toDeliveryModeString(jmsAcknowledgeMode);
- this.jmsAcknowledgeMode = jmsAcknowledgeMode;
- return this;
- }
-
- /**
- * Return a friendly string for the given JMS acknowledge mode, or throw an IllegalArgumentException if
- * the mode is not recognized.
- * <p/>
- * Possible values:
- * <ul>
- * <li>javax.jms.Session.AUTO_ACKNOWLEDGE</li>
- * <li>javax.jms.Session.CLIENT_ACKNOWLEDGE</li>
- * <li>javax.jms.Session.DUPS_OK_ACKNOWLEDGE</li>
- * </ul>
- * @param acknowledgeMode A valid JMS acknowledge mode
- * @return A friendly string describing the acknowledge mode
- * @throws IllegalArgumentException if the mode is not recognized
- */
- private static final String toDeliveryModeString(int acknowledgeMode) {
- switch (acknowledgeMode) {
- case Session.AUTO_ACKNOWLEDGE:
- return "AUTO_ACKNOWLEDGE";
- case Session.CLIENT_ACKNOWLEDGE:
- return "CLIENT_ACKNOWLEDGE";
- case Session.DUPS_OK_ACKNOWLEDGE:
- return "DUPS_OK_ACKNOWLEDGE";
- default:
- throw new IllegalArgumentException("Unknown JMS Acknowledge mode " + acknowledgeMode + " (See javax.jms.Session for valid values)");
- }
- }
-
- @Override
- public ITridentSpout.BatchCoordinator<JmsBatch> getCoordinator(
- String txStateId, @SuppressWarnings("rawtypes") Map conf, TopologyContext context) {
- return new JmsBatchCoordinator(name);
- }
-
- @Override
- public Emitter<JmsBatch> getEmitter(String txStateId, @SuppressWarnings("rawtypes") Map conf, TopologyContext context) {
- return new JmsEmitter(name, jmsProvider, tupleProducer, jmsAcknowledgeMode, conf);
- }
-
- @Override
- public Map<String, Object> getComponentConfiguration() {
- return null;
- }
-
- @Override
- public Fields getOutputFields() {
- OutputFieldsGetter fieldGetter = new OutputFieldsGetter();
- tupleProducer.declareOutputFields(fieldGetter);
- StreamInfo streamInfo = fieldGetter.getFieldsDeclaration().get(Utils.DEFAULT_STREAM_ID);
- if (streamInfo == null) {
- throw new IllegalArgumentException("Jms Tuple producer has not declared output fields for the default stream");
- }
-
- return new Fields(streamInfo.get_output_fields());
- }
-
- /**
- * The JmsEmitter class listens for incoming messages and stores them in a blocking queue. On each invocation of emit,
- * the queued messages are emitted as a batch.
- *
- */
- private class JmsEmitter implements Emitter<JmsBatch>, MessageListener {
-
- private final LinkedBlockingQueue<Message> queue;
- private final Connection connection;
- private final Session session;
-
- private final RotatingMap<Long, List<Message>> batchMessageMap; // Maps transaction Ids to JMS message ids.
-
- private final long rotateTimeMillis;
- private final int maxBatchSize;
- private final String name;
-
- private long lastRotate;
-
- private final Logger LOG = LoggerFactory.getLogger(JmsEmitter.class);
-
- public JmsEmitter(String name, JmsProvider jmsProvider, JmsTupleProducer tupleProducer, int jmsAcknowledgeMode, @SuppressWarnings("rawtypes") Map conf) {
- if (jmsProvider == null) {
- throw new IllegalStateException("JMS provider has not been set.");
- }
- if (tupleProducer == null) {
- throw new IllegalStateException("JMS Tuple Producer has not been set.");
- }
-
- this.queue = new LinkedBlockingQueue<Message>();
- this.name = name;
-
- batchMessageMap = new RotatingMap<Long, List<Message>>(3);
- rotateTimeMillis = 1000L * ((Number)conf.get(Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS)).intValue();
- lastRotate = System.currentTimeMillis();
-
- Number batchSize = (Number) conf.get(MAX_BATCH_SIZE_CONF);
- maxBatchSize = batchSize != null ? batchSize.intValue() : DEFAULT_BATCH_SIZE;
-
- try {
- ConnectionFactory cf = jmsProvider.connectionFactory();
- Destination dest = jmsProvider.destination();
- this.connection = cf.createConnection();
- this.session = connection.createSession(false, jmsAcknowledgeMode);
- MessageConsumer consumer = session.createConsumer(dest);
- consumer.setMessageListener(this);
- this.connection.start();
-
- LOG.info("Created JmsEmitter with max batch size "+maxBatchSize+" rotate time "+rotateTimeMillis+"ms and destination "+dest+" for "+name);
-
- } catch (Exception e) {
- LOG.warn("Error creating JMS connection.", e);
- throw new IllegalStateException("Could not create JMS connection for spout ", e);
- }
-
- }
-
- @Override
- public void success(TransactionAttempt tx) {
-
- @SuppressWarnings("unchecked")
- List<Message> messages = (List<Message>) batchMessageMap.remove(tx.getTransactionId());
-
- if (messages != null) {
- if (!messages.isEmpty()) {
- LOG.debug("Success for batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId()+" for "+name);
- }
-
- for (Message msg: messages) {
- String messageId = "UnknownId";
-
- try {
- messageId = msg.getJMSMessageID();
- msg.acknowledge();
- LOG.trace("Acknowledged message "+messageId);
- } catch (JMSException e) {
- LOG.warn("Failed to acknowledge message "+messageId, e);
- }
- }
- }
- else {
- LOG.warn("No messages found in batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId());
- }
- }
-
- /**
- * Fail a batch with the given transaction id. This is called when a batch is timed out, or a new batch with a
- * matching transaction id is emitted. Note that the current implementation does nothing - i.e. it discards
- * messages that have been failed.
- * @param transactionId The transaction id of the failed batch
- * @param messages The list of messages to fail.
- */
- private void fail(Long transactionId, List<Message> messages) {
- LOG.debug("Failure for batch with transaction id "+transactionId+" for "+name);
- if (messages != null) {
- for (Message msg: messages) {
- try {
- LOG.trace("Failed message "+msg.getJMSMessageID());
- } catch (JMSException e) {
- LOG.warn("Could not identify failed message ", e);
- }
- }
- }
- else {
- LOG.warn("Failed batch has no messages with transaction id "+transactionId);
- }
- }
-
- @Override
- public void close() {
- try {
- LOG.info("Closing JMS connection.");
- this.session.close();
- this.connection.close();
- } catch (JMSException e) {
- LOG.warn("Error closing JMS connection.", e);
- }
- }
-
- @Override
- public void emitBatch(TransactionAttempt tx, JmsBatch coordinatorMeta,
- TridentCollector collector) {
-
- long now = System.currentTimeMillis();
- if(now - lastRotate > rotateTimeMillis) {
- Map<Long, List<Message>> failed = batchMessageMap.rotate();
- for(Long id: failed.keySet()) {
- LOG.warn("TIMED OUT batch with transaction id "+id+" for "+name);
- fail(id, failed.get(id));
- }
- lastRotate = now;
- }
-
- if(batchMessageMap.containsKey(tx.getTransactionId())) {
- LOG.warn("FAILED duplicate batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId()+" for "+name);
- fail(tx.getTransactionId(), batchMessageMap.get(tx.getTransactionId()));
- }
-
- List<Message> batchMessages = new ArrayList<Message>();
-
- for (int index=0; index<maxBatchSize; index++) {
- Message msg = queue.poll();
- if (msg == null) {
- Utils.sleep(50); // Back off
- break;
- }
-
- try {
- if (TridentJmsSpout.this.jmsAcknowledgeMode != Session.AUTO_ACKNOWLEDGE) {
- batchMessages.add(msg);
- }
- Values tuple = tupleProducer.toTuple(msg);
- collector.emit(tuple);
- } catch (JMSException e) {
- LOG.warn("Failed to emit message, could not retrieve data for "+name+": "+e );
- }
- }
-
- if (!batchMessages.isEmpty()) {
- LOG.debug("Emitting batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId()+" and size "+batchMessages.size()+" for "+name);
- }
- else {
- LOG.trace("No items to acknowledge for batch with transaction id "+tx.getTransactionId()+"/"+tx.getAttemptId()+" for "+name);
- }
- batchMessageMap.put(tx.getTransactionId(), batchMessages);
- }
-
- @Override
- public void onMessage(Message msg) {
- try {
- LOG.trace("Queuing msg [" + msg.getJMSMessageID() + "]");
- } catch (JMSException e) {
- // Nothing here, could not get message id
- }
- this.queue.offer(msg);
- }
-
- }
-
- /**
- * Bare implementation of a BatchCoordinator, returning a null JmsBatch object
- *
- */
- private class JmsBatchCoordinator implements BatchCoordinator<JmsBatch> {
-
- private final String name;
-
- private final Logger LOG = LoggerFactory.getLogger(JmsBatchCoordinator.class);
-
- public JmsBatchCoordinator(String name) {
- this.name = name;
- LOG.info("Created batch coordinator for "+name);
- }
-
- @Override
- public JmsBatch initializeTransaction(long txid, JmsBatch prevMetadata, JmsBatch curMetadata) {
- LOG.debug("Initialise transaction "+txid+" for "+name);
- return null;
- }
-
- @Override
- public void success(long txid) {
- }
-
- @Override
- public boolean isReady(long txid) {
- return true;
- }
-
- @Override
- public void close() {
- }
-
- }
-
-}
-
-
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/JmsSpoutTest.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/JmsSpoutTest.java b/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/JmsSpoutTest.java
deleted file mode 100644
index e80f70a..0000000
--- a/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/JmsSpoutTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.spout;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.util.HashMap;
-
-import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.TextMessage;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import org.apache.storm.jms.JmsProvider;
-import org.apache.storm.spout.SpoutOutputCollector;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JmsSpoutTest {
- private static final Logger LOG = LoggerFactory.getLogger(JmsSpoutTest.class);
-
- @Test
- public void testFailure() throws JMSException, Exception{
- JmsSpout spout = new JmsSpout();
- JmsProvider mockProvider = new MockJmsProvider();
- MockSpoutOutputCollector mockCollector = new MockSpoutOutputCollector();
- SpoutOutputCollector collector = new SpoutOutputCollector(mockCollector);
- spout.setJmsProvider(new MockJmsProvider());
- spout.setJmsTupleProducer(new MockTupleProducer());
- spout.setJmsAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
- spout.setRecoveryPeriod(10); // Rapid recovery for testing.
- spout.open(new HashMap<String,String>(), null, collector);
- Message msg = this.sendMessage(mockProvider.connectionFactory(), mockProvider.destination());
- Thread.sleep(100);
- spout.nextTuple(); // Pretend to be storm.
- Assert.assertTrue(mockCollector.emitted);
-
- mockCollector.reset();
- spout.fail(msg.getJMSMessageID()); // Mock failure
- Thread.sleep(5000);
- spout.nextTuple(); // Pretend to be storm.
- Thread.sleep(5000);
- Assert.assertTrue(mockCollector.emitted); // Should have been re-emitted
- }
-
- @Test
- public void testSerializability() throws IOException{
- JmsSpout spout = new JmsSpout();
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(out);
- oos.writeObject(spout);
- oos.close();
- Assert.assertTrue(out.toByteArray().length > 0);
- }
-
- public Message sendMessage(ConnectionFactory connectionFactory, Destination destination) throws JMSException {
- Session mySess = connectionFactory.createConnection().createSession(false, Session.CLIENT_ACKNOWLEDGE);
- MessageProducer producer = mySess.createProducer(destination);
- TextMessage msg = mySess.createTextMessage();
- msg.setText("Hello World");
- LOG.info("Sending Message: {}", msg.getText());
- producer.send(msg);
- return msg;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockJmsProvider.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockJmsProvider.java b/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockJmsProvider.java
deleted file mode 100644
index 3ba0853..0000000
--- a/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockJmsProvider.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.spout;
-
-import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
-import org.apache.activemq.ActiveMQConnectionFactory;
-
-import org.apache.storm.jms.JmsProvider;
-
-public class MockJmsProvider implements JmsProvider {
- private static final long serialVersionUID = 1L;
-
- private ConnectionFactory connectionFactory = null;
- private Destination destination = null;
-
- public MockJmsProvider() throws NamingException{
- this.connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
- Context jndiContext = new InitialContext();
- this.destination = (Destination) jndiContext.lookup("dynamicQueues/FOO.BAR");
-
- }
-
- /**
- * Provides the JMS <code>ConnectionFactory</code>
- * @return the connection factory
- * @throws Exception
- */
- public ConnectionFactory connectionFactory() throws Exception{
- return this.connectionFactory;
- }
-
- /**
- * Provides the <code>Destination</code> (topic or queue) from which the
- * <code>JmsSpout</code> will receive messages.
- * @return
- * @throws Exception
- */
- public Destination destination() throws Exception{
- return this.destination;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockSpoutOutputCollector.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockSpoutOutputCollector.java b/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockSpoutOutputCollector.java
deleted file mode 100644
index a5a6c51..0000000
--- a/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockSpoutOutputCollector.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.spout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.storm.spout.ISpoutOutputCollector;
-
-public class MockSpoutOutputCollector implements ISpoutOutputCollector {
- boolean emitted = false;
-
- @Override
- public List<Integer> emit(String streamId, List<Object> tuple, Object messageId) {
- emitted = true;
- return new ArrayList<Integer>();
- }
-
- @Override
- public void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId) {
- emitted = true;
- }
-
- @Override
- public void reportError(Throwable error) {
- }
-
- public boolean emitted(){
- return this.emitted;
- }
-
- public void reset(){
- this.emitted = false;
- }
-
- @Override
- public long getPendingCount() {
- return 0;
- }
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockTupleProducer.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockTupleProducer.java b/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockTupleProducer.java
deleted file mode 100644
index ea571fc..0000000
--- a/external/storm-jms/core/src/test/java/org/apache/storm/jms/spout/MockTupleProducer.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.spout;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.TextMessage;
-
-import org.apache.storm.jms.JmsTupleProducer;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-
-public class MockTupleProducer implements JmsTupleProducer {
- private static final long serialVersionUID = 1L;
-
- @Override
- public Values toTuple(Message msg) throws JMSException {
- if (msg instanceof TextMessage) {
- String json = ((TextMessage) msg).getText();
- return new Values(json);
- } else {
- return null;
- }
- }
-
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields("json"));
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/core/src/test/resources/jndi.properties
----------------------------------------------------------------------
diff --git a/external/storm-jms/core/src/test/resources/jndi.properties b/external/storm-jms/core/src/test/resources/jndi.properties
deleted file mode 100644
index af19521..0000000
--- a/external/storm-jms/core/src/test/resources/jndi.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
-java.naming.provider.url = vm://localhost?broker.persistent=false
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/examples/README.markdown
----------------------------------------------------------------------
diff --git a/external/storm-jms/examples/README.markdown b/external/storm-jms/examples/README.markdown
deleted file mode 100644
index 7a4d8f0..0000000
--- a/external/storm-jms/examples/README.markdown
+++ /dev/null
@@ -1,12 +0,0 @@
-## About Storm JMS Examples
-This project contains a simple storm topology that illustrates the usage of "storm-jms".
-
-To build:
-
-`mvn clean install`
-
-The default build will create a jar file that can be deployed to to a Storm cluster in the "target" directory:
-
-`storm-jms-examples-0.1-SNAPSHOT-jar-with-dependencies.jar`
-
-
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/examples/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-jms/examples/pom.xml b/external/storm-jms/examples/pom.xml
deleted file mode 100644
index b099b88..0000000
--- a/external/storm-jms/examples/pom.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-jms-parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
-
- <artifactId>storm-jms-examples</artifactId>
-
- <properties>
- <spring.version>2.5.6</spring.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jms</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.xbean</groupId>
- <artifactId>xbean-spring</artifactId>
- <version>3.7</version>
- </dependency>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-core</artifactId>
- <version>${project.version}</version>
- <!-- keep storm out of the jar-with-dependencies -->
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-jms</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-core</artifactId>
- <version>5.4.0</version>
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </exclusion>
- <exclusion>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <!-- bind the maven-assembly-plugin to the package phase this will create
- a jar file without the storm dependencies suitable for deployment to a cluster. -->
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <configuration>
- <descriptorRefs>
- <descriptorRef>jar-with-dependencies</descriptorRef>
- </descriptorRefs>
- <archive>
- <manifest>
- </manifest>
- </archive>
- </configuration>
- <executions>
- <execution>
- <id>make-assembly</id>
- <phase>package</phase>
- <goals>
- <goal>single</goal>
- </goals>
- </execution>
- </executions>
-
- </plugin>
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>exec-maven-plugin</artifactId>
- <version>1.2.1</version>
- <executions>
- <execution>
- <goals>
- <goal>exec</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <executable>java</executable>
- <includeProjectDependencies>true</includeProjectDependencies>
- <includePluginDependencies>true</includePluginDependencies>
- <mainClass>org.apache.storm.jms.example.ExampleJmsTopology</mainClass>
- <systemProperties>
- <systemProperty>
- <key>log4j.configuration</key>
- <value>file:./src/main/resources/log4j.properties</value>
- </systemProperty>
- </systemProperties>
- </configuration>
- <dependencies>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-core</artifactId>
- <version>${project.version}</version>
- <type>jar</type>
- </dependency>
- </dependencies>
- </plugin>
- </plugins>
- </build>
-</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/ExampleJmsTopology.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/ExampleJmsTopology.java b/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/ExampleJmsTopology.java
deleted file mode 100644
index 82dbd5b..0000000
--- a/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/ExampleJmsTopology.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.example;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import javax.jms.TextMessage;
-
-import org.apache.storm.Config;
-import org.apache.storm.LocalCluster;
-import org.apache.storm.LocalCluster.LocalTopology;
-import org.apache.storm.StormSubmitter;
-import org.apache.storm.jms.JmsMessageProducer;
-import org.apache.storm.jms.JmsProvider;
-import org.apache.storm.jms.JmsTupleProducer;
-import org.apache.storm.jms.bolt.JmsBolt;
-import org.apache.storm.jms.spout.JmsSpout;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.ITuple;
-import org.apache.storm.utils.Utils;
-
-public class ExampleJmsTopology {
- public static final String JMS_QUEUE_SPOUT = "JMS_QUEUE_SPOUT";
- public static final String INTERMEDIATE_BOLT = "INTERMEDIATE_BOLT";
- public static final String FINAL_BOLT = "FINAL_BOLT";
- public static final String JMS_TOPIC_BOLT = "JMS_TOPIC_BOLT";
- public static final String JMS_TOPIC_SPOUT = "JMS_TOPIC_SPOUT";
- public static final String ANOTHER_BOLT = "ANOTHER_BOLT";
-
- @SuppressWarnings("serial")
- public static void main(String[] args) throws Exception {
-
- // JMS Queue Provider
- JmsProvider jmsQueueProvider = new SpringJmsProvider(
- "jms-activemq.xml", "jmsConnectionFactory",
- "notificationQueue");
-
- // JMS Topic provider
- JmsProvider jmsTopicProvider = new SpringJmsProvider(
- "jms-activemq.xml", "jmsConnectionFactory",
- "notificationTopic");
-
- // JMS Producer
- JmsTupleProducer producer = new JsonTupleProducer();
-
- // JMS Queue Spout
- JmsSpout queueSpout = new JmsSpout();
- queueSpout.setJmsProvider(jmsQueueProvider);
- queueSpout.setJmsTupleProducer(producer);
- queueSpout.setJmsAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
- queueSpout.setDistributed(true); // allow multiple instances
-
- TopologyBuilder builder = new TopologyBuilder();
-
- // spout with 5 parallel instances
- builder.setSpout(JMS_QUEUE_SPOUT, queueSpout, 5);
-
- // intermediate bolt, subscribes to jms spout, anchors on tuples, and auto-acks
- builder.setBolt(INTERMEDIATE_BOLT,
- new GenericBolt("INTERMEDIATE_BOLT", true, true, new Fields("json")), 3).shuffleGrouping(
- JMS_QUEUE_SPOUT);
-
- // bolt that subscribes to the intermediate bolt, and auto-acks
- // messages.
- builder.setBolt(FINAL_BOLT, new GenericBolt("FINAL_BOLT", true, true), 3).shuffleGrouping(
- INTERMEDIATE_BOLT);
-
- // bolt that subscribes to the intermediate bolt, and publishes to a JMS Topic
- JmsBolt jmsBolt = new JmsBolt();
- jmsBolt.setJmsProvider(jmsTopicProvider);
-
- // anonymous message producer just calls toString() on the tuple to create a jms message
- jmsBolt.setJmsMessageProducer(new JmsMessageProducer() {
- @Override
- public Message toMessage(Session session, ITuple input) throws JMSException {
- System.out.println("Sending JMS Message:" + input.toString());
- TextMessage tm = session.createTextMessage(input.toString());
- return tm;
- }
- });
-
- builder.setBolt(JMS_TOPIC_BOLT, jmsBolt).shuffleGrouping(INTERMEDIATE_BOLT);
-
- // JMS Topic spout
- JmsSpout topicSpout = new JmsSpout();
- topicSpout.setJmsProvider(jmsTopicProvider);
- topicSpout.setJmsTupleProducer(producer);
- topicSpout.setJmsAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
- topicSpout.setDistributed(false);
-
- builder.setSpout(JMS_TOPIC_SPOUT, topicSpout);
-
- builder.setBolt(ANOTHER_BOLT, new GenericBolt("ANOTHER_BOLT", true, true), 1).shuffleGrouping(
- JMS_TOPIC_SPOUT);
-
- Config conf = new Config();
-
- if (args.length > 0) {
- conf.setNumWorkers(3);
-
- StormSubmitter.submitTopology(args[0], conf,
- builder.createTopology());
- } else {
-
- conf.setDebug(true);
-
- try (LocalCluster cluster = new LocalCluster();
- LocalTopology topo = cluster.submitTopology("storm-jms-example", conf, builder.createTopology());) {
- Utils.sleep(60000);
- }
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/GenericBolt.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/GenericBolt.java b/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/GenericBolt.java
deleted file mode 100644
index 57de1ba..0000000
--- a/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/GenericBolt.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.example;
-
-import java.util.Map;
-
-import org.apache.storm.topology.base.BaseRichBolt;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-
-/**
- * A generic <code>org.apache.storm.topology.IRichBolt</code> implementation
- * for testing/debugging the Storm JMS Spout and example topologies.
- * <p>
- * For debugging purposes, set the log level of the
- * <code>org.apache.storm.contrib.jms</code> package to DEBUG for debugging
- * output.
- *
- * @author tgoetz
- */
-@SuppressWarnings("serial")
-public class GenericBolt extends BaseRichBolt {
- private static final Logger LOG = LoggerFactory.getLogger(GenericBolt.class);
- private OutputCollector collector;
- private boolean autoAck = false;
- private boolean autoAnchor = false;
- private Fields declaredFields;
- private String name;
-
- /**
- * Constructs a new <code>GenericBolt</code> instance.
- *
- * @param name The name of the bolt (used in DEBUG logging)
- * @param autoAck Whether or not this bolt should automatically acknowledge received tuples.
- * @param autoAnchor Whether or not this bolt should automatically anchor to received tuples.
- * @param declaredFields The fields this bolt declares as output.
- */
- public GenericBolt(String name, boolean autoAck, boolean autoAnchor, Fields declaredFields) {
- this.name = name;
- this.autoAck = autoAck;
- this.autoAnchor = autoAnchor;
- this.declaredFields = declaredFields;
- }
-
- public GenericBolt(String name, boolean autoAck, boolean autoAnchor) {
- this(name, autoAck, autoAnchor, null);
- }
-
- @SuppressWarnings("rawtypes")
- public void prepare(Map stormConf, TopologyContext context,
- OutputCollector collector) {
- this.collector = collector;
-
- }
-
- public void execute(Tuple input) {
- LOG.debug("[" + this.name + "] Received message: " + input);
-
-
- // only emit if we have declared fields.
- if (this.declaredFields != null) {
- LOG.debug("[" + this.name + "] emitting: " + input);
- if (this.autoAnchor) {
- this.collector.emit(input, input.getValues());
- } else {
- this.collector.emit(input.getValues());
- }
- }
-
- if (this.autoAck) {
- LOG.debug("[" + this.name + "] ACKing tuple: " + input);
- this.collector.ack(input);
- }
-
- }
-
- public void cleanup() {
-
- }
-
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- if (this.declaredFields != null) {
- declarer.declare(this.declaredFields);
- }
- }
-
- public boolean isAutoAck() {
- return this.autoAck;
- }
-
- public void setAutoAck(boolean autoAck) {
- this.autoAck = autoAck;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/JsonTupleProducer.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/JsonTupleProducer.java b/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/JsonTupleProducer.java
deleted file mode 100644
index 9ee175e..0000000
--- a/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/JsonTupleProducer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.example;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.TextMessage;
-
-import org.apache.storm.jms.JmsTupleProducer;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-
-/**
- * A simple <code>JmsTupleProducer</code> that expects to receive
- * JMS <code>TextMessage</code> objects with a body in JSON format.
- * <p/>
- * Ouputs a tuple with field name "json" and a string value
- * containing the raw json.
- * <p/>
- * <b>NOTE: </b> Currently this implementation assumes the text is valid
- * JSON and does not attempt to parse or validate it.
- *
- * @author tgoetz
- *
- */
-@SuppressWarnings("serial")
-public class JsonTupleProducer implements JmsTupleProducer {
-
- public Values toTuple(Message msg) throws JMSException {
- if(msg instanceof TextMessage){
- String json = ((TextMessage) msg).getText();
- return new Values(json);
- } else {
- return null;
- }
- }
-
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields("json"));
- }
-
-}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/SpringJmsProvider.java
----------------------------------------------------------------------
diff --git a/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/SpringJmsProvider.java b/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/SpringJmsProvider.java
deleted file mode 100644
index 306fc25..0000000
--- a/external/storm-jms/examples/src/main/java/org/apache/storm/jms/example/SpringJmsProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.storm.jms.example;
-
-import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
-
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-import org.apache.storm.jms.JmsProvider;
-
-
-/**
- * A <code>JmsProvider</code> that uses the spring framework
- * to obtain a JMS <code>ConnectionFactory</code> and
- * <code>Desitnation</code> objects.
- * <p/>
- * The constructor takes three arguments:
- * <ol>
- * <li>A string pointing to the the spring application context file contining the JMS configuration
- * (must be on the classpath)
- * </li>
- * <li>The name of the connection factory bean</li>
- * <li>The name of the destination bean</li>
- * </ol>
- *
- *
- *
- */
-@SuppressWarnings("serial")
-public class SpringJmsProvider implements JmsProvider {
- private ConnectionFactory connectionFactory;
- private Destination destination;
-
- /**
- * Constructs a <code>SpringJmsProvider</code> object given the name of a
- * classpath resource (the spring application context file), and the bean
- * names of a JMS connection factory and destination.
- *
- * @param appContextClasspathResource - the spring configuration file (classpath resource)
- * @param connectionFactoryBean - the JMS connection factory bean name
- * @param destinationBean - the JMS destination bean name
- */
- public SpringJmsProvider(String appContextClasspathResource, String connectionFactoryBean, String destinationBean){
- ApplicationContext context = new ClassPathXmlApplicationContext(appContextClasspathResource);
- this.connectionFactory = (ConnectionFactory)context.getBean(connectionFactoryBean);
- this.destination = (Destination)context.getBean(destinationBean);
- }
-
- public ConnectionFactory connectionFactory() throws Exception {
- return this.connectionFactory;
- }
-
- public Destination destination() throws Exception {
- return this.destination;
- }
-
-}
[09/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/sampledata/randomwords.txt
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/sampledata/randomwords.txt b/examples/storm-perf/src/main/sampledata/randomwords.txt
new file mode 100644
index 0000000..1b800cf
--- /dev/null
+++ b/examples/storm-perf/src/main/sampledata/randomwords.txt
@@ -0,0 +1,14049 @@
+Hester starosta Bassaris guanajuatite pinulus debromination
+outhue pamphlet Socraticism tomorrowness masa Bertat Vichyite
+epauliere magnificently Mormyrus circumzenithal sapphiric Homoiousian misthread
+Pithecolobium saguran hemimelus epauliere symbiogenetically
+chronist cervisial euphemious topline sandbox pneumonalgia Babylonism sawdust by
+figured impressor theologicopolitical scrat arsenide cockal roughcast introducer playfellowship
+potentness Tsonecan ovopyriform inertly Bertat acocotl whitlowwort
+Gothish Pishquow corona interruptedness glossing molecule preagitate
+seelful unscourged swangy Mycogone bogydom nummi homotransplant unburnt
+guitarist cockal Coniferae cylindric ovopyriform nonmanufacture monilioid hypochondriacism
+underogating impairment genii Ludgatian palaeotheriodont marten
+euphonym zoonitic cervisial Bertat guanajuatite Vaishnavism nonsuppressed subsequentially
+scotale semiangle epididymitis bestill nonutilitarian lifter pyrocatechol obolus
+scrat unpremonished ungrave undeterring winterproof zanyism Itea tonsure
+antideflation rivethead seeingness snare refasten repealableness monstership bacillite
+biodynamics antiadiaphorist strander undangered Hester
+overwoven fallacious yawler seelful helminthagogic
+quad putative whittle placatory vinny nebular sialadenitis
+epauliere elemicin greave relaster pyroacetic nectopod nonexecutive weism dunkadoo
+sarcologist tetragynian cubit frictionlessly magnetooptics undangered glyphography vinny
+bladderwort unobservantness unswanlike terrestrially botchedly ultraobscure
+papery mesymnion embryotic Bulanda pumpkinification Bassaris cromlech ungrave
+Semecarpus commotion familist uncontradictableness manny vinny
+eurythermal enation oratorship cretaceous hypoid
+biopsic yote ineunt subangulated mutter barkometer
+manny signifier brag heavenful Homoiousian undeterring michigan
+ultratense Protestantize angina zenick swearingly unexplicit
+monstership unrepealably shibuichi enhedge pachydermous bozal rechar lineamental
+thermochemically nonutilitarian uninterpleaded Florissant ineunt jharal aneurism stachyuraceous
+neuromimesis reperuse magnificently scyphostoma manganosiderite
+merciful becomma unrealize Vaishnavism superindifference trillium soorkee rechar
+lienteria Orbitolina Protestantize Gothish molossic nonsuppressed nonutilitarian
+cyanoguanidine feasibleness unstipulated thermoresistant slait Inger characinoid
+transudatory seizing ungreat almud monander abstractionism socioromantic
+sequestrum sequestrum widdle angina bacillite
+tum beatable seraphism bozal cattimandoo skyshine sombreroed emir
+circular strander diplomatize veterinarian inertly prolificy prepavement
+taver sequestrum corbel classificational mangonism strander swacking
+unrevolting Sebastian spiranthic hepatorrhaphy oflete subangulated subtransverse
+unharmed myesthesia trophonema bozal immatchable
+uninhabitedness eristically Eryon allegedly daytime periclitation phallaceous
+phytonic yote Serrifera nonmanufacture Animalivora
+bozal gunshop ornithodelphous Tamil chorograph Quakerishly outwealth laryngic hepatorrhaphy
+pinulus uninhabitedness endotheliomyoma unachievable Confervales ladhood chilblain
+unachievable nonmanufacture rave Prosobranchiata dermorhynchous minniebush oinomancy overinstruct ventricous
+precostal ununiformly mastication figured idiotize antihero
+Kenipsim beneficent blurredness Dawsonia twinling phallaceous impugnation dermorhynchous
+packsack zanyism breadwinner Megaluridae uncarefully zenick dishpan squdge
+dialoguer theologicopolitical subfoliar mangonism mustafina champer
+Consolamentum exploiter imperceptivity nectopod breadwinner floatability
+heavenful theologicopolitical pyrocatechol ferrogoslarite infestation dermorhynchous lampyrine
+shallowish crystallographical uninhabitedness cocksuredom yawler hysterolysis genii bromic
+antalgol chronographic chasmy proboscidiform craglike stiffish
+marshiness Scanic adz uninterpleaded trailmaking stormy impairment Dunlop pinulus
+mechanist helminthagogic semantician ununiformly incomprehensible equiconvex adatom transcorporeal sertularian
+migrainoid bacillite wandoo sapience counteralliance preparative unpeople aurothiosulphuric
+deindividualization astucious rede schoolmasterism boor alveolite bogydom unaccessible tendomucoid
+glyphography antihero furacious centrifugalization eurythermal atlantite counteractively metaphonical
+Hydrangea spermaphyte canicule impugnation meloplasty introducer
+lithotresis Effie saccharogenic arsenide porencephalous speckedness
+bought patroller uvanite unevoked basto dehairer bought
+posterishness overstaid exploiter mesymnion angina oratorize winterproof Ochnaceae iniquitously
+jharal gallybeggar marshiness subdentate twinling redecrease ramosopalmate
+chronist underskin wandoo diurnalness haply helpless chilblain unforkedness
+epididymitis archesporial uncompromisingly mesymnion karyological yawler
+ventricous horsefly bespin autobiographist deaf Lemuridae Caphtor misexposition
+abscission masa scyphostoma pentafid nonlustrous lebensraum
+posttraumatic uninductive sloped transude enation lithograph pachydermous papery
+weism proacquittal greave Scorpaenidae arrowworm
+velaric doubtingness Swaziland unstressedly coracomandibular
+iniquitously suspend relaster dunkadoo Glecoma larklike uncompromisingly unscourged
+macropterous reappreciate countergabion immatchable ovopyriform Russifier thiodiazole rizzomed sequacity
+neuromimesis balladmonger bladderwort furacious nonpoisonous tetchy pumpkinification laryngic Effie
+opacousness cacuminal unleavened lithotresis metaphonical antideflation feasibleness subfebrile
+underskin unpatched Gothish stradametrical yeat
+Dawsonia counteractively merciful doubtingness Spencerism havoc involatile precostal
+Mormyrus calabazilla tomorn valvula glandularly supraoesophageal ungrave
+overstaid throbless lampyrine phallaceous experientialist blurredness okonite
+subdrainage periarthritis unrepealably enation pansophism
+helminthagogic digitule quarried metastoma molecule Uraniidae harr mediateness slipped
+Aktistetae diminutively cresylite antihero spiciferous ascitic
+dehairer mangonism Lincolnlike prescriber templar
+Ophiosaurus plerome tantivy diplomatize squdge venialness
+imprescribable angiolymphoma seeingness exprobratory Glecoma mechanist avengeful diopside uncontradictableness
+decidable parodist unexplicit physiologian Munychian parabolicness propheticism
+homotransplant reperuse antiabolitionist sialadenitis plerome Dunlop uncontradictableness
+pachydermous preoral chargeably sterilely aneurism cubby yeelaman
+migrainoid totaquina benthonic centrifugalization pyroacetic nonutilitarian corona
+interruptor diatomaceous oxyterpene beneficent returnability molecule
+tantivy comism misthread cubby cretaceous ungrave
+eristically waird overcontribute totaquina proboscidiform tramplike
+counteralliance ungreat unchatteled bucketer bespin parastas defensibly chasmy
+calabazilla cubit synovial bacterioblast neurodegenerative apopenptic asparaginic
+inductivity undinted thermochemically antiabolitionist pendulant
+pachydermous tum Pishquow inertly ventricous
+manganosiderite skyshine Bishareen tailoress transcortical homeotypical glacierist
+devilwise enhedge pendulant cervisial preagitate yote eucalypteol cornberry clanned
+subfoliar impairment bromic Eryon centrifugalization mericarp folious
+dithery exploiter liquidity imaginary bismuthiferous archididascalian monstership eer
+astucious triradiated uncontradictableness pneumatotherapy overstudiousness fetlocked counteralliance Aplacentalia
+ticktick antideflation larklike Macraucheniidae nonlustrous Confervales nonlustrous antideflation
+extraorganismal apopenptic subdentate pachydermous metastoma abusiveness
+Zuludom insatiately Passiflorales oinomancy antideflation fetlocked Consolamentum
+dishpan cromlech sapphiric putative unreprimanded cumbrousness lifter agglomeratic karyological
+laubanite Cephalodiscus Zuludom unbashfulness obispo tonsure incalculable
+periclitation approbation imperceptivity sequentially wingable
+arsenide feasibleness spiciferous choralcelo manilla undinted Jerusalem goladar stewardship
+Bulanda visceral orthopedical antideflation epauliere codisjunct poleax kerykeion
+by misexposition benzothiofuran macropterous gallybeggar sviatonosite
+heliocentricism unpeople unlapsing chorograph transcortical unlapsing
+sawdust byroad iniquitously omega subfoliar ethnocracy jajman aprosopia
+Hester foursquare Helvidian diwata reformatory putative louse unscourged
+Quakerishly prolificy avengeful commotion temporomastoid
+cacuminal hypochondriacism cornberry brooky terrificness iniquitously undeterring
+terrestrially seelful parabolicness benzoperoxide approbation
+Machiavel subangulated overcrown yeat involatile
+nummi stachyuraceous Mormyrus lebensraum chronist subfebrile barkometer
+unpredict meloplasty characinoid hemimelus velaric aconitine figureheadship
+impugnation sturdied Hester alen zanyism consumptional
+horsefly enhedge projecting tomorrowness eer debromination doubtingness unpatched gemmeous
+metrocratic gemmeous uncombable slait papery depressingly
+flutist deindividualization scapuloradial perculsive selectivity Spencerism
+equiconvex pamphlet cervisial micromembrane paleornithology serosanguineous cuproiodargyrite
+reperuse quailberry diopside rivethead meloplasty incomprehensible
+sangaree pelvimetry ploration dithery amplexifoliate Ludgatian
+flatman enation cubit componental inventurous botchedly
+autobiographist flushgate stiffish allectory ambitus triakistetrahedral unprovided chargeably
+heavenful parquet equiconvex outwealth Pyrales unpeople diatomaceous canicule
+Megaluridae twinling bucketer sertularian metaphrastical
+breadwinner imaginary lithotresis selectivity Hysterocarpus Triconodonta steprelationship
+uniarticular angiopathy laryngic preagitate synovial scabbardless socioromantic swoony inventurous
+Vichyite liquidity bogydom autoschediastical scotale debellator
+sequentially omega characinoid unisexuality parodist
+cubit Alethea unevoked photoelasticity Ophiosaurus acidophile redesertion
+depravity Homoiousian analgize venialness archistome orthopedical quadrennial affaite
+technopsychology seeingness ambitus kerykeion abusiveness enterostomy pansophism appetible swearingly
+paleornithology Vichyite corelysis affaite sesquiquintile incomprehensible
+pompiloid saguran isopelletierin okonite tramplike signifier trip
+jharal frenal playfellowship neuromimesis jirble cumbrousness depravity
+splenauxe hypoplastral collegian nectopod metrocratic erythremia precostal
+brooky gunshop Consolamentum Isokontae Shiah biopsic Savitar sturdied
+sangaree sesquiquintile Ochnaceae ungrave whittle
+parquet diatomaceous detractive flutist transcorporeal enterostomy
+templar decardinalize undecorated parodist noreast sturdied noreast furacious uninductive
+regardful unaccessible parabolicness Bishareen peptonate pseudohalogen velaric bacillite componental
+impressor antineuritic waird winterproof expiscate
+porriginous boser catabaptist pyrocatechol intuition
+helpless bubble depressingly taver comism catabaptist
+unleavened serosanguineous upcushion Fameuse groundneedle masa rivethead
+amplexifoliate thiodiazole apocalypst enterostomy uvanite
+catabaptist Aktistetae bladderwort inertly unforkedness Hester socioromantic
+uncompromisingness sural piquantness appetible frameable waird diopside tricae
+triakistetrahedral semantician aquiline Filipendula heavenful danseuse Tsonecan jajman waird
+strander enhedge outwealth epauliere depravity calabazilla
+yeat interruptor balanocele homotransplant upswell analgic Uraniidae
+Dodecatheon equiconvex adatom knob soorkee cubby shola pleasurehood
+unswanlike unpatched overcultured shola shellworker bucketer transude foursquare
+tristich pneumonalgia velaric Aplacentalia sheepskin umangite lineamental zenick acidophile
+ferrogoslarite ununiformly analgize rehabilitative tambo upswell Scorpaenidae
+meriquinoidal yeelaman photoelasticity refasten embryotic guitarist metrocratic
+pneumonalgia hackneyed gallybeggar foursquare valvula
+preaffiliate diathermacy pyrocatechol brag parodist sandbox agglomeratic prescriptible sturdied
+disilane ell scapuloradial havoc inferent sandbox galbulus Pithecolobium erythrodextrin
+interfraternal masa whittle expiscate brutism oinomancy bucketer depravity
+antideflation swacking cuproiodargyrite jajman Macraucheniidae temporomastoid
+decardinalize louse coracomandibular bunghole velaric emir tambo Russifier trisilicic
+classificational trillion diplomatize uncontradictableness subangulated arrowworm hemimelus marshiness penult
+adz thermanesthesia Munnopsidae paranephros emir basto choralcelo Bulanda
+autobiographist kerykeion symbiogenetically repealableness stroking stradametrical
+overbuilt periclitation Pincian nonsuppressed warlike helpless
+ineunt tramplike corona bucketer corona
+superindifference pictorially aneurism chrysochrous comism jirble percent arsenide
+Tamil vesperal bought pseudoxanthine danseuse unlapsing
+sapphiric Mesua starosta wandoo antalgol kerykeion
+raphis Dictograph unswanlike larklike hondo slangy subfebrile cuproiodargyrite
+dispermy okonite circular terrestrially componental chrysochrous stronghearted sandbox adz
+hepatorrhaphy superindifference inventurous tonsure wherefrom Orbitolina codisjunct
+experientialist preagitate metoxazine mesymnion diwata regardful prolificy
+diminutively heavenful octogynous unrevolting nonsuppressed
+archistome idiotize sterilely neurodegenerative evictor
+Sphenodontidae swearingly monilioid squit nonuple flatman
+pentosuria strammel fossilism parastas characinoid
+trillion semiangle hymnic trillium subsequentially ell cyanophilous farrantly balladmonger
+sapphiric vesperal ethmopalatal dehairer intrabred Pyrales Homoiousian
+louse ungrave ascitic bestill topline
+potentness thorite repealableness antalgol pompiloid overcontribute orthopedical valvula
+feasibleness Pincian appetible preoral ten Hysterocarpus Orbitolina undangered
+erlking ornithodelphous bromate starer ventricous flutist Harpa folious
+elastivity oversand heavenful ladhood eucalypteol havoc Fouquieria dosseret chooser
+mutter reappreciate topsail heavenful archididascalian
+spermaphyte untongued upcushion naught clanned
+chilblain metrocratic jajman astucious chargeably beatable
+nonpoisonous idiotize groundneedle ultraobscure dastardliness interfraternal giantly
+sural spiciferous intuition lophotrichic pope mastication jharal chronist
+circular twinling sud bestill trunnel proauction
+paunchy pansophism overbuilt stroking electrotechnics
+meriquinoidal leucophoenicite socioromantic impairment nummi
+yeelaman spot pachydermous bot theologicopolitical pelvimetry unaccessible sloped
+oxyterpene instructiveness trophonema nonexecutive critically decidable
+ascitic paradisean corelysis noreast seeingness arduousness acocotl friarhood becomma
+iniquitously cervisial octogynous inductivity Edo
+Thraupidae Russifier prolificy stronghearted ununiformly
+visceral visceral involatile introducer hyocholic
+noncrystallized angiopathy preoral unpredict marshiness
+Mycogone immatchable bogydom palaeotheriodont diathermacy laurinoxylon stroking saccharogenic arsenide
+retinize Christianopaganism cacuminal cloy atlantite becomma vesperal nonpoisonous stentorophonic
+canicule tum constitutor authorling antihero superindifference
+toplike flatman bot saccharogenic swearingly
+unlapsing docimastical arval laryngic characinoid technopsychology weism
+Pishquow balladmonger coracomandibular glyphography merciful tingly Caphtor ungrave
+leucophoenicite Effie prepavement angiolymphoma Confervales weism
+decardinalize manilla endotheliomyoma Dawsonia japanned scrubbed unevoked boor
+mangonism vinny plugger thiodiazole immatchable Spencerism seelful
+warlike vinny pondside pondside Bermudian inventurous unurban pachydermous oratorship
+pseudoxanthine ethnocracy theologal meriquinoidal saccharogenic sialadenitis tetrahedral pyxie
+synovial predisputant ten unprovided Saponaria seeingness toplike
+pondside fallacious enation valvula noreast bathysphere infestation
+mammonish gymnastic deepmost widdle atlantite antivenin
+Munnopsidae dunkadoo overstaid redescend uncombable foursquare thermoresistant gymnastic
+introducer laurinoxylon decardinalize Joachimite cylindric subsequentially
+orthopedical relaster generalizable trophonema coadvice eristically Vaishnavism
+rosaniline Thraupidae monilioid extraorganismal predebit hypochondriacism marten mericarp
+biventer undiffusive pendulant transcortical sombreroed cumbrousness pinulus ovoviviparous
+asparaginic Machiavel lithograph parmelioid unleavened
+warlike overcontribute Helvidian aurothiosulphuric dinical gallybeggar pamphlet swoony
+coldfinch percent paleornithology Protestantize diwata
+imaginary aurothiosulphuric cervisial prescriber rizzomed skyshine Socraticism Cimmerianism seelful
+parquet poleax unevoked coadvice repealableness Munychian endotheliomyoma apopenptic eucalypteol
+quintette pneumatotherapy ornithodelphous sirrah hoove
+nonuple Swaziland planosubulate bromic potentness skyshine eulogization
+smokefarthings stormy ineunt nonexecutive Ophiosaurus greave bonze raphis boser
+elemicin ell hackneyed Haversian tomorrowness nonsuppressed embryotic daytime boser
+heliocentricism antiscolic gelatinousness scrubbed overstudiousness lifter periclitation
+tingly shellworker aneurism prospectiveness unefficient uninductive Spatangoidea culm
+taurocolla adscendent inexistency quarried trabecular oratorship
+vitally topsail raphis parastas eristically chordacentrum
+Lincolnlike cornberry mammonish mesophyte overcrown quadrennial swacking mendacity macropterous
+Tamil diopside pneumatotherapy comprovincial uncontradictableness Mormyrus
+uninterpleaded starosta rosaniline triradiated prolificy
+aquiline waird saccharogenic pachydermous Macraucheniidae neurodegenerative speckedness overcrown
+infrastapedial percent thermanesthesia ticktick periclitation sequacity
+agglomeratic centrifugalization unaccessible gelatinousness angiolymphoma Pithecolobium reeveland unfurbelowed beadroll
+culm unrevolting theologicopolitical soorkee gemmeous avengeful
+marten deindividualization bathysphere bettermost saccharogenic Passiflorales seditious mendacity erlking
+bromate deepmost stachyuraceous characinoid floatability obolus
+overcultured triradiated oblongly adatom stronghearted patroller Jerusalem
+commotion cheesecutter semiangle uninterpleaded monander danseuse
+bromate scyphostoma reeveland doina commotion parquet tonsure
+antiadiaphorist Swaziland twinling stiffish exploiter
+arrowworm uncontradictableness furacious pomiferous Harpa pope
+yeat deindividualization monander wandoo subangulated Filipendula oxyterpene prepavement Christianopaganism
+benzoperoxide Bushongo slangy larklike overstudiousness pentosuria unfulminated
+mangonism mangonism overstudiousness bogydom ungrave oxyterpene repealableness
+instructiveness balladmonger cattimandoo karyological magnetooptics misthread
+roughcast theologal bucketer angiopathy theologicopolitical
+spot seminonflammable hondo Eleusinian metaphonical elastivity predisputant
+pentafid eer tailoress pictorially phlogisticate ploration nummi thiodiazole Joachimite
+slait unstressedly bucketer Spencerism outguess tingly chasmy
+depravity unscourged corona Gothish allegedly frenal
+interruptor benzoperoxide mammonish slipped immatchable
+impairment havoc plugger intuition equiconvex interruptedness guitarist diatomaceous dinical
+constitutor Protestantize circular edificator sequestrum hogmace
+reciprocation saguran Arneb cacuminal arval prepavement eulogization
+toxihaemia seelful frameable Swaziland counteractively bacillite
+gelatinousness uncombable sonable seraphism thorite byroad
+oversand authorling umangite tartrous verbid
+beneficent neurodegenerative toplike scyphostoma perculsive
+airfreighter Alethea bucketer tonsure Confervales
+feasibleness omega flatman throbless tomorn returnability diatomaceous
+balladmonger epidymides sirrah terrificness disilane unurban
+Confervales involatile overcultured astronomize Munnopsidae chrysochrous foursquare
+seraphism preagitate helminthagogic benzoperoxide Glecoma Yannigan umangite veterinarian subofficer
+overcultured airfreighter jirble thiodiazole stradametrical ipomoein cuproiodargyrite templar ambitus
+umbellic toxihaemia Llandovery apopenptic jajman pope doubtingness pleasurehood Coniferae
+abthainry Vaishnavism patroller verbid terrificness
+apopenptic stewardship precostal Yannigan limpet weism Animalivora greave
+Munnopsidae proacquittal extraorganismal undeterring drome
+apocalypst entame benthonic bettermost proauction photoelasticity
+dosseret eucalypteol liquidity scabbiness quintette velaric totaquina
+splenauxe deaf asparaginic unefficient Auriculariales Thraupidae relaster harr preparative
+pinulus jharal propodiale frameable angiopathy biventer harr
+plugger propheticism speckedness Cercosporella slipped hymnic
+lineamental strammel Filipendula monstership comprovincial sialadenitis sesquiquintile warlike
+golem splenauxe dehairer gymnastic imaginary
+cocksuredom impairment Uraniidae Uraniidae apocalypst phytonic Auriculariales osteopaedion Florissant
+stormy sequentially introducer suspend Ochnaceae nonsuppressed Whilkut bromic antalgol
+chronist umbellic speckedness discipular Dunlop sturdied scabbiness
+sandbox phlogisticate endotheliomyoma hypoplastral tambo subtransverse
+phallaceous pony obispo pony acidophile preparative semiangle depthwise brooky
+exprobratory involatile prescriptible counterappellant ovoviviparous
+seizing Llandovery seeingness wherefrom liquidity tetrahedral arrendation
+emir larklike biventer proacquittal Swaziland unsupercilious Machiavel decidable rainproof
+tartrous imperceptivity amylogenesis devilwise reappreciate pondside ultratense pleasurehood periclitation
+enterostomy elastivity archesporial antiscolic drome unpremonished strander bladderwort sapphiric
+serphoid pope potentness angiolymphoma cromlech photoelasticity
+symbiogenetically metrocratic monstership diurnalness eucalypteol laurinoxylon
+Orbitolina yawler Shiah metoxazine ovopyriform tricae thermanesthesia
+nonexecutive elemicin pleurotropous cocksuredom reformatory knob projecting tomorn
+Sebastian sandbox trisilicic nonlustrous morphiomania monilioid guanajuatite strander
+ineunt upswell cromlech airfreighter sud liberatress speckedness digitule Serrifera
+paradisean sarcologist manny rosaniline ungrave cocksuredom greave
+Tsonecan whittle soorkee astronomize peristeropode
+karyological rehabilitative pterostigma gala neurotrophic Cimmerianism Aplacentalia collegian clanned
+signifier Hysterocarpus projecting patroller Scanic stiffish glossing starosta
+parodist deaf diurnalness taurocolla gala goodwill golem undangered zanyism
+nonrepetition beadroll spot yeelaman Sebastian circumzenithal Christianopaganism debellator cubby
+rebilling omega eer apocalypst aurothiosulphuric proauction imperceptivity cinque chooser
+fallacious cubby defensibly pompiloid participatingly archesporial trip defensibly
+breadwinner cattimandoo abscission winterproof ultraobscure
+isopelletierin Llandovery hysterogen preparative Bermudian
+bugre unfulminated redesertion arteriasis frameable cockal Protestantize
+calabazilla intuition pope naprapath porriginous Dictograph posttraumatic
+japanned arrowworm laurinoxylon eristically defensibly toxoplasmosis pentafid
+circumzenithal dastardliness basto Bertat oflete
+guanajuatite redecrease experientialist thermochemically molossic
+frameable rede Pithecolobium chasmy meriquinoidal regardful
+evictor planosubulate testa entame orthopedical
+scrat friarhood Spencerism Ghent pomiferous magnificently Triconodonta
+reeveland gul omega valvulotomy sloped
+lifter spermaphyte dithery experientialist unharmed ungreat seeingness Bertat Dawsonia
+aneurism involatile pomiferous homeotypical archistome
+overwoven anta stradametrical countergabion Aktistetae unsupercilious benzoperoxide
+Ludgatian Kenipsim bought adz glacierist Christianopaganism
+trabecular counterappellant outguess kerykeion counteractively Endomycetaceae exploiter
+inventurous bettermost undiffusive nummi bespin
+goladar macropterous clanned pinulus dipsomaniacal
+frontoorbital analgic oblongly feasibleness Hester
+laubanite dosseret phoenicochroite redecrease ungreat nonexecutive lyrebird redecrease
+refasten airfreighter myesthesia heavenful whitlowwort depressingly scrat Aplacentalia antiscolic
+testa aneurism cornberry Semecarpus Passiflorales
+counteractively cromlech osteopaedion engrain uloid metopon euphemious metapolitics
+cromlech chorograph tum undinted wherefrom nebular
+Dictograph stronghearted Yannigan paradisean rebilling photoelasticity
+physiologian scapuloradial interruptor unforkedness intuition
+pachydermous eurythermal hondo chalcites outguess
+bromic blurredness familist erythrodextrin bought ramosopalmate
+returnability rivethead chasmy Arneb phoenicochroite oblongly
+undeterring bozal counterappellant pictorially Pishquow
+templar valvulotomy nummi valvulotomy Homoiousian limpet unschematized
+brooky rotular proacquittal predebit componental thermochemically
+rivethead lampyrine unsupercilious brooky ell coadvice Harpa
+biopsic sesquiquintile coldfinch isopelletierin ultratense tickleproof propheticism misexposition
+embryotic docimastical beadroll cubby champer groundneedle archistome devilwise autobiographist
+generalizable Machiavel unpatched licitness abthainry vinegarish
+Endomycetaceae characinoid atlantite elastivity Dawsonia mericarp stewardship dermorhynchous horsefly
+Sphenodontidae dishpan farrantly almud glossing
+archesporial monogoneutic upswell scrubbed opacousness drome lampyrine Ochnaceae
+quad trillium veterinarian circumzenithal hypoid
+choralcelo beneficent pamphlet epauliere lyrebird impairment
+uncombable oratorship nonprofession osteopaedion Harpa
+unpeople Tamil Pishquow helpless cacuminal
+hemimelus omega metaphonical Chiasmodontidae ethmopalatal euphonym totaquina
+manilla Scorpaenidae knob saccharogenic bestill tramplike
+incomprehensible foursquare constitutor serosanguineous warriorwise brutism
+flushgate prolificy spiciferous uncombable glossing
+Inger deaf Aktistetae frenal chooser meriquinoidal hoove Pyrales
+blightbird digitule guitarist chargeably Pithecolobium
+ungouged Hydrangea veterinarian widdle patroller myesthesia sportswomanship ovopyriform elastivity
+overwoven shibuichi volcano quadrennial bestill biventer michigan Aplacentalia bespin
+gemmeous pachydermatoid corelysis umangite metoxazine enhedge unpatched
+Russifier seizing louse componental morphiomania socioromantic infestation downthrust
+affaite unrevolting obolus swoony circular kerykeion sertularian saguran
+Uraniidae subtransverse pinulus scrat pumpkinification physiologian cylindric metaphonical masa
+tambo pumpkinification Haversian brooky temporomastoid gymnastic octogynous Aktistetae skyshine
+mesophyte scrubbed nonlustrous hysterogen seminonflammable volcano chrysochrous zanyism
+japanned Eryon uncompromisingness corona sturdied relaster equiconvex agglomeratic undeterring
+impressor oratorize outwealth stewardship marshiness pachydermatoid stiffish blurredness bugre
+uloid limpet ambitus archididascalian parabolicness leucophoenicite
+sombreroed blightbird uncarefully Eryon unrepealably dipsomaniacal overcultured
+sedentariness tailoress tantivy ultrasystematic pelvimetry lithotresis rainproof meloplasty cyanoguanidine
+authorling archistome parastas Bassaris eternal obolus unisexuality
+ramosopalmate prezygapophysial manganosiderite mangonism hellbender volcano oflete
+snare saguran chorograph brooky Protestantize cuproiodargyrite experientialist
+gymnastic rehabilitative constitutor Pithecolobium signifier bonze Christianopaganism
+affaite tomorn bismuthiferous airfreighter hypoid decardinalize boor asparaginic
+unharmed pendulant allotropic infravaginal Serrifera hysterogen antiabolitionist mesymnion liquidity
+quailberry blurredness chronist diopside spherulitic subdrainage subofficer pompiloid sequestrum
+selectivity leucophoenicite serpentinic enation merciful Bishareen thermanesthesia
+outwealth scrat knob marten Vichyite byroad endotheliomyoma
+neurodegenerative Christianopaganism arrendation dinical plerome
+Gothish sapphiric homotransplant manilla counteralliance experientialist hogmace tonsure
+unleavened phoenicochroite glossing soorkee unexplicit uncarefully myesthesia shola cumbrousness
+tomorrowness inductivity interruptedness golem metoxazine greave gul
+warriorwise raphis antalgol monander brooky nonutilitarian slipped veterinarian by
+retinize Arneb antalgol Cephalodiscus taver gemmeous
+Vaishnavism intrabred smokefarthings Edo tambo tambo scyphostoma folious guanajuatite
+Dadaism aprosopia psychofugal thermoresistant undeterring
+impairment macropterous trillium cretaceous stiffish astucious piquantness
+Megaluridae impugnation neuromimesis Scorpaenidae porriginous
+Hysterocarpus sequacity antiscolic corbel scotching tomorn collegian
+reconciliable semiangle manilla serphoid Dictograph codisjunct smokefarthings Isokontae
+coldfinch triradiated circumzenithal reconciliable farrantly cuproiodargyrite prepavement leucophoenicite
+gala becomma mastication reconciliable laurinoxylon provedore
+untongued culm hellbender diplomatize japanned
+exploiter thorite thorite trisilicic mesymnion undecorated toplike metopon scotching
+cattimandoo rainproof reciprocation perfunctory Cephalodiscus generalizable undeterring proboscidiform Isokontae
+flatman hemimelus papery valvula playfellowship carposporangial Spatangoidea tomorn
+chorograph Confervales Haversian scyphostoma reperuse feasibleness paradisean
+seelful subirrigate reappreciate signifier triradiated stachyuraceous pansophism uninductive
+countergabion tantivy obolus unreprimanded trunnel genii
+diatomaceous jajman Vichyite pumpkinification neurotrophic
+planispheric groundneedle hackneyed parabolicness frontoorbital
+taurocolla brutism sloped dermorhynchous imprescribable
+lammy insatiately unlapsing countergabion neuromimesis
+golem projecting ungouged Zuludom oxyterpene thermochemically throbless projecting
+infestation rave silicize Alethea peptonate
+unaccessible Sebastian Hydrangea debromination tartrous Oryzorictinae
+subangulated characinoid valvula Prosobranchiata omega experientialist tartrous
+Orbitolina inventurous phoenicochroite Quakerishly Haversian basto
+angiolymphoma swearingly autoschediastical merciful Coniferae parodist
+constitutor overcultured diurnalness expiscate undiffusive moodishness tonsure Munychian
+tendomucoid ethmopalatal spookdom hogmace idiotize
+bromic weism carposporangial imprescribable orthopedical ultrasystematic sesquiquintile
+perculsive metaphonical byroad unrepealably disilane taurocolla prescriber wingable pony
+angina uniarticular decidable uniarticular figured calycular
+canicule unpredict tailoress scrubbed admissory
+yote oversand agglomeratic proauction allegedly chacona
+larklike swoony macropterous diopside Eryon spiciferous pentafid
+spiranthic unfeeble Protestantize hellbender ell knob pamphlet
+unpeople unurban Uraniidae inertly proacquittal seeingness
+debellator trabecular hoove pneumatotherapy Arneb atlantite
+perculsive intrabred pneumatotherapy infravaginal ineunt reperuse
+valvulotomy autoschediastical homeotypical nebular infrastapedial angiolymphoma percent
+ineunt coadvice Tamil ell autobiographist prefatorial
+pamphlet mammonish unforkedness qualminess peristeropode upswell
+paranephros proacquittal danseuse upcushion stroking
+larklike interfraternal rede paunchy metaphrastical pamphlet
+quadrennial perfunctory upswell kenno prescriber Itea crystallographical Gothish
+enhedge chacona calycular dialoguer underskin subangulated Triphora antineuritic
+sonable bismuthiferous ovoviviparous unstipulated predebit
+meriquinoidal aurothiosulphuric reconciliable testa stroking temporomastoid
+golem semantician massedly preagitate concretion sturdied centrifugalization subdentate clanned
+scrat plerome Aplacentalia warlike rosaniline terrificness
+repealableness sural omega piquantness uninductive liquidity sleigher subfebrile
+unpremonished subfebrile lienteria laubanite Bertat valvulotomy sturdied
+nonrepetition cresylite nectopod opacousness apocalypst unpeople
+propheticism retinize pachydermatoid obispo familist bettermost mechanist repealableness technopsychology
+phytonic posttraumatic biventer supraoesophageal transudatory
+larklike nonprofession instructiveness culm Chiasmodontidae culm greave endotheliomyoma ultraobscure
+autobiographist wingable poleax reappreciate tambo balladmonger louse ethmopalatal
+monander archididascalian meriquinoidal undiffusive spiranthic gunshop ultraobscure Hu
+figured perfunctory Yannigan preaffiliate eurythermal Florissant umbellic extraorganismal
+roughcast Vaishnavism patroller playfellowship acidophile balanocele brag Ghent cyanoguanidine
+centrifugalization playfellowship pompiloid blightbird hypochondriacism
+photoelasticity pyxie tambo paranephros times deepmost
+nebular minniebush unaccessible squit excerpt refective
+incalculable Llandovery mesymnion comprovincial socioromantic reperuse Pishquow uloid molossic
+winterproof redescend obolus galbulus subdentate
+circular starosta unrealize Pyrales stentorophonic
+trailmaking asparaginic templar instructiveness diopside misexposition misexposition
+prescriptible exploiter autobiographist culm abscission goladar japanned porencephalous Haversian
+biventer weism anta Gothish phoenicochroite
+frontoorbital quarried saccharogenic Fouquieria unimmortal Lincolnlike
+orthopedical asparaginic yawler pinulus unswanlike adatom
+idiotize unbashfulness toxoplasmosis champer unchatteled inferent
+nonrepetition metoxazine speckedness lifter pyroacetic hyocholic reformatory cyanoguanidine cretaceous
+Zuludom scotale unsupercilious appetible omega seraphism
+cumbrousness pachydermous Sphenodontidae Confervales retinize putative Christianopaganism unanatomized
+squdge diurnalness louse lammy scrubbed
+cumbrousness intuition incalculable parabolicness parmelioid pentagamist
+prescriber cheesecutter frontoorbital psychofugal parabolicness overstaid ineunt quadrennial gymnastic
+tailoress haply stroking provedore corbel parabolicness mendacity balanocele proacquittal
+trip tristich Hester metopon cretaceous pelvimetry noreast Quakerishly tambo
+pseudoxanthine spot seizing reformatory Spatangoidea Vaishnavism pleasurehood spiciferous
+overstaid velaric Megaluridae Triconodonta subdrainage flatman
+uncarefully glacierist botchedly orgiastic shola throbless
+noncrystallized nigh golem ell impressor benthonic
+subtransverse unleavened folious homeotypical dunkadoo oblongly
+reperuse diatomaceous unefficient marten farrantly sandbox
+Triconodonta rechar totaquina toplike Isokontae overstudiousness rebilling detractive
+leucophoenicite abstractionism lithotresis balanocele sedentariness sonable
+insatiately columniform Consolamentum aprosopia abscission ordinant cyanophilous centrifugalization
+pseudohalogen cockal furacious antideflation pyroacetic quad
+electrotechnics immatchable silverhead seizing adscendent
+exploiter amylogenesis ungrave counteralliance planispheric
+amylogenesis unpremonished wingable templar toxoplasmosis blightbird
+shallowish acidophile Bertat superindifference Endomycetaceae squdge sirrah
+eucalypteol silicize bought mangonism potentness reappreciate fossilism
+mangonism nigh Filipendula cretaceous oflete pope unevoked
+Bulanda hepatorrhaphy rede doina limpet erythrodextrin pterostigma pamphlet stereotypography
+upswell sportswomanship tristich stachyuraceous quintette endotheliomyoma chooser noreast
+spherulitic interruptor galbulus scrat hysterogen wandoo ventricous sandbox
+infrastapedial choralcelo overwoven relaster Uraniidae flippantness undiffusive suspend
+doubtingness silverhead bespin swoony generalizable consumptional
+defensibly prepavement tristich glandularly ineunt charioteer yeelaman
+omniscribent parmelioid archesporial slait oratorize toplike bacillite
+entame redescend Chiasmodontidae terrificness temporomastoid calycular deaf socioromantic
+bicorporeal metaphonical tambo Spatangoidea transcorporeal barkometer amender insatiately Lemuridae
+Tsonecan craglike counterappellant Dodecatheon unprovided euphemize
+yeelaman by stiffish adz mericarp knob autoschediastical redescend rave
+mendacity porriginous metoxazine minniebush devilwise bettermost Dictograph abthainry archesporial
+commotion homotransplant comprovincial ambitus unscourged mastication lophotrichic
+rizzomed Hydrangea placatory arrendation brag antideflation eulogization
+exprobratory eurythermal hyocholic Yannigan parodist prefatorial
+docimastical overcontribute electrotechnics sombreroed inductivity scotale testa chacona retinize
+Orbitolina acocotl enterostomy electrotechnics pope
+noreast toxoplasmosis Inger docimastical metastoma antiadiaphorist
+licitness weism veterinarian licitness homotransplant larklike Bassaris Aplacentalia
+pterostigma aconitine aurothiosulphuric diopside Eleusinian Aktistetae isopelletierin
+venialness ungouged yeat knob arrendation naprapath edificator uncontradictableness pachydermous
+docimastical monogoneutic antineuritic sialadenitis cobeliever sedentariness
+glacierist Pithecolobium avengeful meloplasty widdle cartful posttraumatic lyrebird
+Animalivora involatile leucophoenicite Joachimite antideflation phallaceous Consolamentum overcontribute glacierist
+pseudoxanthine pseudohalogen parastas bathysphere roughcast almud hysterogen
+balanocele precostal adz hackneyed umbellic stroking starosta
+vesperal elemicin supermarket sequacity provedore Florissant euphemize pachydermatoid
+pony leucophoenicite piquantness infrastapedial retinize triradiated Caphtor Helvidian corona
+pyxie unfeeble Yannigan slipped provedore figured selectivity dipsomaniacal Pincian
+subofficer sequentially constitutor masa laryngic genii supermarket floatability
+critically goodwill goladar Fameuse balladmonger
+helminthagogic tingly propheticism predisputant tickleproof docimastical homotransplant valvula squit
+unpredict chooser sloped lithotresis serosanguineous
+raphis precostal electrotechnics deepmost parquet gunshop diplomatize propheticism subfoliar
+uniarticular plerome uninhabitedness unevoked genii scrubbed
+unanatomized chordacentrum archistome putative nigh Ludgatian
+sapphiric concretion subtransverse sural arval laurinoxylon agglomeratic exprobratory ploration
+projecting alen orchiocatabasis ovoviviparous Scorpaenidae
+angiolymphoma rave Dawsonia entame terrificness undecorated yote okonite
+Ghent mangonism lampyrine spiranthic absvolt marshiness
+tendomucoid interfraternal Tamil bacillite thermochemically predisputant biodynamics mesymnion projecting
+visceral diopside archididascalian repealableness rebilling
+unaccessible friarhood basto proboscidiform Cephalodiscus rave triradiated overstaid
+diatomaceous besagne molecule yeelaman overstaid imprescribable
+impairment thermoresistant provedore diplomatize dermorhynchous atlantite adz
+steprelationship reeveland boor Sphenodontidae cockstone
+redesertion abthainry quarried diatomaceous Dadaism lifter quailberry Coniferae
+unfurbelowed pumpkinification parquet vitally benzothiofuran autoschediastical
+posttraumatic potentness Gothish bubble oversand glacierist obolus
+karyological unobservantness scyphostoma subfebrile lithograph cobeliever biventer
+nonpoisonous cervisial flutist cubby glacierist
+yeat cresylite Zuludom packsack allegedly laurinoxylon
+licitness untongued asparaginic manny hogmace throbless
+molecule stroking ungreat Bishareen emir macropterous yeat entame tickleproof
+alen unleavened prefatorial spermaphyte Arneb
+sviatonosite sud Hu euphonym arval harr
+metoxazine catabaptist cacuminal cromlech inertly slangy anta Florissant
+figured Machiavel Fouquieria tartrous pachydermous cyanoguanidine perculsive
+spermaphyte Dictograph thermoresistant paunchy hyocholic
+lammy corona unrealize Eryon impugnation cyanoguanidine cockstone Pithecolobium Joachimite
+trillium unfeeble subdrainage strammel liberatress
+eristically frameable disilane ornithodelphous orthopedical amender omniscribent
+comparability physiologian triakistetrahedral Hydrangea ethmopalatal cubby eulogization topsail
+reperuse subdentate preparative Helvidian dosseret Yannigan phallaceous centrifugalization
+helpless Savitar bacillite stereotypography counteractively Bertat
+jajman psychofugal periclitation experientialist dermorhynchous pictorially atlantite undangered antiadiaphorist
+electrotechnics Passiflorales unrevolting pelvimetry danseuse amender
+myesthesia pneumatotherapy phytoma nonrepetition refasten jajman Munnopsidae speckedness michigan
+tailoress gelatinousness cacuminal Ochnaceae sedentariness reeveland
+eristically generalizable taver tomorrowness catabaptist endotheliomyoma terrestrially
+Hydrangea tonsure Animalivora charioteer porriginous wingable
+aprosopia unefficient sapphiric Lentibulariaceae trillium arteriasis allegedly prescriber
+deaf dehairer antiabolitionist focaloid tantivy totaquina tailoress
+monander squit extraorganismal classificational Triconodonta brag yote farrantly circular
+stentorophonic flippantness atlantite uniarticular zenick Scorpaenidae
+vinny testa Pishquow sheepskin osteopaedion Arneb jirble
+pompiloid Dodecatheon flippantness unpeople Caphtor overcultured
+limpet euphemize vinny seeingness unlapsing stiffish
+Llandovery warlike bonze valvula cheesecutter Ophiosaurus eer equiconvex
+Edo undeterring diopside Megaluridae octogynous vesperal serpentinic folious Babylonism
+unexplicit lifter biopsic culm furacious scabbardless Mesua approbation
+antineuritic hackneyed swacking discipular papery authorling tomorrowness orgiastic
+zoonitic subirrigate Pishquow Florissant unstressedly Confervales
+comprovincial overstaid engrain templar classificational imperceptivity
+Machiavel antiadiaphorist Joachimite undecorated hypoid bunghole thorite topline tetragynian
+jharal peristeropode triradiated excerpt doina seditious triradiated
+pyrocatechol Gilaki hackneyed classificational clanned louse pelf flatman
+Cephalodiscus plugger manganosiderite abstractionism scotale starosta fallacious
+Thraupidae skyshine throbless heliocentricism brag oratorize clanned parquet arteriasis
+ovoviviparous sapience toxihaemia generalizable aprosopia Ghent farrantly genii
+Chiasmodontidae diwata arrendation subfebrile hemimelus chasmy vesperal
+epidymides canicule pneumonalgia pompiloid acidophile ferrogoslarite weism beneficent
+speckedness porriginous tartrous antiscolic manilla patroller sloped
+friarhood temporomastoid trisilicic arrowworm pope clanned
+molossic intuition bromic airfreighter decardinalize cornberry prescriptible rechar spiranthic
+euphemize scrat quintette pansophism vitally brooky coracomandibular seminonflammable
+exploiter rizzomed aconitine sapience cumbrousness ascitic unisexuality zenick craglike
+approbation saponaceous quarried apopenptic frameable unbashfulness
+docimastical astronomize slait periclitation untongued Lentibulariaceae meriquinoidal
+Bishareen componental heavenful sonable unprovided proboscidiform
+volcano interfraternal thiodiazole Dictograph parodist
+sangaree unpeople subirrigate componental countergabion massedly abusiveness
+potentness engrain flutist provedore seizing epauliere besagne
+prolificy manganosiderite scrat subtransverse zanyism slipped pentosuria
+superindifference analgic heavenful perculsive deepmost supraoesophageal diathermacy oratorship
+Cephalodiscus toxihaemia astucious nonuple tetchy wemless Edo ambitus nigh
+craglike leucophoenicite deindividualization swoony omega antihero swoony unisexuality
+reformatory Machiavel danseuse spookdom nonprofession frictionlessly trunnel coadvice unaccessible
+Arneb widdle nectopod charioteer bonze antivenin valvulotomy cockal
+soorkee trailmaking overcontribute flushgate discipular hysterolysis
+counterappellant haply homeotypical ethnocracy floatability corona
+disilane generalizable quad sonable Dawsonia tetchy diatomaceous serpentinic mustafina
+theologal astucious ethnocracy quintette downthrust pleurotropous inventurous familist
+mediateness psychofugal Caphtor mangonism nectopod slait lifter
+transude arduousness Hysterocarpus centrifugalization boor refective vesperal abusiveness
+morphiomania botchedly sonable counteractively reeveland
+inductivity balanocele magnificently Vaishnavism laurinoxylon predebit toxoplasmosis
+Gothish visceral larklike Serrifera Ludgatian overcrown horsefly Prosobranchiata discipular
+imaginary sapphiric metaphonical trailmaking overcultured
+subtransverse monilioid gymnastic reappreciate brutism roughcast Bishareen
+slipped countergabion giantly eucalypteol technopsychology orgiastic trophonema
+inexistency roughcast approbation ventricous sertularian morphiomania plerome topline frictionlessly
+Filipendula rehabilitative undercolored hellbender whitlowwort preaffiliate
+brutism lithograph sturdied Christianopaganism coracomandibular scabbardless
+antihero ipomoein Zuludom micromembrane downthrust steprelationship tartrous vinny autoschediastical
+balanocele sesquiquintile japanned noreast moodishness preagitate
+nonprofession divinator vinny provedore upcushion vitally
+laubanite chrysochrous unevoked antalgol diminutively unleavened mastication unpredict
+trophonema tum chalcites oinomancy ventricous counterappellant
+pseudohalogen asparaginic toplike templar airfreighter Lemuridae timbermonger affaite
+papery pseudoxanthine manny Semecarpus dishpan vinegarish calabazilla doina putative
+velaric schoolmasterism sequestrum molossic sonable
+insatiately Muscicapa unexplicit overcontribute monander precostal
+piquantness squdge symbiogenetically divinator topsail
+antihero gallybeggar hysterogen drome palaeotheriodont unsupercilious
+pomiferous Zuludom gorilloid nonpoisonous gemmeous critically
+cockstone massedly metastoma cacuminal Socraticism symbiogenetically pneumatotherapy Babylonism
+porencephalous appetible scrubbed quailberry ambitus parabolicness phlogisticate
+neurotrophic goodwill tetragynian winterproof byroad
+Filipendula bunghole parabolicness Florissant cubby pseudohalogen redecrease stormy preparative
+unpredict flatman bozal havoc phytoma Alethea flatman visceral
+snare velaric bacterioblast chilblain reciprocation
+glyphography plugger unanatomized ribaldrous astronomize glacierist
+molecule unrealize rechar Fouquieria paradisean
+heliocentricism transude counteralliance antineuritic spermaphyte mediateness Pincian characinoid psychofugal
+hysterogen exprobratory aurothiosulphuric eer meriquinoidal subdentate tartrous wherefrom scyphostoma
+deindividualization manilla entame chalcites Whilkut
+atlantite nonprofession dispermy mediateness noncrystallized tomorrowness japanned
+craglike redescend tingly feasibleness unisexuality scapuloradial molossic shola waird
+unevoked shola serphoid nebular anta chronographic classificational verbid paradisean
+ladhood speckedness testa hyocholic bathysphere umangite
+trip saguran underogating euphemize generalizable avengeful sloped
+superindifference euphemious lifter yote tartrous
+drome mediateness Machiavel Yannigan antihero arrowworm
+heavenful provedore terrificness uncombable Russifier besagne Harpa ell
+lineamental parquet unobservantness bugre homotransplant alveolite mustafina
+pamphlet kerykeion Prosobranchiata massedly arsenide
+umangite mangonism Gilaki decardinalize heavenful bladderwort overcultured stiffish knob
+dastardliness chasmy kenno Dictograph Homoiousian inductivity glossing Haversian dipsomaniacal
+Dunlop glacierist Triphora imprescribable reformatory pyxie cretaceous paranephros
+parastas jajman overcultured transcortical bespin plerome migrainoid coldfinch
+sarcologist analgic dithery Triconodonta consumptional
+splenauxe manny crystallographical balanocele Chiasmodontidae
+endotheliomyoma winterproof chronographic orchiocatabasis enhedge unleavened hellbender countergabion
+unharmed hemimelus unschematized vinegarish sequentially
+hymnic impugnation trabecular Gothish undercolored macropterous
+hypoid bacterioblast cervisial vinegarish chronist
+gorilloid breadwinner abthainry pentosuria smokefarthings poleax paleornithology intrabred
+umbellic abthainry overstudiousness stachyuraceous imaginary cloy manilla
+hypochondriacism equiconvex tickleproof undecorated spiciferous frameable reformatory
+nonprofession technopsychology predebit thermochemically Kenipsim throbless knob depthwise
+pomiferous acocotl componental cresylite neuromimesis rechar benthonic Cimmerianism
+Thraupidae Serrifera trillion unscourged idiotize
+Edo terrificness aspersor subsequentially visceral
+dermorhynchous thermoresistant aurothiosulphuric frameable sleigher rotular
+uncompromisingness Pithecolobium afterpressure pseudoxanthine allectory chargeably sangaree pictorially glossing
+Oryzorictinae trailmaking brooky choralcelo nonlustrous
+Vaishnavism antineuritic snare pentosuria manny sterilely Jerusalem
+unprovided snare zenick unstressedly counteralliance Semecarpus Triconodonta counteractively
+manny slipped manny depthwise porencephalous
+Pishquow tomorn prefatorial ultratense antideflation authorling chilblain percent arteriasis
+silverhead terrificness allectory ten dermorhynchous ethnocracy
+bathysphere periarthritis Munychian benthonic undeterring eucalypteol outwealth wemless Swaziland
+experientialist dunkadoo noncrystallized allegedly glyphography pneumatotherapy bunghole toxoplasmosis
+thorite angiolymphoma undeterring diurnalness benzoperoxide
+chooser poleax totaquina wandoo sturdied paunchy pachydermatoid impugnation
+Lemuridae Lincolnlike hackneyed transude uninductive figureheadship Scanic
+pentosuria euphonym manny bacillite pyxie Inger helminthagogic
+limpet prescriptible Lincolnlike glandularly idiotize untongued vitally jharal unlapsing
+Joachimite bromate antivenin redescend folious
+plugger sawdust overbuilt refasten metaphonical
+twinling omega unobservantness Edo oflete helpless reeveland
+authorling twinling warlike eer Christianopaganism tartrous oxyterpene allectory scrat
+obolus suspend goodwill cockal inductivity scabbiness
+uncompromisingness Bertat overcontribute Cimmerianism tricae
+tramplike sarcologist larklike basto depressingly
+becomma calabazilla aprosopia Dawsonia pachydermatoid feasibleness
+cresylite ferrogoslarite decidable reformatory Triconodonta entame clanned
+uncompromisingly biopsic boser unexplicit sawdust noreast Effie veterinarian
+kenno halloo Munychian Harpa subangulated pansophism
+Filipendula doubtingness abstractionism aurothiosulphuric Bushongo Bulanda
+spiranthic Serrifera minniebush participatingly lifter outguess reperuse circumzenithal ultrasystematic
+limpet flushgate dastardliness codisjunct outwealth crystallographical tingly coldfinch perfunctory
+uncompromisingness dialoguer terrestrially adatom Scanic
+metastoma diminutively Swaziland isopelletierin preparative
+Hydrangea Caphtor omega scapuloradial pictorially supraoesophageal nonpoisonous elemicin
+totaquina trip hysterolysis winterproof Dodecatheon intuition familist
+bathysphere Passiflorales nonprofession botchedly eristically sturdied pelf pseudoxanthine Swaziland
+dishpan bismuthiferous periarthritis Russifier friarhood guanajuatite blurredness Hydrangea
+signifier blurredness reconciliable tetchy pendulant lithograph concretion antalgol
+canicule okonite infravaginal kenno saguran orthopedical
+Cercosporella golem mesymnion comism metaphrastical Triphora
+glyphography Consolamentum octogynous uvanite sequacity glacierist
+regardful Llandovery pleasurehood gorilloid diatomaceous velaric kenno outwealth slipped
+unaccessible depravity symbiogenetically nigh pseudohalogen yeelaman
+wherefrom patroller bestill eurythermal brag
+Italical minniebush outguess reconciliable bucketer componental
+thermochemically nonexecutive pamphlet zanyism manilla poleax Ludgatian antiabolitionist asparaginic
+botchedly cretaceous posttraumatic unbashfulness gelatinousness
+breadwinner Dadaism enhedge Prosobranchiata waird angina
+tautness Itea unburnt alveolite flippantness predisputant
+overinstruct retinize frameable vesperal underskin alen byroad adz
+thermoresistant bettermost prescriptible semantician lifter chilblain topsail
+planosubulate charioteer mechanist Eryon docimastical Aktistetae Helvidian trillion posterishness
+preoral transude epididymitis Machiavel golem scabbiness sud tartrous
+ultratense adz unexplicit Jerusalem appetible Machiavel cinque Quakerishly ultraobscure
+guitarist arsenide jharal nummi apocalypst metaphrastical
+arteriasis Cephalodiscus uninterpleaded Socraticism inventurous
+critically cresylite tomorrowness inferent merciful neurotrophic crystallographical supermarket debellator
+triradiated apopenptic pompiloid biodynamics merciful arrowworm volcano japanned participatingly
+atlantite ineunt codisjunct quadrennial misexposition strander quailberry papery
+mesophyte chordacentrum wemless adscendent chrysochrous marshiness
+edificator Consolamentum oflete Spencerism pterostigma paunchy uncarefully cyanophilous airfreighter
+manilla returnability pleasurehood columniform uncontradictableness
+uncarefully aconitine outhue rotular intuition signifier Confervales cartful templar
+winterproof doina timbermonger benzothiofuran zenick chacona steprelationship ascitic hypochondriacism
+hoove porriginous undecorated daytime galbulus hypochondriacism cinque redescend extraorganismal
+erythremia snare ungouged diplomatize charioteer regardful aspersor tendomucoid omega
+ungreat ramosopalmate spot Sphenodontidae balladmonger perfunctory noreast
+slangy gemmeous verbid opacousness mangonism eternal
+unstipulated nativeness unobservantness pony swoony diplomatize pentagamist
+thermanesthesia palaeotheriodont underskin boor posterishness
+outhue Glecoma affaite aprosopia angina naprapath quarried downthrust seelful
+reformatory tetragynian chargeably gallybeggar undeterring exploiter
+ethmopalatal benzothiofuran deaf by dispermy alveolite
+liquidity abstractionism lophotrichic trailmaking Endomycetaceae ungrave mustafina brutism vesperal
+prepavement verbid unefficient epauliere Triconodonta Yannigan signifier
+ungouged cromlech Pishquow spermaphyte Harpa overstaid charioteer
+comism inductivity floatability circumzenithal nonpoisonous arrendation
+wemless Joachimite mutter pondside antineuritic prescriptible
+refasten pyxie havoc rehabilitative canicule Russifier Scorpaenidae unscourged Christianopaganism
+stormy umbellic bromic bespin homeotypical posterishness
+mustafina lienteria prolificy arteriasis doubtingness
+aspersor shibuichi rainproof planispheric pleasurehood
+Hysterocarpus bought diopside whittle nonrepetition chronographic Cercosporella
+codisjunct diatomaceous relaster antiscolic pompiloid
+meriquinoidal infestation stradametrical unrealize saponaceous tartrous approbation infestation
+decardinalize diplomatize temporomastoid pondside spookdom toxoplasmosis fetlocked sangaree outguess
+scrubbed friarhood cartful benzoperoxide sterilely Tamil squit Ophiosaurus
+papery raphis pentosuria gunshop proacquittal mesophyte
+hondo transude scapuloradial trophonema bunghole serphoid characinoid
+unswanlike Fameuse inductivity columniform subirrigate unchatteled nonuple bugre extraorganismal
+limpet Chiasmodontidae valvula pictorially beadroll antiabolitionist
+frenal karyological diurnalness beadroll admissory
+okonite suspend iniquitously entame pelf
+homeotypical molossic molossic rave flatman atlantite nonutilitarian opacousness idiotize
+rehabilitative penult familist halloo focaloid jharal Munychian inventurous
+uninterpleaded temporomastoid whitlowwort pope imperceptivity wemless warriorwise ambitus quailberry
+transcortical insatiately antalgol velaric bacterioblast signifier terrestrially cheesecutter
+semantician benzoperoxide bogydom kerykeion fetlocked cockal Sphenodontidae Eleusinian
+Savitar preparative Uraniidae scrat slait pachydermatoid friarhood alen
+genii bubble unswanlike Inger vinny unlapsing Aplacentalia horsefly
+underogating snare blurredness hepatorrhaphy tickleproof supraoesophageal
+ascitic bromate unscourged unburnt playfellowship nonpoisonous elastivity larklike
+venialness beatable approbation cyanophilous Bassaris saponaceous rosaniline
+corbel scapuloradial apopenptic mustafina manilla prezygapophysial
+tantivy pneumonalgia arteriasis Spatangoidea ineunt nonmanufacture tartrous
+outhue sural biventer boser circumzenithal uninterpleaded lebensraum charioteer
+counterappellant frontoorbital infravaginal vitally metastoma omniscribent unchatteled
+abusiveness genii waird rechar uncontradictableness symbiogenetically snare
+serpentinic weism hypochondriacism subtransverse undercolored tonsure friarhood tetchy
+moodishness Auriculariales posterishness pentosuria componental Munnopsidae overstudiousness
+fallacious diurnalness discipular airfreighter jirble
+beatable cattimandoo arduousness trisilicic trillion twinling erythremia
+brutism Munychian quad Bassaris wingable scabbiness chacona friarhood
+rave coadvice sombreroed homotransplant splenauxe parodist
+antivenin Mycogone palaeotheriodont cumbrousness giantly Bushongo taurocolla Jerusalem
+ordinant strammel parmelioid paleornithology orthopedical
+bozal steprelationship havoc proauction proacquittal chronist heavenful
+refasten unsupercilious Sebastian pamphlet unstressedly
+moodishness pansophism affaite uniarticular parmelioid allectory erythrodextrin
+pyxie templar figureheadship serosanguineous octogynous
+placatory dishpan periarthritis scrubbed Semecarpus temporomastoid
+unreprimanded pentosuria temporomastoid emir imprescribable unpredict hackneyed uloid
+unschematized spookdom pondside Machiavel sertularian reciprocation
+reciprocation outwealth besagne hellbender monogoneutic adz aspersor pseudoxanthine emir
+angiolymphoma ornithodelphous codisjunct taurocolla zoonitic cretaceous
+quailberry venialness Glecoma besagne imprescribable
+metastoma hackneyed unanatomized nummi parabolicness elastivity
+undiffusive prescriptible Caphtor ungreat thiodiazole
+chargeably angiopathy unpeople debellator bot
+foursquare testa dehairer electrotechnics calabazilla interruptor vitally bozal
+chronist schoolmasterism unburnt trillion becomma
+unleavened hepatorrhaphy coldfinch cretaceous sequentially noncrystallized boor
+ambitus extraorganismal Hysterocarpus critically prospectiveness byroad
+prolificy phytonic sud magnificently autoschediastical insatiately unanatomized
+Dawsonia spiranthic hypochondriacism homeotypical psychofugal
+Hu diminutively Caphtor halloo stiffish
+Caphtor scrubbed propheticism planispheric dinical Ochnaceae cheesecutter
+Gothish blurredness danseuse stereotypography arrendation peristeropode lammy
+choralcelo spookdom counteralliance byroad Cephalodiscus almud
+projecting plugger boser arduousness infrastapedial chrysochrous Hydrangea
+overbuilt shallowish osteopaedion Mormyrus outguess stachyuraceous unimmortal uncarefully nonutilitarian
+sapphiric galbulus Bushongo piquantness idiotize
+manilla seelful aprosopia overcrown calycular Ophiosaurus
+phallaceous nigh ethnocracy concretion liberatress warriorwise rehabilitative adz electrotechnics
+boser dispermy seeingness sarcologist amylogenesis lithograph bacterioblast rizzomed heavenful
+daytime eternal decidable spiciferous docimastical interfraternal admissory
+orchiocatabasis marshiness starosta gorilloid counteralliance putative Lincolnlike
+uncompromisingness Semecarpus abthainry dehairer astucious cubit corona sesquiquintile zoonitic
+pentafid corelysis pyroacetic euphonym chilblain lienteria dunkadoo
+pyroacetic embryotic pneumonalgia unburnt mastication stronghearted
+abstractionism byroad Hydrangea manganosiderite scapuloradial decardinalize valvulotomy qualminess barkometer
+stewardship Isokontae ambitus Babylonism myesthesia uninductive imprescribable unstressedly
+regardful unrealize arval depravity gemmeous
+alen shallowish dishpan diplomatize insatiately
+bogydom laubanite prolificy Jerusalem testa meloplasty
+dinical tautness Scanic Chiasmodontidae trunnel epauliere
+champer sequentially porriginous porriginous enation glyphography mammonish
+parquet stewardship Orbitolina Ophiosaurus meloplasty starer
+louse focaloid minniebush imaginary sarcologist exprobratory discipular
+spiranthic unevoked Kenipsim rehabilitative unimmortal Eleusinian unpatched expiscate
+Endomycetaceae sarcologist sportswomanship frictionlessly rehabilitative Vaishnavism
+serpentinic antalgol Munnopsidae bonze angiolymphoma eristically stradametrical
+Alethea glacierist seeingness Munnopsidae pterostigma
+Bassaris rainproof bettermost diatomaceous Uraniidae neurodegenerative poleax
+Savitar meriquinoidal squdge prescriber groundneedle idiotize
+vinny ell tailoress goladar exprobratory qualminess mechanist
+hogmace reperuse astronomize vitally Cimmerianism eurythermal seizing
+golem calabazilla migrainoid bathysphere counteractively nonmanufacture pleasurehood knob Semecarpus
+glandularly Machiavel prepavement equiconvex prescriber iniquitously
+pondside monstership Mesua seelful winterproof
+reeveland imprescribable gala sonable figureheadship masa Megaluridae culm
+aspersor semantician Dawsonia erlking frictionlessly ungouged fetlocked pachydermous stormy
+guitarist sonable trailmaking champer sertularian prescriber balanocele prescriber
+comprovincial vesperal bacillite allectory ordinant
+tramplike dinical thorite byroad swacking
+pentafid beatable Harpa swacking tautness cumbrousness aconitine ultrasystematic inferent
+coracomandibular erythremia sportswomanship evictor transudatory stormy sirrah
+Muscicapa swangy cornberry stroking blightbird pyroacetic Cephalodiscus naprapath
+hemimelus homeotypical stapedius slipped subtransverse mammonish
+guanajuatite nectopod sirrah Llandovery eer guanajuatite bought
+saccharogenic Fouquieria archesporial quarried counteralliance adatom scotching balladmonger chronographic
+gorilloid timbermonger papery elastivity sural stereotypography
+cacuminal helpless Bertat untongued astronomize arteriasis proacquittal
+farrantly photoelasticity counteralliance saccharogenic focaloid gymnastic characinoid refective balladmonger
+pachydermatoid expiscate instructiveness obolus adatom gul chorograph antalgol
+sedentariness undinted unefficient disilane eurythermal abusiveness
+tetrahedral inventurous biodynamics cresylite interruptedness metaphrastical commotion dispermy
+metaphonical prezygapophysial concretion lebensraum bogydom upswell cockstone biopsic sviatonosite
+besagne infravaginal overwoven rechar snare
+divinator starosta unstressedly upswell Auriculariales cobeliever cuproiodargyrite
+liquidity bot vesperal palaeotheriodont stiffish Pyrales charioteer
+concretion rotular acidophile lithotresis mesophyte liberatress shellworker overcultured
+ethnocracy widdle fetlocked stroking mutter overbuilt
+ell infestation times Endomycetaceae unrealize genii sirrah kerykeion
+unurban reconciliable slangy unburnt Eryon metapolitics iniquitously serphoid lampyrine
+fallacious scabbardless angiolymphoma exploiter omniscribent avengeful
+Cercosporella paradisean enterostomy horsefly lampyrine furacious Quakerishly epididymitis
+naprapath ventricous omniscribent regardful ipomoein Ophiosaurus apocalypst Machiavel flushgate
+golem trillium templar autoschediastical almud catabaptist overstaid Bermudian manny
+nummi stormy pumpkinification pompiloid adatom metaphrastical unanatomized insatiately prescriber
+archesporial putative underskin uvanite Confervales Spencerism tingly Eryon
+trophonema lophotrichic antiscolic unharmed hyocholic ethmopalatal floatability yote
+engrain aprosopia sural molecule paradisean wherefrom Pithecolobium
+molecule morphiomania dosseret relaster paranephros concretion overbuilt interruptedness
+lifter brutism Sphenodontidae Uraniidae unrealize
+Whilkut airfreighter antalgol appetible Filipendula comparability
+phytonic laubanite Russifier subfebrile subdentate oversand
+propodiale sequacity goodwill mutter chargeably
+undercolored Macraucheniidae Chiasmodontidae quailberry lampyrine guanajuatite
+retinize parastas glandularly tetrahedral noncrystallized skyshine entame
+pneumonalgia cobeliever thermoresistant Savitar laubanite pyrocatechol
+uvanite karyological dispermy discipular pansophism endotheliomyoma Alethea
+bot myesthesia ploration archistome prezygapophysial wingable unswanlike cocksuredom corona
+okonite counteractively dunkadoo asparaginic lophotrichic
+pentafid hogmace cornberry rechar arrowworm Dadaism neuromimesis
+circumzenithal abusiveness pendulant quad Dunlop subofficer saccharogenic unstressedly stapedius
+trillion metrocratic amplexifoliate Vaishnavism Tsonecan
+besagne Oryzorictinae anta cocksuredom authorling trunnel allectory unisexuality
+refective bettermost valvulotomy unanatomized intuition Triconodonta
+sarcologist nonprofession mediateness nonuple constitutor subfoliar Pishquow
+endotheliomyoma Babylonism obolus tum feasibleness friarhood overstaid semantician
+cyanoguanidine doina serpentinic tartrous pseudohalogen predebit cacuminal pumpkinification
+helminthagogic tendomucoid abscission thorite unpredict cyanophilous aconitine cuproiodargyrite seraphism
+classificational hypoplastral figured merciful stiffish uncarefully prescriber
+redecrease Bertat Edo massedly impressor merciful whittle collegian erythrodextrin
+ventricous Gilaki tingly aspersor familist
+critically limpet jajman tailoress cinque Spatangoidea selectivity
+Bertat euphemize neurodegenerative sedentariness interfraternal monstership consumptional
+pleurotropous manny consumptional erythrodextrin mechanist manganosiderite
+posterishness Pishquow Pithecolobium ovopyriform Bishareen Coniferae thermanesthesia overwoven
+wemless penult frontoorbital alen pyxie subofficer licitness swangy leucophoenicite
+heliocentricism decidable qualminess potentness unaccessible frenal goodwill impugnation Triphora
+hondo parabolicness jajman dispermy danseuse oratorship Gothish antivenin
+unevoked ununiformly pterostigma gul inferent aquiline Gilaki
+angiopathy boser embryotic imprescribable selectivity bespin goodwill twinling divinator
+apocalypst pomiferous unefficient scrubbed gorilloid
+electrotechnics figured admissory photoelasticity slait pentagamist frameable
+metaphonical besagne cheesecutter Homoiousian bubble provedore deepmost
+counteralliance zanyism Bermudian thorite unchatteled whittle quailberry tetragynian analgic
+cockal serpentinic corona skyshine cattimandoo meriquinoidal slipped Aktistetae interfraternal
+returnability unfurbelowed allectory cattimandoo pope ununiformly
+skyshine Dadaism corelysis balladmonger toplike airfreighter magnificently tickleproof gemmeous
+affaite expiscate farrantly chronographic agglomeratic gemmeous
+piquantness plugger archistome Spatangoidea avengeful arval
+mangonism daytime visceral enation oratorize undercolored overwoven patroller pamphlet
+metopon metaphrastical nativeness eternal oratorship predebit toxihaemia bettermost
+Triconodonta subdrainage trabecular Tamil seraphism
+supermarket amylogenesis blurredness experientialist goladar Serrifera
+bucketer sawdust saccharogenic preoral Prosobranchiata Spencerism redescend byroad
+Llandovery reciprocation silverhead Dadaism sapphiric phoenicochroite tailoress
+sleigher mechanist sequestrum horsefly untongued trip cubit
+Hysterocarpus Bulanda octogynous pomiferous codisjunct paradisean Tamil circular seditious
+avengeful unscourged nonpoisonous subsequentially stronghearted Filipendula
+Munnopsidae throbless transudatory scabbiness feasibleness predebit
+ramosopalmate coldfinch bathysphere hackneyed steprelationship shellworker hogmace Mycogone
+karyological euphemious supermarket penult imaginary danseuse warriorwise abusiveness corona
+nonsuppressed peristeropode Lincolnlike rehabilitative crystallographical veterinarian
+uninhabitedness sialadenitis monstership acidophile sombreroed undinted shallowish inventurous airfreighter
+helpless swacking flatman putative unchatteled wherefrom sturdied reformatory
+cacuminal stachyuraceous Caphtor pelf rave crystallographical tramplike quad depravity
+bromate testa frontoorbital unscourged mangonism unreprimanded sapphiric frontoorbital vinegarish
+Cimmerianism impressor shallowish unobservantness ladhood placatory centrifugalization euphemize lammy
+comism pleurotropous critically perfunctory aquiline
+ambitus unschematized synovial pictorially undecorated
+unexplicit cromlech inductivity periarthritis hoove
+anta isopelletierin Homoiousian benzothiofuran transude tum hysterolysis
+trailmaking metrocratic toxoplasmosis apopenptic cloy Coniferae boser
+Confervales unexplicit rebilling uncontradictableness toxihaemia opacousness
+cacuminal chasmy imaginary aquiline valvulotomy endotheliomyoma
+Inger astronomize bettermost underogating fetlocked
+okonite squit oblongly Whilkut trisilicic
+glossing intrabred sheepskin shola nonrepetition
+kenno infrastapedial concretion nonutilitarian nonmanufacture rizzomed focaloid ethnocracy naprapath
+Tamil guanajuatite swangy benthonic rede
+cockstone antideflation mammonish metaphonical predebit Hydrangea
+uninterpleaded atlantite ovoviviparous acocotl overbuilt
+mendacity cobeliever besagne concretion balanocele
+antineuritic propheticism cyanophilous mangonism Eryon Sebastian collegian
+divinator exprobratory Hydrangea skyshine Megaluridae karyological agglomeratic
+prefatorial stormy transude comparability commotion endotheliomyoma subfoliar
+allectory myesthesia stapedius Macraucheniidae weism
+hoove starer guitarist limpet unpatched Spatangoidea projecting
+planosubulate subfebrile spermaphyte saccharogenic cyanophilous
+penult collegian uninductive Eleusinian Hester underskin sleigher Serrifera
+paranephros reformatory involatile Macraucheniidae Ghent triakistetrahedral atlantite antiadiaphorist
+spookdom diopside penult nigh spherulitic subangulated Muscicapa aspersor clanned
+agglomeratic prescriber embryotic comprovincial Socraticism introducer glyphography
+undinted euphemize diurnalness autoschediastical beatable imprescribable
+valvula seminonflammable chordacentrum dehairer mendacity projecting
+unimmortal piquantness myesthesia generalizable Coniferae misexposition preparative larklike unfulminated
+unimmortal monstership lifter retinize precostal glyphography
+bromate unschematized ferrogoslarite adatom pinulus
+uninterpleaded genii pentosuria verbid preaffiliate depravity Spencerism
+Hu thermanesthesia unfulminated componental Sebastian impairment
+Edo patroller autoschediastical tetchy shallowish
+Thraupidae visceral boser relaster whittle
+Savitar paranephros preaffiliate lampyrine macropterous predisputant deepmost
+warlike abusiveness Tamil stormy furacious leucophoenicite
+limpet experientialist Megaluridae tonsure misthread benzoperoxide strander hellbender uloid
+mangonism paranephros erythremia whittle emir impairment peristeropode
+choralcelo pondside hypoid mutter sud prescriber transcorporeal oratorship
+Russifier verbid Pithecolobium sud glossing epauliere abusiveness
+Dawsonia licitness oinomancy planosubulate cromlech visceral
+Cephalodiscus angina ambitus periarthritis Jerusalem unreprimanded Dictograph unprovided
+uninterpleaded drome stachyuraceous aprosopia unprovided eulogization spherulitic
+inventurous shallowish quadrennial iniquitously jharal provedore balladmonger
+predebit rechar experientialist infravaginal Saponaria refective
+folious bunghole bespin inductivity imperceptivity ladhood winterproof visceral
+pachydermatoid octogynous throbless overwoven licitness comism eternal kenno
+Aktistetae nonexecutive pseudohalogen glandularly aurothiosulphuric terrestrially Mesua codisjunct botchedly
+cresylite orgiastic iniquitously porriginous hypoplastral pope Whilkut gallybeggar uncontradictableness
+sapphiric comism authorling unpredict arrowworm symbiogenetically
+arteriasis cockal eristically nummi gorilloid overbuilt charioteer propodiale balanocele
+sandbox noncrystallized instructiveness Prosobranchiata antalgol refasten
+breadwinner timbermonger archistome authorling analgic
+trip Eleusinian stormy bicorporeal oinomancy Hysterocarpus lifter
+inertly daytime Ophiosaurus circumzenithal admissory concretion crystallographical coadvice counteralliance
+ell unurban lineamental interfraternal isopelletierin
+cretaceous exploiter uncarefully cubby rivethead uninhabitedness oversand uvanite mendacity
+almud boor widdle hogmace toxoplasmosis unharmed
+taurocolla repealableness ramosopalmate ascitic dastardliness Filipendula dunkadoo giantly lebensraum
+osteopaedion pseudoxanthine botchedly hepatorrhaphy redesertion Hysterocarpus diplomatize paradisean steprelationship
+allectory mericarp dipsomaniacal reconciliable pendulant subirrigate leucophoenicite deepmost misthread
+refective Tamil angina dastardliness swangy
+golem dialoguer hemimelus culm parmelioid
+sloped technopsychology seminonflammable pachydermatoid transude propheticism trip arrendation warriorwise
+peristeropode halloo consumptional ambitus nummi
+Vaishnavism liquidity involatile incalculable papery mutter starosta quadrennial figureheadship
+ornithodelphous paunchy prescriber decidable dermorhynchous exploiter ticktick lifter
+spot seizing benzothiofuran unisexuality laryngic infestation
+abthainry undercolored balladmonger chronographic saponaceous orthopedical infestation enterostomy unforkedness
+collegian alveolite templar wandoo osteopaedion barkometer frontoorbital serosanguineous mericarp
+transcortical pneumonalgia micromembrane diurnalness chargeably hysterolysis osteopaedion
+phlogisticate Scanic cumbrousness unachievable ten imprescribable jajman
+unurban antineuritic unefficient templar squdge Spencerism orchiocatabasis fetlocked
+stradametrical wherefrom subdentate Gothish impugnation componental
+eucalypteol jharal fallacious spermaphyte ultratense arrendation
+horsefly diathermacy dermorhynchous agglomeratic wemless Homoiousian
+amylogenesis knob Aplacentalia giantly pentafid genii
+by velaric proauction oratorship commandingness Haversian uncompromisingly
+toxihaemia provedore psychofugal bonze digitule
+orgiastic coldfinch danseuse introducer almud merciful manganosiderite chorograph
+chorograph planispheric plugger unpatched pyroacetic Alethea benzothiofuran counterappellant
+anta sapphiric benthonic allotropic gelatinousness
+gul pneumatotherapy bismuthiferous prospectiveness bromate unrealize hondo
+laurinoxylon lithotresis flippantness consumptional slipped
+overwoven Pincian stiffish aconitine seizing instructiveness endotheliomyoma halloo
+ultrasystematic instructiveness unimmortal Lemuridae basto groundneedle outwealth
+rivethead saccharogenic nigh scyphostoma balladmonger pachydermatoid
+gala fossilism ultratense ladhood orchiocatabasis upswell catabaptist Italical unprovided
+penult phallaceous cornberry Vaishnavism times Bulanda divinator
+licitness benzoperoxide Helvidian mesymnion acidophile
+brutism cubit dipsomaniacal oxyterpene ungouged Edo nonprofession
+chorograph Prosobranchiata unfulminated diwata symbiogenetically swearingly Sphenodontidae unrepealably
+bromic preoral stradametrical undercolored dithery
+electrotechnics scabbardless seminonflammable imprescribable infrastapedial nonsuppressed
+thermanesthesia angina okonite bestill authorling Scorpaenidae louse by
+waird deaf epauliere pentafid ethnocracy misthread scotale balladmonger bonze
+subdrainage piquantness impairment arrowworm vinegarish atlantite poleax
+manganosiderite perfunctory periclitation bicorporeal arteriasis embryotic Pithecolobium sturdied
+phoenicochroite unscourged sialadenitis whitlowwort terrestrially proacquittal almud Bassaris
+Mormyrus tartrous toplike vinegarish absvolt
+divinator gemmeous sapience laurinoxylon seizing orchiocatabasis benthonic depressingly quailberry
+sheepskin stapedius hypochondriacism sviatonosite preparative adatom docimastical
+overstudiousness barkometer benzoperoxide divinator masa chordacentrum scapuloradial
+omniscribent Hydrangea myesthesia lineamental Haversian
+Bassaris warlike doina overinstruct Animalivora
+vitally Florissant prepavement imaginary yeelaman outwealth
+potentness epididymitis doina overwoven sheepskin pendulant scabbardless ultrasystematic gelatinousness
+liberatress blurredness benzoperoxide predisputant throbless prolificy pomiferous
+unachievable ungouged gunshop bacterioblast photoelasticity mesymnion scabbardless misthread
+subfoliar aconitine corelysis undecorated acocotl sud
+ultraobscure oinomancy hemimelus seelful liberatress aquiline Dodecatheon clanned
+dipsomaniacal abthainry gorilloid dithery bot smokefarthings cloy
+uncombable brooky magnificently bought fossilism concretion technopsychology depravity subtransverse
+subofficer debellator angiolymphoma venialness Arneb pictorially warlike sarcologist
+Munychian neuromimesis sesquiquintile sportswomanship Dawsonia Socraticism incalculable bugre outhue
+figureheadship sviatonosite uninductive unstipulated planosubulate horsefly weism
+characinoid poleax benzoperoxide sedentariness Isokontae
+stormy oinomancy Edo stewardship ambitus technopsychology yeat sapience
+diatomaceous unrepealably rainproof transude nonprofession phlogisticate Glecoma scyphostoma
+discipular seelful nonuple neurotrophic coadvice pony zenick
+saccharogenic insatiately proboscidiform blurredness stormy dialoguer floatability
+becomma zoonitic whittle wingable phytonic
+cumbrousness weism componental bismuthiferous underogating Scanic sombreroed electrotechnics planosubulate
+glacierist octogynous dithery chacona monilioid overcrown friarhood unrepealably
+digitule trabecular projecting oratorize phlogisticate Fouquieria
+times atlantite sesquiquintile comism Scorpaenidae volcano
+reconciliable warlike raphis spookdom monilioid ventricous relaster migrainoid arduousness
+relaster subangulated evictor rave tartrous pumpkinification
+pictorially intrabred devilwise abstractionism calycular misexposition cockal uloid
+spot sturdied paunchy plerome Inger
+critically spherulitic Triconodonta balladmonger penult comparability aurothiosulphuric Itea
+saccharogenic greave inexistency horsefly cocksuredom
+afterpressure selectivity triakistetrahedral cacuminal shellworker Muscicapa
+mustafina prospectiveness horsefly sombreroed yawler reperuse pleasurehood blurredness
+inductivity unschematized neurodegenerative diurnalness subsequentially soorkee divinator Megaluridae
+arteriasis Mesua allectory farrantly toplike guitarist
+aquiline codisjunct squdge allectory pelf squit palaeotheriodont asparaginic
+Saponaria diminutively chooser Homoiousian eer dipsomaniacal impressor jajman
+approbation physiologian immatchable antiadiaphorist seminonflammable
+coldfinch psychofugal Animalivora ultrasystematic corelysis
+oinomancy Joachimite tartrous interruptedness pelf overwoven acocotl
+refective metopon proboscidiform overstudiousness pope nonrepetition
+chargeably giantly imprescribable unprovided clanned farrantly
+absvolt Shiah cockstone trillium absvolt planosubulate scotching cornberry throbless
+lyrebird constitutor pomiferous pneumatotherapy orthopedical potentness strammel porriginous seraphism
+unrepealably unburnt Endomycetaceae dehairer meriquinoidal isopelletierin tricae involatile
+diatomaceous scapuloradial epidymides tickleproof euphemize bunghole Triconodonta
+taurocolla collegian beneficent pony reformatory Yannigan orgiastic pope
+peptonate swangy pictorially obolus ploration benzothiofuran exploiter Scorpaenidae
+Spencerism bugre squdge ultratense uvanite approbation relaster
+Edo Eleusinian spiranthic pictorially countergabion bettermost tickleproof
+Fouquieria tetrahedral dishpan putative pictorially ambitus Effie unreprimanded
+bot metopon synovial undecorated preparative airfreighter
+sangaree pompiloid antiscolic coracomandibular epauliere
+undiffusive scabbardless vinny Bertat Passiflorales sloped undercolored
+lithograph Shiah erythrodextrin slipped peptonate larklike
+scotale various unstressedly relaster limpet
+stapedius ultratense sedentariness hellbender dipsomaniacal trunnel familist ovoviviparous stronghearted
+mastication impairment basto spiranthic tickleproof uncombable eurythermal various
+gala Alethea quad umbellic decidable orgiastic
+antihero enhedge jharal cumbrousness rede overstudiousness transude wingable
+gemmeous hypoid characinoid analgize Chiasmodontidae
+unharmed okonite merciful chacona jirble
+pentagamist acocotl seraphism cuproiodargyrite dermorhynchous debromination metrocratic
+shellworker atlantite doina paradisean circumzenithal stewardship scapuloradial
+regardful involatile bromic ladhood barkometer circular unpeople
+heliocentricism mechanist byroad Animalivora strammel veterinarian
+depthwise jirble nativeness marten preparative dosseret
+Zuludom floatability mangonism sesquiquintile thorite sertularian pleurotropous Prosobranchiata
+prezygapophysial terrestrially Prosobranchiata cresylite topline umangite lineamental
+coracomandibular counterappellant preagitate Confervales insatiately skyshine proauction
+omega Prosobranchiata deepmost subdrainage planosubulate
+Triphora debromination isopelletierin Aplacentalia monstership redesertion imprescribable sedentariness meriquinoidal
+Savitar uninhabitedness Eleusinian cubby Russifier propheticism beatable pterostigma prolificy
+pansophism focaloid eulogization impairment Hydrangea antineuritic
+gala decardinalize frameable lienteria seditious
+deepmost uncompromisingness Prosobranchiata Confervales Macraucheniidae classificational dunkadoo biodynamics returnability
+embryotic gymnastic toxoplasmosis anta analgize adscendent louse Hysterocarpus undinted
+divinator Jerusalem brooky flushgate saccharogenic ultratense ell
+Pishquow affaite putative supermarket schoolmasterism squit unisexuality centrifugalization lampyrine
+liberatress antivenin marten selectivity scapuloradial uninterpleaded scrubbed lithotresis
+gul avengeful licitness analgic rainproof schoolmasterism cresylite yote
+phoenicochroite euphemious hackneyed unprovided bucketer fallacious carposporangial repealableness jirble
+ticktick subdrainage biodynamics michigan comism
+sialadenitis vinegarish pterostigma debellator noncrystallized
+frenal bugre suspend pictorially parabolicness vinny pelf
+scotching skyshine homeotypical Fameuse Gilaki serosanguineous Hydrangea
+umbellic planosubulate dithery various reappreciate stroking rizzomed chrysochrous
+slangy uninterpleaded reciprocation unisexuality subirrigate Joachimite
+unimmortal undiffusive instructiveness chordacentrum Passiflorales
+overwoven timbermonger Protestantize slangy visceral concretion
+dithery commandingness Bassaris uncompromisingness redescend placatory myesthesia chrysochrous
+aspersor proacquittal raphis cylindric overstudiousness symbiogenetically
+wherefrom adatom undeterring marten centrifugalization trisilicic uncontradictableness
+Inger cocksuredom seminonflammable pompiloid concretion epauliere technopsychology peristeropode
+rizzomed metastoma basto imperceptivity canicule
+foursquare prescriptible Coniferae soorkee Yannigan unswanlike Aplacentalia
+bladderwort lyrebird boor trophonema embryotic
+raphis tristich impressor dunkadoo seditious insatiately chronist throbless
+bromic scotale migrainoid oblongly reperuse cervisial dialoguer Haversian
+Vaishnavism greave exprobratory saponaceous redesertion bozal
+unexplicit zenick liberatress Scorpaenidae transcortical componental Megaluridae naught
+provedore codisjunct intuition penult absvolt temporomastoid vinegarish monogoneutic
+vesperal peristeropode swangy unisexuality vesperal
+cocksuredom balanocele glossing participatingly liquidity lifter Fouquieria
+theologal archididascalian divinator impairment gymnastic characinoid topsail impressor
+metapolitics unschematized knob proauction peristeropode jajman glaumrie commandingness
+oflete generalizable frictionlessly overbuilt pseudohalogen cacuminal
+commandingness stereotypography oflete seditious nonuple arrowworm debellator rave
+twinling times unpatched dinical pneumonalgia mendacity
+Hysterocarpus pony massedly stachyuraceous unlapsing palaeotheriodont chorograph
+chronographic sapphiric cyanophilous tramplike laryngic
+putative figured euphemious Homoiousian dastardliness Bermudian
+verbid Llandovery papery pneumonalgia glossing ticktick constitutor plugger subdrainage
+Bermudian agglomeratic cylindric sawdust debellator periclitation becomma refasten
+pansophism laubanite pyxie Protestantize metoxazine horsefly repealableness
+basto componental repealableness whitlowwort eristically
+unpredict propodiale endotheliomyoma uvanite sombreroed
+intrabred thiodiazole autobiographist frameable outwealth Edo moodishness unswanlike phytonic
+chasmy phytoma subdrainage Italical amplexifoliate physiologian
+Haversian diplomatize omniscribent pleasurehood mangonism unaccessible
+metastoma unrealize cubby Tsonecan manilla diplomatize
+predebit Consolamentum metapolitics instructiveness familist topline squit Arneb
+slait generalizable unanatomized unreprimanded boor figureheadship omniscribent dialoguer
+flatman serpentinic orgiastic upswell unurban playfellowship ovoviviparous sertularian uncarefully
+lienteria Glecoma playfellowship trophonema subangulated iniquitously proauction
+migrainoid marten thermochemically frontoorbital japanned flutist
+rotular cockstone Edo stradametrical flushgate paranephros okonite
+oversand hymnic subofficer choralcelo sapphiric spiranthic
+unexplicit porriginous familist apocalypst Eleusinian
+yeelaman flutist starosta dunkadoo Spatangoidea Orbitolina Hester terrificness Pyrales
+monander transcorporeal hypochondriacism seeingness octogynous perculsive Shiah analgic
+uniarticular bladderwort Thraupidae bozal warriorwise
+unisexuality palaeotheriodont inventurous bromic dithery unrepealably erlking
+dermorhynchous serosanguineous Pithecolobium parabolicness seizing
+splenauxe impairment seizing magnificently doubtingness imprescribable
+consumptional orgiastic analgic neuromimesis seizing
+Bermudian subdentate quadrennial cylindric lithograph pony paleornithology
+interruptor starosta antiscolic goodwill euphemious
+subofficer avengeful Homoiousian ti
<TRUNCATED>
[11/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/SpringJmsProvider.java
----------------------------------------------------------------------
diff --git a/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/SpringJmsProvider.java b/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/SpringJmsProvider.java
new file mode 100644
index 0000000..306fc25
--- /dev/null
+++ b/examples/storm-jms-examples/src/main/java/org/apache/storm/jms/example/SpringJmsProvider.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.jms.example;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import org.apache.storm.jms.JmsProvider;
+
+
+/**
+ * A <code>JmsProvider</code> that uses the spring framework
+ * to obtain a JMS <code>ConnectionFactory</code> and
+ * <code>Desitnation</code> objects.
+ * <p/>
+ * The constructor takes three arguments:
+ * <ol>
+ * <li>A string pointing to the the spring application context file contining the JMS configuration
+ * (must be on the classpath)
+ * </li>
+ * <li>The name of the connection factory bean</li>
+ * <li>The name of the destination bean</li>
+ * </ol>
+ *
+ *
+ *
+ */
+@SuppressWarnings("serial")
+public class SpringJmsProvider implements JmsProvider {
+ private ConnectionFactory connectionFactory;
+ private Destination destination;
+
+ /**
+ * Constructs a <code>SpringJmsProvider</code> object given the name of a
+ * classpath resource (the spring application context file), and the bean
+ * names of a JMS connection factory and destination.
+ *
+ * @param appContextClasspathResource - the spring configuration file (classpath resource)
+ * @param connectionFactoryBean - the JMS connection factory bean name
+ * @param destinationBean - the JMS destination bean name
+ */
+ public SpringJmsProvider(String appContextClasspathResource, String connectionFactoryBean, String destinationBean){
+ ApplicationContext context = new ClassPathXmlApplicationContext(appContextClasspathResource);
+ this.connectionFactory = (ConnectionFactory)context.getBean(connectionFactoryBean);
+ this.destination = (Destination)context.getBean(destinationBean);
+ }
+
+ public ConnectionFactory connectionFactory() throws Exception {
+ return this.connectionFactory;
+ }
+
+ public Destination destination() throws Exception {
+ return this.destination;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jms-examples/src/main/resources/jms-activemq.xml
----------------------------------------------------------------------
diff --git a/examples/storm-jms-examples/src/main/resources/jms-activemq.xml b/examples/storm-jms-examples/src/main/resources/jms-activemq.xml
new file mode 100644
index 0000000..1a845b8
--- /dev/null
+++ b/examples/storm-jms-examples/src/main/resources/jms-activemq.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<beans
+ xmlns="http://www.springframework.org/schema/beans"
+ xmlns:amq="http://activemq.apache.org/schema/core"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+ http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
+
+ <!-- ActiveMQ -->
+
+ <!-- embedded ActiveMQ Broker -->
+ <!-- <amq:broker useJmx="false" persistent="false">
+ <amq:transportConnectors>
+ <amq:transportConnector uri="tcp://localhost:61616" />
+ </amq:transportConnectors>
+ </amq:broker> -->
+
+ <amq:queue id="notificationQueue" physicalName="backtype.storm.contrib.example.queue" />
+
+ <amq:topic id="notificationTopic" physicalName="backtype.storm.contrib.example.topic" />
+
+ <amq:connectionFactory id="jmsConnectionFactory"
+ brokerURL="tcp://localhost:61616" />
+
+ <!-- <bean id="queueTemplate" class="org.springframework.jms.core.JmsTemplate">
+ <property name="connectionFactory">
+ <ref bean="jmsConnectionFactory" />
+ </property>
+ <property name="pubSubDomain" value="false" />
+ </bean> -->
+
+</beans>
+
+
+
+
+
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-jms-examples/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/examples/storm-jms-examples/src/main/resources/log4j.properties b/examples/storm-jms-examples/src/main/resources/log4j.properties
new file mode 100644
index 0000000..079b195
--- /dev/null
+++ b/examples/storm-jms-examples/src/main/resources/log4j.properties
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+log4j.rootLogger=INFO, stdout
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.stdout.layout.ConversionPattern=%5p (%C:%L) - %m%n
+
+
+log4j.logger.backtype.storm.contrib=DEBUG
+log4j.logger.clojure.contrib=WARN
+log4j.logger.org.springframework=WARN
+log4j.logger.org.apache.zookeeper=WARN
+
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-kafka-client-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-kafka-client-examples/pom.xml b/examples/storm-kafka-client-examples/pom.xml
index 1c4449b..554818b 100644
--- a/examples/storm-kafka-client-examples/pom.xml
+++ b/examples/storm-kafka-client-examples/pom.xml
@@ -31,20 +31,6 @@
<artifactId>storm-kafka-client-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-kafka-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-kafka-examples/pom.xml b/examples/storm-kafka-examples/pom.xml
index 8c1e74d..65eeda6 100644
--- a/examples/storm-kafka-examples/pom.xml
+++ b/examples/storm-kafka-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-kafka-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-mongodb-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-mongodb-examples/pom.xml b/examples/storm-mongodb-examples/pom.xml
index 6def943..297a6e8 100644
--- a/examples/storm-mongodb-examples/pom.xml
+++ b/examples/storm-mongodb-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-mongodb-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-mqtt-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-mqtt-examples/pom.xml b/examples/storm-mqtt-examples/pom.xml
index ab061c4..ca2d03b 100644
--- a/examples/storm-mqtt-examples/pom.xml
+++ b/examples/storm-mqtt-examples/pom.xml
@@ -31,20 +31,6 @@
<relativePath>../../pom.xml</relativePath>
</parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-opentsdb-examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-opentsdb-examples/pom.xml b/examples/storm-opentsdb-examples/pom.xml
index 2a24f8d..9ffd12f 100644
--- a/examples/storm-opentsdb-examples/pom.xml
+++ b/examples/storm-opentsdb-examples/pom.xml
@@ -27,20 +27,6 @@
<artifactId>storm-opentsdb-examples</artifactId>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/README.markdown
----------------------------------------------------------------------
diff --git a/examples/storm-perf/README.markdown b/examples/storm-perf/README.markdown
new file mode 100644
index 0000000..946ab21
--- /dev/null
+++ b/examples/storm-perf/README.markdown
@@ -0,0 +1,50 @@
+# Topologies for measuring Storm performance
+
+This module includes topologies designed for measuring Storm performance.
+
+## Overview
+There are two basic modes for running these topologies
+
+- **Cluster mode:** Submits the topology to a storm cluster. This mode is useful for benchmarking. It calculates throughput and latency numbers every minute and prints them on the console.
+- **In-process mode:** Uses LocalCluster to run topology. This mode helps identify bottlenecks using profilers like JProfiler from within a IDE. This mode does not print metrics.
+
+In both the modes, a shutdown hook is setup to terminate the topology when the program that is submitting the topology is terminated.
+
+The bundled topologies can be classified into two types.
+
+- Topologies that measure purely the internal functioning of Storm. Such topologies do not interact with external systems like Kafka or Hdfs.
+- Topologies that measure speed of I/O with external systems like Kafka and Hdfs.
+
+Topologies that measure internal performance can be run in either in-proc or cluster modes.
+Topologies that measure I/O with external systems are designed to run in cluster mode only.
+
+## Topologies List
+
+1. **ConstSpoutOnlyTopo:** Helps measure how fast spout can emit. This topology has a spout and is not connected to any bolts. Supports in-proc and cluster mode.
+2. **ConstSpoutNullBoltTopo:** Helps measure how fast spout can send data to a bolt. Spout emits a stream of constant values to a DevNull bolt which discards the incoming tuples. Supports in-proc and cluster mode.
+3. **ConstSpoutIdBoltNullBoltTopo:** Helps measure speed of messaging between spouts and bolts. Spout emits a stream of constant values to an ID bolt which clones the tuple and emits it downstream to a DevNull bolt. Supports in-proc and cluster mode.
+4. **FileReadWordCount:** Measures speed of word counting. The spout loads a file into memory and emits these lines in an infinite loop. Supports in-proc and cluster mode.
+5. **HdfsSpoutNullBolt:** Measures speed at which HdfsSpout can read from HDFS. Supports cluster mode only.
+6. **StrGenSpoutHdfsBoltTopo:** Measures speed at which HdfsBolt can write to HDFS. Supports cluster mode only.
+7. **KafkaSpoutNullBolt:** Measures speed at which KafkaSpout can read from Kafka. Supports cluster mode only.
+8. **KafkaHdfsTopo:** Measures how fast Storm can read from Kafka and write to HDFS.
+
+
+## How to run ?
+
+### In-process mode:
+This mode is intended for running the topology quickly and easily from within the IDE and does not expect any command line arguments.
+Simply running the Topology's main() method without any arguments will get it running. The topology runs indefinitely till the program is terminated.
+
+
+### Cluster mode:
+When the topology is run with one or more than one cmd line arguments, the topology is submitted to the cluster.
+The first argument indicates how long the topology should be run. Often the second argument refers to a yaml config
+file which contains topology configuration settings. The conf/ directory in this module contains sample config files
+with names matching the corresponding topology.
+
+These topologies can be run using the standard storm jar command.
+
+```
+bin/storm jar /path/storm-perf-1.1.0-jar-with-dependencies.jar org.apache.storm.perf.ConstSpoutNullBoltTopo 200 conf/ConstSpoutIdBoltNullBoltTopo.yaml
+```
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/pom.xml
----------------------------------------------------------------------
diff --git a/examples/storm-perf/pom.xml b/examples/storm-perf/pom.xml
new file mode 100644
index 0000000..64ae889
--- /dev/null
+++ b/examples/storm-perf/pom.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>storm</artifactId>
+ <groupId>org.apache.storm</groupId>
+ <version>2.0.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-perf</artifactId>
+ <packaging>jar</packaging>
+ <name>Storm Perf</name>
+ <description>Topologies and tools to measure performance.</description>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <configuration>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ <archive>
+ <manifest>
+ <mainClass />
+ </manifest>
+ </archive>
+ </configuration>
+ <executions>
+ <execution>
+ <id>make-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+
+ </plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.2.1</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <executable>java</executable>
+ <includeProjectDependencies>true</includeProjectDependencies>
+ <includePluginDependencies>false</includePluginDependencies>
+ <classpathScope>compile</classpathScope>
+ <mainClass>${storm.topology}</mainClass>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-core</artifactId>
+ <version>${project.version}</version>
+ <!--
+ Use "provided" scope to keep storm out of the jar-with-dependencies
+ For IntelliJ dev, intellij will load properly.
+ -->
+ <scope>${provided.scope}</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-kafka</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.storm</groupId>
+ <artifactId>storm-hdfs</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+
+
+</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/conf/ConstSpoutIdBoltNullBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/conf/ConstSpoutIdBoltNullBoltTopo.yaml b/examples/storm-perf/src/main/conf/ConstSpoutIdBoltNullBoltTopo.yaml
new file mode 100644
index 0000000..9f74aee
--- /dev/null
+++ b/examples/storm-perf/src/main/conf/ConstSpoutIdBoltNullBoltTopo.yaml
@@ -0,0 +1,22 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spout.count : 1
+bolt1.count : 1 # IdBolt instances
+bolt2.count : 1 # DevNullBolt instances
+
+# storm config overrides
+topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/conf/ConstSpoutNullBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/conf/ConstSpoutNullBoltTopo.yaml b/examples/storm-perf/src/main/conf/ConstSpoutNullBoltTopo.yaml
new file mode 100644
index 0000000..51f2dd7
--- /dev/null
+++ b/examples/storm-perf/src/main/conf/ConstSpoutNullBoltTopo.yaml
@@ -0,0 +1,22 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spout.count : 1
+bolt.count : 1
+grouping : "local" # either "shuffle" or "local"
+
+# storm config overrides
+topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/conf/FileReadWordCountTopo.yaml
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/conf/FileReadWordCountTopo.yaml b/examples/storm-perf/src/main/conf/FileReadWordCountTopo.yaml
new file mode 100644
index 0000000..61abe8f
--- /dev/null
+++ b/examples/storm-perf/src/main/conf/FileReadWordCountTopo.yaml
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spout.count : 1
+splitter.count : 1
+counter.count : 1
+input.file : "/Users/roshan/Projects/idea/storm/storm-perf/src/main/resources/randomwords.txt"
+
+# storm config overrides
+topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/conf/HdfsSpoutNullBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/conf/HdfsSpoutNullBoltTopo.yaml b/examples/storm-perf/src/main/conf/HdfsSpoutNullBoltTopo.yaml
new file mode 100644
index 0000000..a06ad6e
--- /dev/null
+++ b/examples/storm-perf/src/main/conf/HdfsSpoutNullBoltTopo.yaml
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spout.count : 1
+bolt.count : 1
+hdfs.uri : "hdfs://hdfs.namenode:8020"
+hdfs.source.dir : "/tmp/storm/in"
+hdfs.archive.dir : "/tmp/storm/done"
+hdfs.bad.dir : "/tmp/storm/bad"
+
+# storm config overrides
+topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/conf/KafkaHdfsTopo.yaml
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/conf/KafkaHdfsTopo.yaml b/examples/storm-perf/src/main/conf/KafkaHdfsTopo.yaml
new file mode 100755
index 0000000..a8ed2f2
--- /dev/null
+++ b/examples/storm-perf/src/main/conf/KafkaHdfsTopo.yaml
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spout.count : 1
+bolt.count : 1
+kafka.topic : "kafka_topic"
+zk.uri : "zkhostname:2181"
+hdfs.uri : "hdfs://hdfs.namenode:8020"
+hdfs.dir : "/tmp/storm"
+hdfs.batch : 1000
+
+# storm config overrides
+topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/conf/KafkaSpoutNullBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/conf/KafkaSpoutNullBoltTopo.yaml b/examples/storm-perf/src/main/conf/KafkaSpoutNullBoltTopo.yaml
new file mode 100644
index 0000000..cde4c2e
--- /dev/null
+++ b/examples/storm-perf/src/main/conf/KafkaSpoutNullBoltTopo.yaml
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spout.count : 1
+bolt.count : 1
+kafka.topic : "kafka_topic"
+zk.uri : "zkhostname:2181"
+
+# storm config overrides
+topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/conf/StrGenSpoutHdfsBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/conf/StrGenSpoutHdfsBoltTopo.yaml b/examples/storm-perf/src/main/conf/StrGenSpoutHdfsBoltTopo.yaml
new file mode 100644
index 0000000..d16431b
--- /dev/null
+++ b/examples/storm-perf/src/main/conf/StrGenSpoutHdfsBoltTopo.yaml
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spout.count : 1
+bolt.count : 1
+hdfs.uri : "hdfs://hdfs.namenode:8020"
+hdfs.dir : "/tmp/storm"
+hdfs.batch : 1000
+
+
+# storm config overrides
+topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutIdBoltNullBoltTopo.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutIdBoltNullBoltTopo.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutIdBoltNullBoltTopo.java
new file mode 100644
index 0000000..11c63d3
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutIdBoltNullBoltTopo.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf;
+
+import org.apache.storm.Config;
+import org.apache.storm.LocalCluster;
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.perf.bolt.DevNullBolt;
+import org.apache.storm.perf.bolt.IdBolt;
+import org.apache.storm.perf.spout.ConstSpout;
+import org.apache.storm.perf.utils.Helper;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.utils.Utils;
+
+import java.util.Map;
+
+/**
+ * ConstSpout -> IdBolt -> DevNullBolt
+ * This topology measures speed of messaging between spouts->bolt and bolt->bolt
+ * ConstSpout : Continuously emits a constant string
+ * IdBolt : clones and emits input tuples
+ * DevNullBolt : discards incoming tuples
+ */
+public class ConstSpoutIdBoltNullBoltTopo {
+
+ public static final String TOPOLOGY_NAME = "ConstSpoutIdBoltNullBoltTopo";
+ public static final String SPOUT_ID = "constSpout";
+ public static final String BOLT1_ID = "idBolt";
+ public static final String BOLT2_ID = "nullBolt";
+
+ // Configs
+ public static final String BOLT1_COUNT = "bolt1.count";
+ public static final String BOLT2_COUNT = "bolt2.count";
+ public static final String SPOUT_COUNT = "spout.count";
+
+ public static StormTopology getTopology(Map conf) {
+
+ // 1 - Setup Spout --------
+ ConstSpout spout = new ConstSpout("some data").withOutputFields("str");
+
+ // 2 - Setup IdBolt & DevNullBolt --------
+ IdBolt bolt1 = new IdBolt();
+ DevNullBolt bolt2 = new DevNullBolt();
+
+
+ // 3 - Setup Topology --------
+ TopologyBuilder builder = new TopologyBuilder();
+
+ builder.setSpout(SPOUT_ID, spout, Helper.getInt(conf, SPOUT_COUNT, 1) );
+
+ builder.setBolt(BOLT1_ID, bolt1, Helper.getInt(conf, BOLT1_COUNT, 1))
+ .localOrShuffleGrouping(SPOUT_ID);
+
+ builder.setBolt(BOLT2_ID, bolt2, Helper.getInt(conf, BOLT2_COUNT, 1))
+ .localOrShuffleGrouping(BOLT1_ID);
+
+ return builder.createTopology();
+ }
+
+
+ public static void main(String[] args) throws Exception {
+
+ if (args.length <= 0) {
+ // submit to local cluster
+ Config conf = new Config();
+ LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology(conf));
+
+ Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
+ while (true) {// run indefinitely till Ctrl-C
+ Thread.sleep(20_000_000);
+ }
+ } else {
+ // submit to real cluster
+ if (args.length >2) {
+ System.err.println("args: runDurationSec [optionalConfFile]");
+ return;
+ }
+ Integer durationSec = Integer.parseInt(args[0]);
+ Map topoConf = (args.length==2) ? Utils.findAndReadConfigFile(args[1]) : new Config();
+
+ // Submit topology to storm cluster
+ Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutNullBoltTopo.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutNullBoltTopo.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutNullBoltTopo.java
new file mode 100755
index 0000000..92c2787
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutNullBoltTopo.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf;
+
+import org.apache.storm.Config;
+import org.apache.storm.LocalCluster;
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.perf.bolt.DevNullBolt;
+import org.apache.storm.perf.spout.ConstSpout;
+import org.apache.storm.perf.utils.Helper;
+import org.apache.storm.topology.BoltDeclarer;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.utils.Utils;
+
+import java.util.Map;
+
+/***
+ * This topo helps measure the messaging speed between a spout and a bolt.
+ * Spout generates a stream of a fixed string.
+ * Bolt will simply ack and discard the tuple received
+ */
+
+public class ConstSpoutNullBoltTopo {
+
+ public static final String TOPOLOGY_NAME = "ConstSpoutNullBoltTopo";
+ public static final String SPOUT_ID = "constSpout";
+ public static final String BOLT_ID = "nullBolt";
+
+ // Configs
+ public static final String BOLT_COUNT = "bolt.count";
+ public static final String SPOUT_COUNT = "spout.count";
+ public static final String GROUPING = "grouping"; // can be 'local' or 'shuffle'
+
+ public static final String LOCAL_GROPING = "local";
+ public static final String SHUFFLE_GROUPING = "shuffle";
+ public static final String DEFAULT_GROUPING = LOCAL_GROPING;
+
+ public static StormTopology getTopology(Map conf) {
+
+ // 1 - Setup Spout --------
+ ConstSpout spout = new ConstSpout("some data").withOutputFields("str");
+
+ // 2 - Setup DevNull Bolt --------
+ DevNullBolt bolt = new DevNullBolt();
+
+
+ // 3 - Setup Topology --------
+ TopologyBuilder builder = new TopologyBuilder();
+
+ builder.setSpout(SPOUT_ID, spout, Helper.getInt(conf, SPOUT_COUNT, 1) );
+ BoltDeclarer bd = builder.setBolt(BOLT_ID, bolt, Helper.getInt(conf, BOLT_COUNT, 1));
+
+ String groupingType = Helper.getStr(conf, GROUPING);
+ if(groupingType==null || groupingType.equalsIgnoreCase(DEFAULT_GROUPING) )
+ bd.localOrShuffleGrouping(SPOUT_ID);
+ else if(groupingType.equalsIgnoreCase(SHUFFLE_GROUPING) )
+ bd.shuffleGrouping(SPOUT_ID);
+ return builder.createTopology();
+ }
+
+ /**
+ * ConstSpout -> DevNullBolt with configurable grouping (default localOrShuffle)
+ */
+ public static void main(String[] args) throws Exception {
+
+ if(args.length <= 0) {
+ // For IDE based profiling ... submit topology to local cluster
+ Config conf = new Config();
+ final LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology(conf));
+
+ Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
+ while (true) {// run indefinitely till Ctrl-C
+ Thread.sleep(20_000_000);
+ }
+
+ } else {
+ // For measuring perf against a Storm cluster
+ if (args.length > 2) {
+ System.err.println("args: runDurationSec [optionalConfFile]");
+ return;
+ }
+ Integer durationSec = Integer.parseInt(args[0]);
+ Map topoConf = (args.length==2) ? Utils.findAndReadConfigFile(args[1]) : new Config();
+
+ // Submit topology to storm cluster
+ Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
+ }
+ }
+
+}
+
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutOnlyTopo.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutOnlyTopo.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutOnlyTopo.java
new file mode 100755
index 0000000..721ae3d
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/ConstSpoutOnlyTopo.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf;
+
+import org.apache.storm.Config;
+import org.apache.storm.LocalCluster;
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.perf.spout.ConstSpout;
+import org.apache.storm.perf.utils.Helper;
+import org.apache.storm.topology.TopologyBuilder;
+
+
+/***
+ * This topo helps measure how fast a spout can produce data (so no bolts are attached)
+ * Spout generates a stream of a fixed string.
+ */
+
+public class ConstSpoutOnlyTopo {
+
+ public static final String TOPOLOGY_NAME = "ConstSpoutOnlyTopo";
+ public static final String SPOUT_ID = "constSpout";
+
+
+ public static StormTopology getTopology() {
+
+ // 1 - Setup Const Spout --------
+ ConstSpout spout = new ConstSpout("some data").withOutputFields("str");
+
+ // 2 - Setup Topology --------
+ TopologyBuilder builder = new TopologyBuilder();
+ builder.setSpout(SPOUT_ID, spout, 1);
+ return builder.createTopology();
+ }
+
+ /**
+ * ConstSpout only topology (No bolts)
+ */
+ public static void main(String[] args) throws Exception {
+ if(args.length <= 0) {
+ // For IDE based profiling ... submit topology to local cluster
+ LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology());
+
+ Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
+ while (true) {// run indefinitely till Ctrl-C
+ Thread.sleep(20_000_000);
+ }
+ } else {
+ // Submit topology to storm cluster
+ if (args.length != 1) {
+ System.err.println("args: runDurationSec");
+ return;
+ }
+ Integer durationSec = Integer.parseInt(args[0]);
+
+ Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, new Config(), getTopology());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/FileReadWordCountTopo.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/FileReadWordCountTopo.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/FileReadWordCountTopo.java
new file mode 100644
index 0000000..d518c86
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/FileReadWordCountTopo.java
@@ -0,0 +1,96 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License
+*/
+package org.apache.storm.perf;
+
+
+import org.apache.storm.Config;
+import org.apache.storm.LocalCluster;
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.perf.bolt.CountBolt;
+import org.apache.storm.perf.bolt.SplitSentenceBolt;
+import org.apache.storm.perf.spout.FileReadSpout;
+import org.apache.storm.perf.utils.Helper;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.utils.Utils;
+
+
+import java.util.Map;
+
+/***
+ * This topo helps measure speed of word count.
+ * Spout loads a file into memory on initialization, then emits the lines in an endless loop.
+ */
+
+public class FileReadWordCountTopo {
+ public static final String SPOUT_ID = "spout";
+ public static final String COUNT_ID = "counter";
+ public static final String SPLIT_ID = "splitter";
+ public static final String TOPOLOGY_NAME = "FileReadWordCountTopo";
+
+ // Config settings
+ public static final String SPOUT_NUM = "spout.count";
+ public static final String SPLIT_NUM = "splitter.count";
+ public static final String COUNT_NUM = "counter.count";
+ public static final String INPUT_FILE = "input.file";
+
+ public static final int DEFAULT_SPOUT_NUM = 1;
+ public static final int DEFAULT_SPLIT_BOLT_NUM = 2;
+ public static final int DEFAULT_COUNT_BOLT_NUM = 2;
+
+
+ public static StormTopology getTopology(Map config) {
+
+ final int spoutNum = Helper.getInt(config, SPOUT_NUM, DEFAULT_SPOUT_NUM);
+ final int spBoltNum = Helper.getInt(config, SPLIT_NUM, DEFAULT_SPLIT_BOLT_NUM);
+ final int cntBoltNum = Helper.getInt(config, COUNT_NUM, DEFAULT_COUNT_BOLT_NUM);
+ final String inputFile = Helper.getStr(config, INPUT_FILE);
+
+ TopologyBuilder builder = new TopologyBuilder();
+ builder.setSpout(SPOUT_ID, new FileReadSpout(inputFile), spoutNum);
+ builder.setBolt(SPLIT_ID, new SplitSentenceBolt(), spBoltNum).localOrShuffleGrouping(SPOUT_ID);
+ builder.setBolt(COUNT_ID, new CountBolt(), cntBoltNum).fieldsGrouping(SPLIT_ID, new Fields(SplitSentenceBolt.FIELDS));
+
+ return builder.createTopology();
+ }
+
+ public static void main(String[] args) throws Exception {
+ if(args.length <= 0) {
+ // For IDE based profiling ... submit topology to local cluster
+ Config conf = new Config();
+ conf.put(INPUT_FILE, "resources/randomwords.txt");
+ LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology(conf));
+
+ Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
+ while (true) {// run indefinitely till Ctrl-C
+ Thread.sleep(20_000_000);
+ }
+ } else {
+ // Submit to Storm cluster
+ if (args.length !=2) {
+ System.err.println("args: runDurationSec confFile");
+ return;
+ }
+ Integer durationSec = Integer.parseInt(args[0]);
+ Map topoConf = Utils.findAndReadConfigFile(args[1]);
+
+ Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
+
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/HdfsSpoutNullBoltTopo.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/HdfsSpoutNullBoltTopo.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/HdfsSpoutNullBoltTopo.java
new file mode 100644
index 0000000..248b523
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/HdfsSpoutNullBoltTopo.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.storm.perf;
+
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.hdfs.spout.HdfsSpout;
+import org.apache.storm.hdfs.spout.TextFileReader;
+import org.apache.storm.perf.bolt.DevNullBolt;
+import org.apache.storm.perf.utils.Helper;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.utils.Utils;
+
+import java.util.Map;
+
+/***
+ * This topo helps measure speed of reading from Hdfs.
+ * Spout Reads from Hdfs.
+ * Bolt acks and discards tuples
+ */
+
+
+public class HdfsSpoutNullBoltTopo {
+ // names
+ static final String TOPOLOGY_NAME = "HdfsSpoutNullBoltTopo";
+ static final String SPOUT_ID = "hdfsSpout";
+ static final String BOLT_ID = "devNullBolt";
+
+ // configs
+ static final String SPOUT_NUM = "spout.count";
+ static final String BOLT_NUM = "bolt.count";
+
+ static final String HDFS_URI = "hdfs.uri";
+ static final String SOURCE_DIR = "hdfs.source.dir";
+ static final String ARCHIVE_DIR = "hdfs.archive.dir";
+ static final String BAD_DIR = "hdfs.bad.dir";
+
+ public static final int DEFAULT_SPOUT_NUM = 1;
+ public static final int DEFAULT_BOLT_NUM = 1;
+
+
+ public static StormTopology getTopology(Map config) {
+
+ final int spoutNum = Helper.getInt(config, SPOUT_NUM, DEFAULT_SPOUT_NUM);
+ final int boltNum = Helper.getInt(config, BOLT_NUM, DEFAULT_BOLT_NUM);
+ final String fileFormat = Helper.getStr(config, "text");
+ final String hdfsUri = Helper.getStr(config, HDFS_URI);
+ final String sourceDir = Helper.getStr(config, SOURCE_DIR);
+ final String archiveDir = Helper.getStr(config, ARCHIVE_DIR);
+ final String badDir = Helper.getStr(config, BAD_DIR);
+
+
+ // 1 - Setup Hdfs Spout --------
+ HdfsSpout spout = new HdfsSpout()
+ .setReaderType(fileFormat)
+ .setHdfsUri(hdfsUri)
+ .setSourceDir(sourceDir)
+ .setArchiveDir(archiveDir)
+ .setBadFilesDir(badDir)
+ .withOutputFields(TextFileReader.defaultFields);
+
+ // 2 - DevNull Bolt --------
+ DevNullBolt bolt = new DevNullBolt();
+
+ // 3 - Setup Topology --------
+ TopologyBuilder builder = new TopologyBuilder();
+ builder.setSpout(SPOUT_ID, spout, spoutNum);
+ builder.setBolt(BOLT_ID, bolt, boltNum)
+ .localOrShuffleGrouping(SPOUT_ID);
+
+ return builder.createTopology();
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (args.length != 2) {
+ System.err.println("args: runDurationSec topConfFile");
+ return;
+ }
+
+ Integer durationSec = Integer.parseInt(args[0]);
+ Map topoConf = Utils.findAndReadConfigFile(args[1]);
+
+ // Submit to Storm cluster
+ Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/KafkaHdfsTopo.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/KafkaHdfsTopo.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/KafkaHdfsTopo.java
new file mode 100755
index 0000000..4293aac
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/KafkaHdfsTopo.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf;
+
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.hdfs.bolt.HdfsBolt;
+import org.apache.storm.hdfs.bolt.format.DefaultFileNameFormat;
+import org.apache.storm.hdfs.bolt.format.FileNameFormat;
+import org.apache.storm.hdfs.bolt.format.RecordFormat;
+import org.apache.storm.hdfs.bolt.rotation.FileRotationPolicy;
+import org.apache.storm.hdfs.bolt.rotation.FileSizeRotationPolicy;
+import org.apache.storm.hdfs.bolt.sync.CountSyncPolicy;
+import org.apache.storm.hdfs.bolt.sync.SyncPolicy;
+import org.apache.storm.kafka.BrokerHosts;
+import org.apache.storm.kafka.KafkaSpout;
+import org.apache.storm.kafka.SpoutConfig;
+import org.apache.storm.kafka.StringMultiSchemeWithTopic;
+import org.apache.storm.kafka.ZkHosts;
+import org.apache.storm.perf.utils.Helper;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.utils.Utils;
+
+import java.util.Map;
+import java.util.UUID;
+
+/***
+ * This topo helps measure speed of reading from Kafka and writing to Hdfs.
+ * Spout Reads from Kafka.
+ * Bolt writes to Hdfs
+ */
+
+public class KafkaHdfsTopo {
+
+ // configs - topo parallelism
+ public static final String SPOUT_NUM = "spout.count";
+ public static final String BOLT_NUM = "bolt.count";
+ // configs - kafka spout
+ public static final String KAFKA_TOPIC = "kafka.topic";
+ public static final String ZOOKEEPER_URI = "zk.uri";
+ // configs - hdfs bolt
+ public static final String HDFS_URI = "hdfs.uri";
+ public static final String HDFS_PATH = "hdfs.dir";
+ public static final String HDFS_BATCH = "hdfs.batch";
+
+
+ public static final int DEFAULT_SPOUT_NUM = 1;
+ public static final int DEFAULT_BOLT_NUM = 1;
+ public static final int DEFAULT_HDFS_BATCH = 1000;
+
+ // names
+ public static final String TOPOLOGY_NAME = "KafkaHdfsTopo";
+ public static final String SPOUT_ID = "kafkaSpout";
+ public static final String BOLT_ID = "hdfsBolt";
+
+
+
+ public static StormTopology getTopology(Map config) {
+
+ final int spoutNum = getInt(config, SPOUT_NUM, DEFAULT_SPOUT_NUM);
+ final int boltNum = getInt(config, BOLT_NUM, DEFAULT_BOLT_NUM);
+
+ final int hdfsBatch = getInt(config, HDFS_BATCH, DEFAULT_HDFS_BATCH);
+
+ // 1 - Setup Kafka Spout --------
+ String zkConnString = getStr(config, ZOOKEEPER_URI);
+ String topicName = getStr(config, KAFKA_TOPIC);
+
+ BrokerHosts brokerHosts = new ZkHosts(zkConnString);
+ SpoutConfig spoutConfig = new SpoutConfig(brokerHosts, topicName, "/" + topicName, UUID.randomUUID().toString());
+ spoutConfig.scheme = new StringMultiSchemeWithTopic();
+ spoutConfig.ignoreZkOffsets = true;
+
+ KafkaSpout spout = new KafkaSpout(spoutConfig);
+
+ // 2 - Setup HFS Bolt --------
+ String Hdfs_url = getStr(config, HDFS_URI);
+ RecordFormat format = new LineWriter("str");
+ SyncPolicy syncPolicy = new CountSyncPolicy(hdfsBatch);
+ FileRotationPolicy rotationPolicy = new FileSizeRotationPolicy(1.0f, FileSizeRotationPolicy.Units.GB);
+
+ FileNameFormat fileNameFormat = new DefaultFileNameFormat().withPath(getStr(config,HDFS_PATH) );
+
+ // Instantiate the HdfsBolt
+ HdfsBolt bolt = new HdfsBolt()
+ .withFsUrl(Hdfs_url)
+ .withFileNameFormat(fileNameFormat)
+ .withRecordFormat(format)
+ .withRotationPolicy(rotationPolicy)
+ .withSyncPolicy(syncPolicy);
+
+
+ // 3 - Setup Topology --------
+ TopologyBuilder builder = new TopologyBuilder();
+ builder.setSpout(SPOUT_ID, spout, spoutNum);
+ builder.setBolt(BOLT_ID, bolt, boltNum)
+ .localOrShuffleGrouping(SPOUT_ID);
+
+ return builder.createTopology();
+ }
+
+
+ public static int getInt(Map map, Object key, int def) {
+ return Utils.getInt(Utils.get(map, key, def));
+ }
+
+ public static String getStr(Map map, Object key) {
+ return (String) map.get(key);
+ }
+
+
+ /** Copies text file content from sourceDir to destinationDir. Moves source files into sourceDir after its done consuming */
+ public static void main(String[] args) throws Exception {
+
+ if (args.length != 2) {
+ System.err.println("args: runDurationSec topConfFile");
+ return;
+ }
+
+ Integer durationSec = Integer.parseInt(args[0]);
+ String confFile = args[1];
+ Map topoConf = Utils.findAndReadConfigFile(confFile);
+
+ // Submit topology to Storm cluster
+ Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
+ }
+
+ public static class LineWriter implements RecordFormat {
+ private String lineDelimiter = System.lineSeparator();
+ private String fieldName;
+
+ public LineWriter(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ /**
+ * Overrides the default record delimiter.
+ *
+ * @param delimiter
+ * @return
+ */
+ public LineWriter withLineDelimiter(String delimiter){
+ this.lineDelimiter = delimiter;
+ return this;
+ }
+
+ @Override
+ public byte[] format(Tuple tuple) {
+ return (tuple.getValueByField(fieldName).toString() + this.lineDelimiter).getBytes();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/KafkaSpoutNullBoltTopo.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/KafkaSpoutNullBoltTopo.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/KafkaSpoutNullBoltTopo.java
new file mode 100755
index 0000000..3512c65
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/KafkaSpoutNullBoltTopo.java
@@ -0,0 +1,114 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License
+*/
+
+package org.apache.storm.perf;
+
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.kafka.BrokerHosts;
+import org.apache.storm.kafka.KafkaSpout;
+import org.apache.storm.kafka.SpoutConfig;
+import org.apache.storm.kafka.StringMultiSchemeWithTopic;
+import org.apache.storm.kafka.ZkHosts;
+import org.apache.storm.perf.bolt.DevNullBolt;
+import org.apache.storm.perf.utils.Helper;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.utils.Utils;
+
+import java.util.Map;
+import java.util.UUID;
+
+
+/***
+ * This topo helps measure speed of reading from Kafka
+ * Spout Reads from Kafka.
+ * Bolt acks and discards tuples
+ */
+
+public class KafkaSpoutNullBoltTopo {
+
+ // configs - topo parallelism
+ public static final String SPOUT_NUM = "spout.count";
+ public static final String BOLT_NUM = "bolt.count";
+
+ // configs - kafka spout
+ public static final String KAFKA_TOPIC = "kafka.topic";
+ public static final String ZOOKEEPER_URI = "zk.uri";
+
+
+ public static final int DEFAULT_SPOUT_NUM = 1;
+ public static final int DEFAULT_BOLT_NUM = 1;
+
+ // names
+ public static final String TOPOLOGY_NAME = "KafkaSpoutNullBoltTopo";
+ public static final String SPOUT_ID = "kafkaSpout";
+ public static final String BOLT_ID = "devNullBolt";
+
+
+ public static StormTopology getTopology(Map config) {
+
+ final int spoutNum = getInt(config, SPOUT_NUM, DEFAULT_SPOUT_NUM);
+ final int boltNum = getInt(config, BOLT_NUM, DEFAULT_BOLT_NUM);
+ // 1 - Setup Kafka Spout --------
+
+ String zkConnString = getStr(config, ZOOKEEPER_URI);
+ String topicName = getStr(config, KAFKA_TOPIC);
+
+ BrokerHosts brokerHosts = new ZkHosts(zkConnString);
+ SpoutConfig spoutConfig = new SpoutConfig(brokerHosts, topicName, "/" + topicName, UUID.randomUUID().toString());
+ spoutConfig.scheme = new StringMultiSchemeWithTopic();
+ spoutConfig.ignoreZkOffsets = true;
+
+ KafkaSpout spout = new KafkaSpout(spoutConfig);
+
+ // 2 - DevNull Bolt --------
+ DevNullBolt bolt = new DevNullBolt();
+
+ // 3 - Setup Topology --------
+ TopologyBuilder builder = new TopologyBuilder();
+ builder.setSpout(SPOUT_ID, spout, spoutNum);
+ builder.setBolt(BOLT_ID, bolt, boltNum)
+ .localOrShuffleGrouping(SPOUT_ID);
+
+ return builder.createTopology();
+ }
+
+
+ public static int getInt(Map map, Object key, int def) {
+ return Utils.getInt(Utils.get(map, key, def));
+ }
+
+ public static String getStr(Map map, Object key) {
+ return (String) map.get(key);
+ }
+
+
+ /**
+ * Copies text file content from sourceDir to destinationDir. Moves source files into sourceDir after its done consuming
+ */
+ public static void main(String[] args) throws Exception {
+ if (args.length !=2) {
+ System.err.println("args: runDurationSec confFile");
+ return;
+ }
+ Integer durationSec = Integer.parseInt(args[0]);
+ Map topoConf = Utils.findAndReadConfigFile(args[1]);
+
+ // Submit to Storm cluster
+ Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/StrGenSpoutHdfsBoltTopo.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/StrGenSpoutHdfsBoltTopo.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/StrGenSpoutHdfsBoltTopo.java
new file mode 100755
index 0000000..5b97540
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/StrGenSpoutHdfsBoltTopo.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+
+package org.apache.storm.perf;
+
+import org.apache.storm.LocalCluster;
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.hdfs.bolt.HdfsBolt;
+import org.apache.storm.hdfs.bolt.format.DefaultFileNameFormat;
+import org.apache.storm.hdfs.bolt.format.FileNameFormat;
+import org.apache.storm.hdfs.bolt.format.RecordFormat;
+import org.apache.storm.hdfs.bolt.rotation.FileRotationPolicy;
+import org.apache.storm.hdfs.bolt.rotation.FileSizeRotationPolicy;
+import org.apache.storm.hdfs.bolt.sync.CountSyncPolicy;
+import org.apache.storm.hdfs.bolt.sync.SyncPolicy;
+import org.apache.storm.perf.spout.StringGenSpout;
+import org.apache.storm.perf.utils.Helper;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.utils.Utils;
+
+import java.util.Map;
+
+/***
+ * This topo helps measure speed of writing to Hdfs
+ * Spout generates fixed length random strings.
+ * Bolt writes to Hdfs
+ */
+
+public class StrGenSpoutHdfsBoltTopo {
+
+ // configs - topo parallelism
+ public static final String SPOUT_NUM = "spout.count";
+ public static final String BOLT_NUM = "bolt.count";
+
+ // configs - hdfs bolt
+ public static final String HDFS_URI = "hdfs.uri";
+ public static final String HDFS_PATH = "hdfs.dir";
+ public static final String HDFS_BATCH = "hdfs.batch";
+
+ public static final int DEFAULT_SPOUT_NUM = 1;
+ public static final int DEFAULT_BOLT_NUM = 1;
+ public static final int DEFAULT_HDFS_BATCH = 1000;
+
+ // names
+ public static final String TOPOLOGY_NAME = "StrGenSpoutHdfsBoltTopo";
+ public static final String SPOUT_ID = "GenSpout";
+ public static final String BOLT_ID = "hdfsBolt";
+
+
+ public static StormTopology getTopology(Map topoConf) {
+ final int hdfsBatch = Helper.getInt(topoConf, HDFS_BATCH, DEFAULT_HDFS_BATCH);
+
+ // 1 - Setup StringGen Spout --------
+ StringGenSpout spout = new StringGenSpout(100).withFieldName("str");
+
+
+ // 2 - Setup HFS Bolt --------
+ String Hdfs_url = Helper.getStr(topoConf, HDFS_URI);
+ RecordFormat format = new LineWriter("str");
+ SyncPolicy syncPolicy = new CountSyncPolicy(hdfsBatch);
+ FileRotationPolicy rotationPolicy = new FileSizeRotationPolicy(1.0f, FileSizeRotationPolicy.Units.GB);
+ final int spoutNum = Helper.getInt(topoConf, SPOUT_NUM, DEFAULT_SPOUT_NUM);
+ final int boltNum = Helper.getInt(topoConf, BOLT_NUM, DEFAULT_BOLT_NUM);
+
+ // Use default, Storm-generated file names
+ FileNameFormat fileNameFormat = new DefaultFileNameFormat().withPath(Helper.getStr(topoConf, HDFS_PATH) );
+
+ // Instantiate the HdfsBolt
+ HdfsBolt bolt = new HdfsBolt()
+ .withFsUrl(Hdfs_url)
+ .withFileNameFormat(fileNameFormat)
+ .withRecordFormat(format)
+ .withRotationPolicy(rotationPolicy)
+ .withSyncPolicy(syncPolicy);
+
+
+ // 3 - Setup Topology --------
+
+ TopologyBuilder builder = new TopologyBuilder();
+ builder.setSpout(SPOUT_ID, spout, spoutNum);
+ builder.setBolt(BOLT_ID, bolt, boltNum)
+ .localOrShuffleGrouping(SPOUT_ID);
+
+ return builder.createTopology();
+ }
+
+
+ /** Spout generates random strings and HDFS bolt writes them to a text file */
+ public static void main(String[] args) throws Exception {
+ if(args.length <= 0) {
+ // submit to local cluster
+ Map topoConf = Utils.findAndReadConfigFile("conf/HdfsSpoutTopo.yaml");
+ LocalCluster cluster = Helper.runOnLocalCluster(TOPOLOGY_NAME, getTopology(topoConf));
+
+ Helper.setupShutdownHook(cluster, TOPOLOGY_NAME);
+ while (true) {// run indefinitely till Ctrl-C
+ Thread.sleep(20_000_000);
+ }
+ } else {
+ // Submit to Storm cluster
+ if (args.length !=2) {
+ System.err.println("args: runDurationSec confFile");
+ return;
+ }
+ Integer durationSec = Integer.parseInt(args[0]);
+ Map topoConf = Utils.findAndReadConfigFile(args[1]);
+
+ Helper.runOnClusterAndPrintMetrics(durationSec, TOPOLOGY_NAME, topoConf, getTopology(topoConf));
+ }
+ }
+
+
+ public static class LineWriter implements RecordFormat {
+ private String lineDelimiter = System.lineSeparator();
+ private String fieldName;
+
+ public LineWriter(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ /**
+ * Overrides the default record delimiter.
+ *
+ * @param delimiter
+ * @return
+ */
+ public LineWriter withLineDelimiter(String delimiter){
+ this.lineDelimiter = delimiter;
+ return this;
+ }
+
+ public byte[] format(Tuple tuple) {
+ return (tuple.getValueByField(fieldName).toString() + this.lineDelimiter).getBytes();
+ }
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/CountBolt.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/CountBolt.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/CountBolt.java
new file mode 100644
index 0000000..b79a0ee
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/CountBolt.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.bolt;
+
+
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseBasicBolt;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.tuple.Values;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CountBolt extends BaseBasicBolt {
+ public static final String FIELDS_WORD = "word";
+ public static final String FIELDS_COUNT = "count";
+
+ Map<String, Integer> counts = new HashMap<>();
+
+ @Override
+ public void prepare(Map stormConf, TopologyContext context) {
+ }
+
+ @Override
+ public void execute(Tuple tuple, BasicOutputCollector collector) {
+ String word = tuple.getString(0);
+ Integer count = counts.get(word);
+ if (count == null)
+ count = 0;
+ count++;
+ counts.put(word, count);
+ collector.emit(new Values(word, count));
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields(FIELDS_WORD, FIELDS_COUNT));
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/DevNullBolt.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/DevNullBolt.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/DevNullBolt.java
new file mode 100755
index 0000000..b85ce15
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/DevNullBolt.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.bolt;
+
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichBolt;
+import org.apache.storm.tuple.Tuple;
+
+import java.util.Map;
+
+
+public class DevNullBolt extends BaseRichBolt {
+ private OutputCollector collector;
+
+ @Override
+ public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
+ this.collector = collector;
+ }
+
+ @Override
+ public void execute(Tuple tuple) {
+ collector.ack(tuple);
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/IdBolt.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/IdBolt.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/IdBolt.java
new file mode 100644
index 0000000..116265e
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/IdBolt.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.bolt;
+
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichBolt;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.tuple.Values;
+
+import java.util.Map;
+
+public class IdBolt extends BaseRichBolt {
+ private OutputCollector collector;
+
+ @Override
+ public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
+ this.collector = collector;
+ }
+
+ @Override
+ public void execute(Tuple tuple) {
+ collector.emit(tuple, new Values( tuple.getValues() ) );
+ collector.ack(tuple);
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields("field1"));
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/SplitSentenceBolt.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/SplitSentenceBolt.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/SplitSentenceBolt.java
new file mode 100644
index 0000000..96f9f73
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/bolt/SplitSentenceBolt.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.bolt;
+
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseBasicBolt;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.tuple.Values;
+
+import java.util.Map;
+
+
+public class SplitSentenceBolt extends BaseBasicBolt {
+ public static final String FIELDS = "word";
+
+ @Override
+ public void prepare(Map stormConf, TopologyContext context) {
+ }
+
+ @Override
+ public void execute(Tuple input, BasicOutputCollector collector) {
+ for (String word : splitSentence(input.getString(0))) {
+ collector.emit(new Values(word));
+ }
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields(FIELDS));
+ }
+
+
+ public static String[] splitSentence(String sentence) {
+ if (sentence != null) {
+ return sentence.split("\\s+");
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/ConstSpout.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/ConstSpout.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/ConstSpout.java
new file mode 100755
index 0000000..b66e4f3
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/ConstSpout.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.spout;
+
+
+import org.apache.storm.spout.SpoutOutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichSpout;
+import org.apache.storm.tuple.Fields;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class ConstSpout extends BaseRichSpout {
+
+ private static final String DEFAUT_FIELD_NAME = "str";
+ private String value;
+ private String fieldName = DEFAUT_FIELD_NAME;
+ private SpoutOutputCollector collector = null;
+ private int count=0;
+
+ public ConstSpout(String value) {
+ this.value = value;
+ }
+
+ public ConstSpout withOutputFields(String fieldName) {
+ this.fieldName = fieldName;
+ return this;
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields(fieldName));
+ }
+
+ @Override
+ public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
+ this.collector = collector;
+ }
+
+ @Override
+ public void nextTuple() {
+ List<Object> tuple = Collections.singletonList((Object) value);
+ collector.emit(tuple, count++);
+ }
+
+ @Override
+ public void ack(Object msgId) {
+ super.ack(msgId);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/FileReadSpout.java
----------------------------------------------------------------------
diff --git a/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/FileReadSpout.java b/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/FileReadSpout.java
new file mode 100644
index 0000000..959e7c6
--- /dev/null
+++ b/examples/storm-perf/src/main/java/org/apache/storm/perf/spout/FileReadSpout.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.storm.perf.spout;
+
+import org.apache.storm.spout.SpoutOutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichSpout;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class FileReadSpout extends BaseRichSpout {
+ public static final String FIELDS = "sentence";
+ private static final long serialVersionUID = -2582705611472467172L;
+ private transient FileReader reader;
+ private String file;
+ private boolean ackEnabled = true;
+ private SpoutOutputCollector collector;
+
+ private long count = 0;
+
+
+ public FileReadSpout(String file) {
+ this.file = file;
+ }
+
+ // For testing
+ FileReadSpout(FileReader reader) {
+ this.reader = reader;
+ }
+
+ @Override
+ public void open(Map conf, TopologyContext context,
+ SpoutOutputCollector collector) {
+ this.collector = collector;
+ Object ackObj = conf.get("topology.acker.executors");
+ if (ackObj != null && ackObj.equals(0)) {
+ this.ackEnabled = false;
+ }
+ // for tests, reader will not be null
+ if (this.reader == null) {
+ this.reader = new FileReader(this.file);
+ }
+ }
+
+ @Override
+ public void nextTuple() {
+ if (ackEnabled) {
+ collector.emit(new Values(reader.nextLine()), count);
+ count++;
+ } else {
+ collector.emit(new Values(reader.nextLine()));
+ }
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(new Fields(FIELDS));
+ }
+
+ public static List<String> readLines(InputStream input) {
+ List<String> lines = new ArrayList<>();
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(input));
+ try {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ lines.add(line);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Reading file failed", e);
+ } finally {
+ reader.close();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Error closing reader", e);
+ }
+ return lines;
+ }
+
+ public static class FileReader implements Serializable {
+
+ private static final long serialVersionUID = -7012334600647556267L;
+
+ public final String file;
+ private List<String> contents = null;
+ private int index = 0;
+ private int limit = 0;
+
+ public FileReader(String file) {
+ this.file = file;
+ if (this.file != null) {
+ try {
+ this.contents = readLines(new FileInputStream(this.file));
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new IllegalArgumentException("Cannot open file " + file, e);
+ }
+ this.limit = contents.size();
+ } else {
+ throw new IllegalArgumentException("file name cannot be null");
+ }
+ }
+
+ public String nextLine() {
+ if (index >= limit) {
+ index = 0;
+ }
+ String line = contents.get(index);
+ index++;
+ return line;
+ }
+
+ }
+}
[04/14] storm git commit: STORM-2416 Release Packaging Improvements
Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttOptions.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttOptions.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttOptions.java
new file mode 100644
index 0000000..2b09d6e
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttOptions.java
@@ -0,0 +1,334 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.common;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * MQTT Configuration Options
+ */
+public class MqttOptions implements Serializable {
+ private String url = "tcp://localhost:1883";
+ private List<String> topics = null;
+ private boolean cleanConnection = false;
+
+ private String willTopic;
+ private String willPayload;
+ private int willQos = 1;
+ private boolean willRetain = false;
+
+ private long reconnectDelay = 10;
+ private long reconnectDelayMax = 30*1000;
+ private double reconnectBackOffMultiplier = 2.0f;
+ private long reconnectAttemptsMax = -1;
+ private long connectAttemptsMax = -1;
+
+ private String userName = "";
+ private String password = "";
+
+ private int qos = 1;
+
+ public String getUrl() {
+ return url;
+ }
+
+ /**
+ * Sets the url for connecting to the MQTT broker.
+ *
+ * Default: `tcp://localhost:1883'
+ * @param url
+ */
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public List<String> getTopics() {
+ return topics;
+ }
+
+ /**
+ * A list of MQTT topics to subscribe to.
+ *
+ * @param topics
+ */
+ public void setTopics(List<String> topics) {
+ this.topics = topics;
+ }
+
+ public boolean isCleanConnection() {
+ return cleanConnection;
+ }
+
+ /**
+ * Set to false if you want the MQTT server to persist topic subscriptions and ack positions across client sessions.
+ * Defaults to false.
+ *
+ * @param cleanConnection
+ */
+ public void setCleanConnection(boolean cleanConnection) {
+ this.cleanConnection = cleanConnection;
+ }
+
+ public String getWillTopic() {
+ return willTopic;
+ }
+
+ /**
+ * If set the server will publish the client's Will message to the specified topics if the client has an unexpected
+ * disconnection.
+ *
+ * @param willTopic
+ */
+ public void setWillTopic(String willTopic) {
+ this.willTopic = willTopic;
+ }
+
+ public String getWillPayload() {
+ return willPayload;
+ }
+
+ /**
+ * The Will message to send. Defaults to a zero length message.
+ *
+ * @param willPayload
+ */
+ public void setWillPayload(String willPayload) {
+ this.willPayload = willPayload;
+ }
+
+ public long getReconnectDelay() {
+ return reconnectDelay;
+ }
+
+ /**
+ * How long to wait in ms before the first reconnect attempt. Defaults to 10.
+ *
+ * @param reconnectDelay
+ */
+ public void setReconnectDelay(long reconnectDelay) {
+ this.reconnectDelay = reconnectDelay;
+ }
+
+ public long getReconnectDelayMax() {
+ return reconnectDelayMax;
+ }
+
+ /**
+ * The maximum amount of time in ms to wait between reconnect attempts. Defaults to 30,000.
+ *
+ * @param reconnectDelayMax
+ */
+ public void setReconnectDelayMax(long reconnectDelayMax) {
+ this.reconnectDelayMax = reconnectDelayMax;
+ }
+
+ public double getReconnectBackOffMultiplier() {
+ return reconnectBackOffMultiplier;
+ }
+
+ /**
+ * The Exponential backoff be used between reconnect attempts. Set to 1 to disable exponential backoff. Defaults to
+ * 2.
+ *
+ * @param reconnectBackOffMultiplier
+ */
+ public void setReconnectBackOffMultiplier(double reconnectBackOffMultiplier) {
+ this.reconnectBackOffMultiplier = reconnectBackOffMultiplier;
+ }
+
+ public long getReconnectAttemptsMax() {
+ return reconnectAttemptsMax;
+ }
+
+ /**
+ * The maximum number of reconnect attempts before an error is reported back to the client after a server
+ * connection had previously been established. Set to -1 to use unlimited attempts. Defaults to -1.
+ *
+ * @param reconnectAttemptsMax
+ */
+ public void setReconnectAttemptsMax(long reconnectAttemptsMax) {
+ this.reconnectAttemptsMax = reconnectAttemptsMax;
+ }
+
+ public long getConnectAttemptsMax() {
+ return connectAttemptsMax;
+ }
+
+ /**
+ * The maximum number of reconnect attempts before an error is reported back to the client on the first attempt by
+ * the client to connect to a server. Set to -1 to use unlimited attempts. Defaults to -1.
+ *
+ * @param connectAttemptsMax
+ */
+ public void setConnectAttemptsMax(long connectAttemptsMax) {
+ this.connectAttemptsMax = connectAttemptsMax;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ /**
+ * The username for authenticated sessions.
+ *
+ * @param userName
+ */
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * The password for authenticated sessions.
+ * @param password
+ */
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public int getQos(){
+ return this.qos;
+ }
+
+ /**
+ * Sets the quality of service to use for MQTT messages. Defaults to 1 (at least once).
+ * @param qos
+ */
+ public void setQos(int qos){
+ if(qos < 0 || qos > 2){
+ throw new IllegalArgumentException("MQTT QoS must be >= 0 and <= 2");
+ }
+ this.qos = qos;
+ }
+
+ public int getWillQos(){
+ return this.willQos;
+ }
+
+ /**
+ * Sets the quality of service to use for the MQTT Will message. Defaults to 1 (at least once).
+ *
+ * @param qos
+ */
+ public void setWillQos(int qos){
+ if(qos < 0 || qos > 2){
+ throw new IllegalArgumentException("MQTT Will QoS must be >= 0 and <= 2");
+ }
+ this.willQos = qos;
+ }
+
+ public boolean getWillRetain(){
+ return this.willRetain;
+ }
+
+ /**
+ * Set to true if you want the Will message to be published with the retain option.
+ * @param retain
+ */
+ public void setWillRetain(boolean retain){
+ this.willRetain = retain;
+ }
+
+ public static class Builder {
+ private MqttOptions options = new MqttOptions();
+
+ public Builder url(String url) {
+ this.options.url = url;
+ return this;
+ }
+
+
+ public Builder topics(List<String> topics) {
+ this.options.topics = topics;
+ return this;
+ }
+
+ public Builder cleanConnection(boolean cleanConnection) {
+ this.options.cleanConnection = cleanConnection;
+ return this;
+ }
+
+ public Builder willTopic(String willTopic) {
+ this.options.willTopic = willTopic;
+ return this;
+ }
+
+ public Builder willPayload(String willPayload) {
+ this.options.willPayload = willPayload;
+ return this;
+ }
+
+ public Builder willRetain(boolean retain){
+ this.options.willRetain = retain;
+ return this;
+ }
+
+ public Builder willQos(int qos){
+ this.options.setWillQos(qos);
+ return this;
+ }
+
+ public Builder reconnectDelay(long reconnectDelay) {
+ this.options.reconnectDelay = reconnectDelay;
+ return this;
+ }
+
+ public Builder reconnectDelayMax(long reconnectDelayMax) {
+ this.options.reconnectDelayMax = reconnectDelayMax;
+ return this;
+ }
+
+ public Builder reconnectBackOffMultiplier(double reconnectBackOffMultiplier) {
+ this.options.reconnectBackOffMultiplier = reconnectBackOffMultiplier;
+ return this;
+ }
+
+ public Builder reconnectAttemptsMax(long reconnectAttemptsMax) {
+ this.options.reconnectAttemptsMax = reconnectAttemptsMax;
+ return this;
+ }
+
+ public Builder connectAttemptsMax(long connectAttemptsMax) {
+ this.options.connectAttemptsMax = connectAttemptsMax;
+ return this;
+ }
+
+ public Builder userName(String userName) {
+ this.options.userName = userName;
+ return this;
+ }
+
+ public Builder password(String password) {
+ this.options.password = password;
+ return this;
+ }
+
+ public Builder qos(int qos){
+ this.options.setQos(qos);
+ return this;
+ }
+
+ public MqttOptions build() {
+ return this.options;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttPublisher.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttPublisher.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttPublisher.java
new file mode 100644
index 0000000..9b36b78
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttPublisher.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.common;
+
+
+import org.apache.storm.mqtt.MqttLogger;
+import org.apache.storm.mqtt.MqttMessage;
+import org.apache.storm.mqtt.ssl.KeyStoreLoader;
+import org.fusesource.mqtt.client.BlockingConnection;
+import org.fusesource.mqtt.client.MQTT;
+import org.fusesource.mqtt.client.QoS;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.URI;
+
+public class MqttPublisher {
+ private static final Logger LOG = LoggerFactory.getLogger(MqttPublisher.class);
+
+ private MqttOptions options;
+ private transient BlockingConnection connection;
+ private KeyStoreLoader keyStoreLoader;
+ private QoS qos;
+ private boolean retain = false;
+
+
+ public MqttPublisher(MqttOptions options){
+ this(options, null, false);
+ }
+
+ public MqttPublisher(MqttOptions options, boolean retain){
+ this(options, null, retain);
+ }
+
+ public MqttPublisher(MqttOptions options, KeyStoreLoader keyStoreLoader, boolean retain){
+ this.retain = retain;
+ this.options = options;
+ this.keyStoreLoader = keyStoreLoader;
+ SslUtils.checkSslConfig(this.options.getUrl(), keyStoreLoader);
+ this.qos = MqttUtils.qosFromInt(this.options.getQos());
+ }
+
+ public void publish(MqttMessage message) throws Exception {
+ this.connection.publish(message.getTopic(), message.getMessage(), this.qos, this.retain);
+ }
+
+ public void connectMqtt(String clientId) throws Exception {
+ MQTT client = MqttUtils.configureClient(this.options, clientId, this.keyStoreLoader);
+ this.connection = client.blockingConnection();
+ this.connection.connect();
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttUtils.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttUtils.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttUtils.java
new file mode 100644
index 0000000..4ca0145
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/MqttUtils.java
@@ -0,0 +1,88 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.common;
+
+
+import org.apache.storm.mqtt.MqttLogger;
+import org.apache.storm.mqtt.ssl.KeyStoreLoader;
+import org.fusesource.mqtt.client.MQTT;
+import org.fusesource.mqtt.client.QoS;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.URI;
+
+public class MqttUtils {
+ private static final Logger LOG = LoggerFactory.getLogger(MqttUtils.class);
+
+ private MqttUtils(){}
+
+ public static QoS qosFromInt(int i){
+ QoS qos = null;
+ switch(i) {
+ case 0:
+ qos = QoS.AT_MOST_ONCE;
+ break;
+ case 1:
+ qos = QoS.AT_LEAST_ONCE;
+ break;
+ case 2:
+ qos = QoS.EXACTLY_ONCE;
+ break;
+ default:
+ throw new IllegalArgumentException(i + "is not a valid MQTT QoS.");
+ }
+ return qos;
+ }
+
+
+ public static MQTT configureClient(MqttOptions options, String clientId, KeyStoreLoader keyStoreLoader)
+ throws Exception{
+
+ MQTT client = new MQTT();
+ URI uri = URI.create(options.getUrl());
+
+ client.setHost(uri);
+ if(!uri.getScheme().toLowerCase().equals("tcp")){
+ client.setSslContext(SslUtils.sslContext(uri.getScheme(), keyStoreLoader));
+ }
+ client.setClientId(clientId);
+ LOG.info("MQTT ClientID: {}", client.getClientId().toString());
+ client.setCleanSession(options.isCleanConnection());
+
+ client.setReconnectDelay(options.getReconnectDelay());
+ client.setReconnectDelayMax(options.getReconnectDelayMax());
+ client.setReconnectBackOffMultiplier(options.getReconnectBackOffMultiplier());
+ client.setConnectAttemptsMax(options.getConnectAttemptsMax());
+ client.setReconnectAttemptsMax(options.getReconnectAttemptsMax());
+
+
+ client.setUserName(options.getUserName());
+ client.setPassword(options.getPassword());
+ client.setTracer(new MqttLogger());
+
+ if(options.getWillTopic() != null && options.getWillPayload() != null){
+ QoS qos = MqttUtils.qosFromInt(options.getWillQos());
+ client.setWillQos(qos);
+ client.setWillTopic(options.getWillTopic());
+ client.setWillMessage(options.getWillPayload());
+ client.setWillRetain(options.getWillRetain());
+ }
+ return client;
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/SslUtils.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/SslUtils.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/SslUtils.java
new file mode 100644
index 0000000..681fc1d
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/common/SslUtils.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.common;
+
+
+import org.apache.storm.mqtt.ssl.KeyStoreLoader;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import java.net.URI;
+import java.security.KeyStore;
+
+public class SslUtils {
+ private SslUtils(){}
+
+ public static void checkSslConfig(String url, KeyStoreLoader loader){
+ URI uri = URI.create(url);
+ String scheme = uri.getScheme().toLowerCase();
+ if(!(scheme.equals("tcp") || scheme.startsWith("tls") || scheme.startsWith("ssl"))){
+ throw new IllegalArgumentException("Unrecognized URI scheme: " + scheme);
+ }
+ if(!scheme.equalsIgnoreCase("tcp") && loader == null){
+ throw new IllegalStateException("A TLS/SSL MQTT URL was specified, but no KeyStoreLoader configured. " +
+ "A KeyStoreLoader implementation is required when using TLS/SSL.");
+ }
+ }
+
+ public static SSLContext sslContext(String scheme, KeyStoreLoader keyStoreLoader) throws Exception {
+ KeyStore ks = KeyStore.getInstance("JKS");
+ ks.load(keyStoreLoader.keyStoreInputStream(), keyStoreLoader.keyStorePassword().toCharArray());
+
+ KeyStore ts = KeyStore.getInstance("JKS");
+ ts.load(keyStoreLoader.trustStoreInputStream(), keyStoreLoader.trustStorePassword().toCharArray());
+
+ KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+ kmf.init(ks, keyStoreLoader.keyPassword().toCharArray());
+
+ TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+ tmf.init(ts);
+
+ SSLContext sc = SSLContext.getInstance(scheme.toUpperCase());
+ TrustManager[] trustManagers = tmf.getTrustManagers();
+ sc.init(kmf.getKeyManagers(), trustManagers, null);
+
+ return sc;
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/mappers/ByteArrayMessageMapper.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/mappers/ByteArrayMessageMapper.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/mappers/ByteArrayMessageMapper.java
new file mode 100644
index 0000000..a19fce4
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/mappers/ByteArrayMessageMapper.java
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.mappers;
+
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+import org.apache.storm.mqtt.MqttMessage;
+import org.apache.storm.mqtt.MqttMessageMapper;
+
+
+public class ByteArrayMessageMapper implements MqttMessageMapper {
+ public Values toValues(MqttMessage message) {
+ return new Values(message.getTopic(), message.getMessage());
+ }
+
+ public Fields outputFields() {
+ return new Fields("topic", "message");
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/mappers/StringMessageMapper.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/mappers/StringMessageMapper.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/mappers/StringMessageMapper.java
new file mode 100644
index 0000000..e5f309b
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/mappers/StringMessageMapper.java
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.mappers;
+
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+import org.apache.storm.mqtt.MqttMessage;
+import org.apache.storm.mqtt.MqttMessageMapper;
+
+/**
+ * Given a String topic and byte[] message, emits a tuple with fields
+ * "topic" and "message", both of which are Strings.
+ */
+public class StringMessageMapper implements MqttMessageMapper {
+ public Values toValues(MqttMessage message) {
+ return new Values(message.getTopic(), new String(message.getMessage()));
+ }
+
+ public Fields outputFields() {
+ return new Fields("topic", "message");
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/spout/AckableMessage.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/spout/AckableMessage.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/spout/AckableMessage.java
new file mode 100644
index 0000000..08348c9
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/spout/AckableMessage.java
@@ -0,0 +1,71 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.spout;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.storm.mqtt.MqttMessage;
+
+/**
+ * Represents an MQTT Message consisting of a topic string (e.g. "/users/ptgoetz/office/thermostat")
+ * and a byte array message/payload.
+ *
+ */
+class AckableMessage {
+ private String topic;
+ private byte[] message;
+ private Runnable ack;
+
+ AckableMessage(String topic, byte[] message, Runnable ack){
+ this.topic = topic;
+ this.message = message;
+ this.ack = ack;
+ }
+
+ public MqttMessage getMessage(){
+ return new MqttMessage(this.topic, this.message);
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(71, 123)
+ .append(this.topic)
+ .append(this.message)
+ .toHashCode();
+ }
+
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) { return false; }
+ if (obj == this) { return true; }
+ if (obj.getClass() != getClass()) {
+ return false;
+ }
+ AckableMessage tm = (AckableMessage)obj;
+ return new EqualsBuilder()
+ .appendSuper(super.equals(obj))
+ .append(this.topic, tm.topic)
+ .append(this.message, tm.message)
+ .isEquals();
+ }
+
+ Runnable ack(){
+ return this.ack;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/spout/MqttSpout.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/spout/MqttSpout.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/spout/MqttSpout.java
new file mode 100644
index 0000000..7f10cc5
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/spout/MqttSpout.java
@@ -0,0 +1,262 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.spout;
+
+import org.apache.storm.Config;
+import org.apache.storm.spout.SpoutOutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.IRichSpout;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.mqtt.MqttMessageMapper;
+import org.apache.storm.mqtt.common.MqttOptions;
+import org.apache.storm.mqtt.common.MqttUtils;
+import org.apache.storm.mqtt.common.SslUtils;
+import org.apache.storm.mqtt.ssl.KeyStoreLoader;
+import org.fusesource.hawtbuf.Buffer;
+import org.fusesource.hawtbuf.UTF8Buffer;
+import org.fusesource.mqtt.client.Callback;
+import org.fusesource.mqtt.client.CallbackConnection;
+import org.fusesource.mqtt.client.Listener;
+import org.fusesource.mqtt.client.MQTT;
+import org.fusesource.mqtt.client.QoS;
+import org.fusesource.mqtt.client.Topic;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class MqttSpout implements IRichSpout, Listener {
+ private static final Logger LOG = LoggerFactory.getLogger(MqttSpout.class);
+
+ private String topologyName;
+
+
+ private CallbackConnection connection;
+
+ protected transient SpoutOutputCollector collector;
+ protected transient TopologyContext context;
+ protected transient LinkedBlockingQueue<AckableMessage> incoming;
+ protected transient HashMap<Long, AckableMessage> pending;
+ private transient Map conf;
+ protected MqttMessageMapper type;
+ protected MqttOptions options;
+ protected KeyStoreLoader keyStoreLoader;
+
+ private boolean mqttConnected = false;
+ private boolean mqttConnectFailed = false;
+
+
+ private Long sequence = Long.MIN_VALUE;
+
+ private Long nextId(){
+ this.sequence++;
+ if(this.sequence == Long.MAX_VALUE){
+ this.sequence = Long.MIN_VALUE;
+ }
+ return this.sequence;
+ }
+
+ protected MqttSpout(){}
+
+ public MqttSpout(MqttMessageMapper type, MqttOptions options){
+ this(type, options, null);
+ }
+
+ public MqttSpout(MqttMessageMapper type, MqttOptions options, KeyStoreLoader keyStoreLoader){
+ this.type = type;
+ this.options = options;
+ this.keyStoreLoader = keyStoreLoader;
+ SslUtils.checkSslConfig(this.options.getUrl(), this.keyStoreLoader);
+ }
+
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ declarer.declare(this.type.outputFields());
+ }
+
+ public Map<String, Object> getComponentConfiguration() {
+ return null;
+ }
+
+ public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
+ this.topologyName = (String)conf.get(Config.TOPOLOGY_NAME);
+
+ this.collector = collector;
+ this.context = context;
+ this.conf = conf;
+
+ this.incoming = new LinkedBlockingQueue<>();
+ this.pending = new HashMap<>();
+
+ try {
+ connectMqtt();
+ } catch (Exception e) {
+ this.collector.reportError(e);
+ throw new RuntimeException("MQTT Connection failed.", e);
+ }
+
+ }
+
+ private void connectMqtt() throws Exception {
+ String clientId = this.topologyName + "-" + this.context.getThisComponentId() + "-" +
+ this.context.getThisTaskId();
+
+ MQTT client = MqttUtils.configureClient(this.options, clientId, this.keyStoreLoader);
+ this.connection = client.callbackConnection();
+ this.connection.listener(this);
+ this.connection.connect(new ConnectCallback());
+
+ while(!this.mqttConnected && !this.mqttConnectFailed){
+ LOG.info("Waiting for connection...");
+ Thread.sleep(500);
+ }
+
+ if(this.mqttConnected){
+ List<String> topicList = this.options.getTopics();
+ Topic[] topics = new Topic[topicList.size()];
+ QoS qos = MqttUtils.qosFromInt(this.options.getQos());
+ for(int i = 0;i < topicList.size();i++){
+ topics[i] = new Topic(topicList.get(i), qos);
+ }
+ connection.subscribe(topics, new SubscribeCallback());
+ }
+ }
+
+
+
+ public void close() {
+ this.connection.disconnect(new DisconnectCallback());
+ }
+
+ public void activate() {
+ }
+
+ public void deactivate() {
+ }
+
+ /**
+ * When this method is called, Storm is requesting that the Spout emit tuples to the
+ * output collector. This method should be non-blocking, so if the Spout has no tuples
+ * to emit, this method should return. nextTuple, ack, and fail are all called in a tight
+ * loop in a single thread in the spout task. When there are no tuples to emit, it is courteous
+ * to have nextTuple sleep for a short amount of time (like a single millisecond)
+ * so as not to waste too much CPU.
+ */
+ public void nextTuple() {
+ AckableMessage tm = this.incoming.poll();
+ if(tm != null){
+ Long id = nextId();
+ this.collector.emit(this.type.toValues(tm.getMessage()), id);
+ this.pending.put(id, tm);
+ } else {
+ Thread.yield();
+ }
+
+ }
+
+ /**
+ * Storm has determined that the tuple emitted by this spout with the msgId identifier
+ * has been fully processed. Typically, an implementation of this method will take that
+ * message off the queue and prevent it from being replayed.
+ *
+ * @param msgId
+ */
+ public void ack(Object msgId) {
+ AckableMessage msg = this.pending.remove(msgId);
+ this.connection.getDispatchQueue().execute(msg.ack());
+ }
+
+ /**
+ * The tuple emitted by this spout with the msgId identifier has failed to be
+ * fully processed. Typically, an implementation of this method will put that
+ * message back on the queue to be replayed at a later time.
+ *
+ * @param msgId
+ */
+ public void fail(Object msgId) {
+ try {
+ this.incoming.put(this.pending.remove(msgId));
+ } catch (InterruptedException e) {
+ LOG.warn("Interrupted while re-queueing message.", e);
+ }
+ }
+
+
+ // ################# Listener Implementation ######################
+ public void onConnected() {
+ // this gets called repeatedly for no apparent reason, don't do anything
+ }
+
+ public void onDisconnected() {
+ // this gets called repeatedly for no apparent reason, don't do anything
+ }
+
+ public void onPublish(UTF8Buffer topic, Buffer payload, Runnable ack) {
+ LOG.debug("Received message: topic={}, payload={}", topic.toString(), new String(payload.toByteArray()));
+ try {
+ this.incoming.put(new AckableMessage(topic.toString(), payload.toByteArray(), ack));
+ } catch (InterruptedException e) {
+ LOG.warn("Interrupted while queueing an MQTT message.");
+ }
+ }
+
+ public void onFailure(Throwable throwable) {
+ LOG.error("MQTT Connection Failure.", throwable);
+ MqttSpout.this.connection.disconnect(new DisconnectCallback());
+ throw new RuntimeException("MQTT Connection failure.", throwable);
+ }
+
+ // ################# Connect Callback Implementation ######################
+ private class ConnectCallback implements Callback<Void> {
+ public void onSuccess(Void v) {
+ LOG.info("MQTT Connected. Subscribing to topic...");
+ MqttSpout.this.mqttConnected = true;
+ }
+
+ public void onFailure(Throwable throwable) {
+ LOG.info("MQTT Connection failed.");
+ MqttSpout.this.mqttConnectFailed = true;
+ }
+ }
+
+ // ################# Subscribe Callback Implementation ######################
+ private class SubscribeCallback implements Callback<byte[]>{
+ public void onSuccess(byte[] qos) {
+ LOG.info("Subscripton sucessful.");
+ }
+
+ public void onFailure(Throwable throwable) {
+ LOG.error("MQTT Subscripton failed.", throwable);
+ throw new RuntimeException("MQTT Subscribe failed.", throwable);
+ }
+ }
+
+ // ################# Subscribe Callback Implementation ######################
+ private class DisconnectCallback implements Callback<Void>{
+ public void onSuccess(Void aVoid) {
+ LOG.info("MQTT Disconnect successful.");
+ }
+
+ public void onFailure(Throwable throwable) {
+ // Disconnects don't fail.
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/ssl/DefaultKeyStoreLoader.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/ssl/DefaultKeyStoreLoader.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/ssl/DefaultKeyStoreLoader.java
new file mode 100644
index 0000000..8bca407
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/ssl/DefaultKeyStoreLoader.java
@@ -0,0 +1,97 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.ssl;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+
+/**
+ * KeyStoreLoader implementation that uses local files.
+ */
+public class DefaultKeyStoreLoader implements KeyStoreLoader {
+ private String ksFile = null;
+ private String tsFile = null;
+ private String keyStorePassword = "";
+ private String trustStorePassword = "";
+ private String keyPassword = "";
+
+ /**
+ * Creates a DefaultKeystoreLoader that uses the same file
+ * for both the keystore and truststore.
+ *
+ * @param keystore path to keystore file
+ */
+ public DefaultKeyStoreLoader(String keystore){
+ this.ksFile = keystore;
+ }
+
+ /**
+ * Creates a DefaultKeystoreLoader that uses separate files
+ * for the keystore and truststore.
+ *
+ * @param keystore path to keystore file
+ * @param truststore path to truststore file
+ */
+ public DefaultKeyStoreLoader(String keystore, String truststore){
+ this.ksFile = keystore;
+ this.tsFile = truststore;
+ }
+
+ public void setKeyStorePassword(String keyStorePassword) {
+ this.keyStorePassword = keyStorePassword;
+ }
+
+ public void setTrustStorePassword(String trustStorePassword) {
+ this.trustStorePassword = trustStorePassword;
+ }
+
+ public void setKeyPassword(String keyPassword) {
+ this.keyPassword = keyPassword;
+ }
+
+ @Override
+ public InputStream keyStoreInputStream() throws FileNotFoundException {
+ return new FileInputStream(this.ksFile);
+ }
+
+ @Override
+ public InputStream trustStoreInputStream() throws FileNotFoundException {
+ // if no truststore file, assume the truststore is the keystore.
+ if(this.tsFile == null){
+ return new FileInputStream(this.ksFile);
+ } else {
+ return new FileInputStream(this.tsFile);
+ }
+ }
+
+ @Override
+ public String keyStorePassword() {
+ return this.keyStorePassword;
+ }
+
+ @Override
+ public String trustStorePassword() {
+ return this.trustStorePassword;
+ }
+
+ @Override
+ public String keyPassword() {
+ return this.keyPassword;
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/ssl/KeyStoreLoader.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/ssl/KeyStoreLoader.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/ssl/KeyStoreLoader.java
new file mode 100644
index 0000000..297efcc
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/ssl/KeyStoreLoader.java
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.ssl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+/**
+ * Abstraction for loading keystore/truststore data. This allows keystores
+ * to be loaded from different sources (File system, HDFS, etc.).
+ */
+public interface KeyStoreLoader extends Serializable {
+
+ String keyStorePassword();
+ String trustStorePassword();
+ String keyPassword();
+ InputStream keyStoreInputStream() throws IOException;
+ InputStream trustStoreInputStream() throws IOException;
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/trident/MqttPublishFunction.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/trident/MqttPublishFunction.java b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/trident/MqttPublishFunction.java
new file mode 100644
index 0000000..e53c983
--- /dev/null
+++ b/external/storm-mqtt/src/main/java/org/apache/storm/mqtt/trident/MqttPublishFunction.java
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt.trident;
+
+import org.apache.storm.Config;
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.topology.FailedException;
+import org.apache.storm.mqtt.MqttMessage;
+import org.apache.storm.mqtt.common.MqttOptions;
+import org.apache.storm.mqtt.MqttTupleMapper;
+import org.apache.storm.mqtt.common.MqttPublisher;
+import org.apache.storm.mqtt.common.SslUtils;
+import org.apache.storm.mqtt.ssl.KeyStoreLoader;
+import org.apache.storm.trident.operation.BaseFunction;
+import org.apache.storm.trident.operation.TridentCollector;
+import org.apache.storm.trident.operation.TridentOperationContext;
+import org.apache.storm.trident.tuple.TridentTuple;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+import java.util.Map;
+
+public class MqttPublishFunction extends BaseFunction {
+ private static final Logger LOG = LoggerFactory.getLogger(MqttPublishFunction.class);
+ private MqttTupleMapper mapper;
+ private transient MqttPublisher publisher;
+ private boolean retain = false;
+ private transient OutputCollector collector;
+ private MqttOptions options;
+ private KeyStoreLoader keyStoreLoader;
+ private transient String topologyName;
+
+
+ public MqttPublishFunction(MqttOptions options, MqttTupleMapper mapper, KeyStoreLoader keyStoreLoader, boolean retain){
+ this.options = options;
+ this.mapper = mapper;
+ this.retain = retain;
+ this.keyStoreLoader = keyStoreLoader;
+ // the following code is duplicated in the constructor of MqttPublisher
+ // we reproduce it here so we fail on the client side if SSL is misconfigured, rather than when the topology
+ // is deployed to the cluster
+ SslUtils.checkSslConfig(this.options.getUrl(), keyStoreLoader);
+ }
+
+
+ @Override
+ public void prepare(Map conf, TridentOperationContext context) {
+ this.topologyName = (String)conf.get(Config.TOPOLOGY_NAME);
+ this.publisher = new MqttPublisher(this.options, this.keyStoreLoader, this.retain);
+ try {
+ this.publisher.connectMqtt(this.topologyName + "-" + context.getPartitionIndex());
+ } catch (Exception e) {
+ LOG.error("Unable to connect to MQTT Broker.", e);
+ throw new RuntimeException("Unable to connect to MQTT Broker.", e);
+ }
+ }
+
+ @Override
+ public void execute(TridentTuple tuple, TridentCollector collector) {
+ MqttMessage message = this.mapper.toMessage(tuple);
+ try {
+ this.publisher.publish(message);
+ } catch (Exception e) {
+ LOG.warn("Error publishing MQTT message. Failing tuple.", e);
+ // should we fail the batch or kill the worker?
+ throw new FailedException();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-mqtt/src/test/java/org/apache/storm/mqtt/StormMqttIntegrationTest.java
----------------------------------------------------------------------
diff --git a/external/storm-mqtt/src/test/java/org/apache/storm/mqtt/StormMqttIntegrationTest.java b/external/storm-mqtt/src/test/java/org/apache/storm/mqtt/StormMqttIntegrationTest.java
new file mode 100644
index 0000000..0dd4d73
--- /dev/null
+++ b/external/storm-mqtt/src/test/java/org/apache/storm/mqtt/StormMqttIntegrationTest.java
@@ -0,0 +1,153 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.storm.mqtt;
+
+import org.apache.storm.Config;
+import org.apache.storm.LocalCluster;
+import org.apache.storm.LocalCluster.LocalTopology;
+import org.apache.storm.generated.StormTopology;
+import org.apache.storm.testing.IntegrationTest;
+import org.apache.storm.topology.TopologyBuilder;
+import org.apache.storm.tuple.ITuple;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.storm.mqtt.bolt.MqttBolt;
+import org.apache.storm.mqtt.common.MqttOptions;
+import org.apache.storm.mqtt.common.MqttPublisher;
+import org.apache.storm.mqtt.mappers.StringMessageMapper;
+import org.apache.storm.mqtt.spout.MqttSpout;
+import org.fusesource.mqtt.client.BlockingConnection;
+import org.fusesource.mqtt.client.MQTT;
+import org.fusesource.mqtt.client.Message;
+import org.fusesource.mqtt.client.QoS;
+import org.fusesource.mqtt.client.Topic;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.Serializable;
+import java.net.URI;
+import java.util.Arrays;
+
+@Category(IntegrationTest.class)
+public class StormMqttIntegrationTest implements Serializable{
+ private static final Logger LOG = LoggerFactory.getLogger(StormMqttIntegrationTest.class);
+ private static BrokerService broker;
+ static boolean spoutActivated = false;
+
+ private static final String TEST_TOPIC = "/mqtt-topology";
+ private static final String RESULT_TOPIC = "/integration-result";
+ private static final String RESULT_PAYLOAD = "Storm MQTT Spout";
+
+ public static class TestSpout extends MqttSpout{
+ public TestSpout(MqttMessageMapper type, MqttOptions options){
+ super(type, options);
+ }
+
+ @Override
+ public void activate() {
+ super.activate();
+ LOG.info("Spout activated.");
+ spoutActivated = true;
+ }
+ }
+
+
+ @AfterClass
+ public static void cleanup() throws Exception {
+ broker.stop();
+ }
+
+ @BeforeClass
+ public static void start() throws Exception {
+ LOG.warn("Starting broker...");
+ broker = new BrokerService();
+ broker.addConnector("mqtt://localhost:1883");
+ broker.setDataDirectory("target");
+ broker.start();
+ LOG.debug("MQTT broker started");
+ }
+
+
+ @Test
+ public void testMqttTopology() throws Exception {
+ MQTT client = new MQTT();
+ client.setTracer(new MqttLogger());
+ URI uri = URI.create("tcp://localhost:1883");
+ client.setHost(uri);
+
+ client.setClientId("MQTTSubscriber");
+ client.setCleanSession(false);
+ BlockingConnection connection = client.blockingConnection();
+ connection.connect();
+ Topic[] topics = {new Topic("/integration-result", QoS.AT_LEAST_ONCE)};
+ byte[] qoses = connection.subscribe(topics);
+
+ try (LocalCluster cluster = new LocalCluster();
+ LocalTopology topo = cluster.submitTopology("test", new Config(), buildMqttTopology());) {
+
+ LOG.info("topology started");
+ while(!spoutActivated) {
+ Thread.sleep(500);
+ }
+
+ // publish a retained message to the broker
+ MqttOptions options = new MqttOptions();
+ options.setCleanConnection(false);
+ MqttPublisher publisher = new MqttPublisher(options, true);
+ publisher.connectMqtt("MqttPublisher");
+ publisher.publish(new MqttMessage(TEST_TOPIC, "test".getBytes()));
+
+ LOG.info("published message");
+
+ Message message = connection.receive();
+ LOG.info("Message recieved on topic: {}", message.getTopic());
+ LOG.info("Payload: {}", new String(message.getPayload()));
+ message.ack();
+
+ Assert.assertArrayEquals(message.getPayload(), RESULT_PAYLOAD.getBytes());
+ Assert.assertEquals(message.getTopic(), RESULT_TOPIC);
+ }
+ }
+
+ public StormTopology buildMqttTopology(){
+ TopologyBuilder builder = new TopologyBuilder();
+
+ MqttOptions options = new MqttOptions();
+ options.setTopics(Arrays.asList(TEST_TOPIC));
+ options.setCleanConnection(false);
+ TestSpout spout = new TestSpout(new StringMessageMapper(), options);
+
+ MqttBolt bolt = new MqttBolt(options, new MqttTupleMapper() {
+ @Override
+ public MqttMessage toMessage(ITuple tuple) {
+ LOG.info("Received: {}", tuple);
+ return new MqttMessage(RESULT_TOPIC, RESULT_PAYLOAD.getBytes());
+ }
+ });
+
+ builder.setSpout("mqtt-spout", spout);
+ builder.setBolt("mqtt-bolt", bolt).shuffleGrouping("mqtt-spout");
+
+ return builder.createTopology();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-opentsdb/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-opentsdb/pom.xml b/external/storm-opentsdb/pom.xml
index 0e01cdf..41f7e55 100644
--- a/external/storm-opentsdb/pom.xml
+++ b/external/storm-opentsdb/pom.xml
@@ -44,7 +44,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-pmml/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-pmml/pom.xml b/external/storm-pmml/pom.xml
index 2ddfeb3..b44c6f5 100644
--- a/external/storm-pmml/pom.xml
+++ b/external/storm-pmml/pom.xml
@@ -51,7 +51,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<!-- JPMML Compile Time dependencies LICENSING WARNING!
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-redis/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-redis/pom.xml b/external/storm-redis/pom.xml
index 3c1ca03..102e0f5 100644
--- a/external/storm-redis/pom.xml
+++ b/external/storm-redis/pom.xml
@@ -49,7 +49,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/external/storm-solr/pom.xml
----------------------------------------------------------------------
diff --git a/external/storm-solr/pom.xml b/external/storm-solr/pom.xml
index a7cc287..14922ed 100644
--- a/external/storm-solr/pom.xml
+++ b/external/storm-solr/pom.xml
@@ -42,7 +42,7 @@
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
+ <scope>${provided.scope}</scope>
</dependency>
<!-- Solr and its dependencies -->
<dependency>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 896d735..0fef7c8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -308,6 +308,9 @@
<qpid.version>0.32</qpid.version>
<eventhubs.client.version>1.0.1</eventhubs.client.version>
<jersey.version>2.24.1</jersey.version>
+
+ <!-- see intellij profile below... This fixes an annoyance with intellij -->
+ <provided.scope>provided</provided.scope>
</properties>
<modules>
@@ -361,7 +364,8 @@
<module>examples/storm-elasticsearch-examples</module>
<module>examples/storm-mqtt-examples</module>
<module>examples/storm-pmml-examples</module>
- <module>storm-perf</module>
+ <module>examples/storm-jms-examples</module>
+ <module>examples/storm-perf</module>
</modules>
<dependencies>
@@ -374,6 +378,18 @@
</dependencies>
<profiles>
+ <!--
+ Hack to make intellij behave.
+ If you use intellij, enable this profile in your IDE.
+ It should make life easier.
+ -->
+ <profile>
+ <id>intellij</id>
+ <properties>
+ <provided.scope>compile</provided.scope>
+ </properties>
+ </profile>
+
<profile>
<id>rat</id>
<build>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-dist/binary/final-package/src/main/assembly/binary.xml
----------------------------------------------------------------------
diff --git a/storm-dist/binary/final-package/src/main/assembly/binary.xml b/storm-dist/binary/final-package/src/main/assembly/binary.xml
index a6aab07..9321ea2 100644
--- a/storm-dist/binary/final-package/src/main/assembly/binary.xml
+++ b/storm-dist/binary/final-package/src/main/assembly/binary.xml
@@ -42,8 +42,8 @@
</includes>
</fileSet>
<!--
- $STORM_HOME/bin
- -->
+ $STORM_HOME/bin
+ -->
<fileSet>
<directory>${project.basedir}/../../../bin</directory>
<outputDirectory>bin</outputDirectory>
@@ -56,7 +56,6 @@
<!--
Allow for variable substitution for cache busting in HTML files and script.js
See storm-dist/binary/pom.xml for custom variables that will be substituted in.
-
The source files should have a ${variable to be replaced} wherever
maven assembly plugin should inject a value.
-->
@@ -84,11 +83,14 @@
<exclude>js/script.js</exclude>
</excludes>
</fileSet>
+ <!-- EXAMPLES -->
<fileSet>
<directory>${project.basedir}/../../../examples</directory>
<outputDirectory>examples</outputDirectory>
<excludes>
<exclude>**/target/**</exclude>
+ <exclude>**/dependency-reduced-pom.xml</exclude>
+ <exclude>**/*.iml</exclude>
</excludes>
</fileSet>
<fileSet>
@@ -99,13 +101,7 @@
<outputDirectory>bin</outputDirectory>
</fileSet>
<!-- EXTERNAL -->
- <fileSet>
- <directory>${project.basedir}/../../../external/storm-kafka/target</directory>
- <outputDirectory>external/storm-kafka</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
+ <!-- only include the README file -->
<fileSet>
<directory>${project.basedir}/../../../external/storm-kafka</directory>
<outputDirectory>external/storm-kafka</outputDirectory>
@@ -114,13 +110,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-kinesis/target</directory>
- <outputDirectory>external/storm-kinesis</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-kinesis</directory>
<outputDirectory>external/storm-kinesis</outputDirectory>
<includes>
@@ -128,13 +117,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-hdfs/target</directory>
- <outputDirectory>external/storm-hdfs</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-hdfs</directory>
<outputDirectory>external/storm-hdfs</outputDirectory>
<includes>
@@ -142,13 +124,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-hbase/target</directory>
- <outputDirectory>external/storm-hbase</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-hbase</directory>
<outputDirectory>external/storm-hbase</outputDirectory>
<includes>
@@ -156,13 +131,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-jdbc/target</directory>
- <outputDirectory>external/storm-jdbc</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-jdbc</directory>
<outputDirectory>external/storm-jdbc</outputDirectory>
<includes>
@@ -170,13 +138,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-hive/target</directory>
- <outputDirectory>external/storm-hive</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-hive</directory>
<outputDirectory>external/storm-hive</outputDirectory>
<includes>
@@ -184,13 +145,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-eventhubs/target</directory>
- <outputDirectory>external/storm-eventhubs</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-eventhubs</directory>
<outputDirectory>external/storm-eventhubs</outputDirectory>
<includes>
@@ -198,21 +152,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-eventhubs/src/main/resources</directory>
- <outputDirectory>external/storm-eventhubs</outputDirectory>
- <includes>
- <include>Config.properties</include>
- </includes>
- <fileMode>0644</fileMode>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/storm-elasticsearch/target</directory>
- <outputDirectory>external/storm-elasticsearch</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-elasticsearch</directory>
<outputDirectory>external/storm-elasticsearch</outputDirectory>
<includes>
@@ -221,41 +160,6 @@
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/flux/flux-core/target</directory>
- <outputDirectory>external/flux</outputDirectory>
- <includes>
- <include>flux*jar</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/flux/flux-wrappers/target</directory>
- <outputDirectory>external/flux</outputDirectory>
- <includes>
- <include>flux*jar</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/flux/flux-examples/target</directory>
- <outputDirectory>external/flux</outputDirectory>
- <includes>
- <include>flux*jar</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/flux/flux-examples</directory>
- <outputDirectory>external/flux/examples</outputDirectory>
- <includes>
- <include>README.*</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/flux/flux-examples/src/main/resources</directory>
- <outputDirectory>external/flux/examples</outputDirectory>
- <includes>
- <include>*</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/flux</directory>
<outputDirectory>external/flux</outputDirectory>
<includes>
@@ -263,13 +167,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-redis/target</directory>
- <outputDirectory>external/storm-redis</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-redis</directory>
<outputDirectory>external/storm-redis</outputDirectory>
<includes>
@@ -277,26 +174,13 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-solr/target</directory>
- <outputDirectory>external/storm-solr</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-solr</directory>
<outputDirectory>external/storm-solr</outputDirectory>
<includes>
<include>README.*</include>
</includes>
</fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/storm-cassandra/target</directory>
- <outputDirectory>external/storm-cassandra</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
+ <!-- Storm SQL -->
<fileSet>
<directory>${project.basedir}/../../../external/sql/storm-sql-core/target/app-assembler/repo</directory>
<outputDirectory>external/sql/storm-sql-core</outputDirectory>
@@ -347,7 +231,7 @@
<include>README.*</include>
</includes>
</fileSet>
-
+ <!-- END Storm SQL -->
<fileSet>
<directory>${project.basedir}/../../../external/storm-mqtt</directory>
<outputDirectory>external/storm-mqtt</outputDirectory>
@@ -356,27 +240,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-mqtt/core/target</directory>
- <outputDirectory>external/storm-mqtt</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/storm-mqtt/examples/target</directory>
- <outputDirectory>external/storm-mqtt</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/storm-mongodb/target</directory>
- <outputDirectory>external/storm-mongodb</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-mongodb</directory>
<outputDirectory>external/storm-mongodb</outputDirectory>
<includes>
@@ -384,13 +247,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-kafka-client/target</directory>
- <outputDirectory>external/storm-kafka-client</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-kafka-client</directory>
<outputDirectory>external/storm-kafka-client</outputDirectory>
<includes>
@@ -405,20 +261,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-opentsdb/target</directory>
- <outputDirectory>external/storm-opentsdb</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/storm-druid/target</directory>
- <outputDirectory>external/storm-druid</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-druid</directory>
<outputDirectory>external/storm-druid</outputDirectory>
<includes>
@@ -440,28 +282,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../external/storm-jms/core/target</directory>
- <outputDirectory>external/storm-jms</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../../external/storm-jms/examples/target</directory>
- <outputDirectory>external/storm-jms</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
-
- <fileSet>
- <directory>${project.basedir}/../../../external/storm-pmml/target</directory>
- <outputDirectory>external/storm-pmml</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../external/storm-pmml</directory>
<outputDirectory>external/storm-pmml</outputDirectory>
<includes>
@@ -469,13 +289,6 @@
</includes>
</fileSet>
<fileSet>
- <directory>${project.basedir}/../../../examples/storm-pmml-examples/target</directory>
- <outputDirectory>examples/storm-pmml-examples</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
<directory>${project.basedir}/../../../examples/storm-pmml-examples/src/main/resources</directory>
<outputDirectory>examples/storm-pmml-examples</outputDirectory>
<includes>
@@ -509,47 +322,9 @@
<include>storm*jar</include>
</includes>
</fileSet>
-
- <fileSet>
- <directory>${project.basedir}/../../storm-perf/target</directory>
- <outputDirectory>perf</outputDirectory>
- <includes>
- <include>storm*jar</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../storm-perf/src/main/conf</directory>
- <outputDirectory>perf/conf</outputDirectory>
- <includes>
- <include>*yaml</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../storm-perf/src/main/sampledata</directory>
- <outputDirectory>perf/resources</outputDirectory>
- <includes>
- <include>*</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>${project.basedir}/../../storm-perf/</directory>
- <outputDirectory>perf</outputDirectory>
- <includes>
- <include>README.*</include>
- </includes>
- </fileSet>
-
</fileSets>
<files>
- <!-- EXAMPLES -->
- <file>
- <source>${project.basedir}/../../../examples/storm-starter/target/storm-starter-${project.version}.jar</source>
- <outputDirectory>/examples/storm-starter/</outputDirectory>
- <destName>storm-starter-topologies-${project.version}.jar</destName>
- </file>
-
-
<!--
$STORM_HOME/conf
-->
@@ -565,6 +340,18 @@
<destName>storm_env.ini</destName>
<fileMode>0644</fileMode>
</file>
+ <file>
+ <source>${project.basedir}/../../../conf/storm-env.sh</source>
+ <outputDirectory>/conf</outputDirectory>
+ <destName>storm-env.sh</destName>
+ <fileMode>0755</fileMode>
+ </file>
+ <file>
+ <source>${project.basedir}/../../../VERSION</source>
+ <outputDirectory>/</outputDirectory>
+ <destName>RELEASE</destName>
+ <filtered>true</filtered>
+ </file>
<!-- TODO this should be a generated file from "target" -->
<file>
<source>${project.basedir}/../../../log4j2/cluster.xml</source>
@@ -601,4 +388,5 @@
<outputDirectory>/</outputDirectory>
</file>
</files>
+
</assembly>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/README.markdown
----------------------------------------------------------------------
diff --git a/storm-perf/README.markdown b/storm-perf/README.markdown
deleted file mode 100644
index 946ab21..0000000
--- a/storm-perf/README.markdown
+++ /dev/null
@@ -1,50 +0,0 @@
-# Topologies for measuring Storm performance
-
-This module includes topologies designed for measuring Storm performance.
-
-## Overview
-There are two basic modes for running these topologies
-
-- **Cluster mode:** Submits the topology to a storm cluster. This mode is useful for benchmarking. It calculates throughput and latency numbers every minute and prints them on the console.
-- **In-process mode:** Uses LocalCluster to run topology. This mode helps identify bottlenecks using profilers like JProfiler from within a IDE. This mode does not print metrics.
-
-In both the modes, a shutdown hook is setup to terminate the topology when the program that is submitting the topology is terminated.
-
-The bundled topologies can be classified into two types.
-
-- Topologies that measure purely the internal functioning of Storm. Such topologies do not interact with external systems like Kafka or Hdfs.
-- Topologies that measure speed of I/O with external systems like Kafka and Hdfs.
-
-Topologies that measure internal performance can be run in either in-proc or cluster modes.
-Topologies that measure I/O with external systems are designed to run in cluster mode only.
-
-## Topologies List
-
-1. **ConstSpoutOnlyTopo:** Helps measure how fast spout can emit. This topology has a spout and is not connected to any bolts. Supports in-proc and cluster mode.
-2. **ConstSpoutNullBoltTopo:** Helps measure how fast spout can send data to a bolt. Spout emits a stream of constant values to a DevNull bolt which discards the incoming tuples. Supports in-proc and cluster mode.
-3. **ConstSpoutIdBoltNullBoltTopo:** Helps measure speed of messaging between spouts and bolts. Spout emits a stream of constant values to an ID bolt which clones the tuple and emits it downstream to a DevNull bolt. Supports in-proc and cluster mode.
-4. **FileReadWordCount:** Measures speed of word counting. The spout loads a file into memory and emits these lines in an infinite loop. Supports in-proc and cluster mode.
-5. **HdfsSpoutNullBolt:** Measures speed at which HdfsSpout can read from HDFS. Supports cluster mode only.
-6. **StrGenSpoutHdfsBoltTopo:** Measures speed at which HdfsBolt can write to HDFS. Supports cluster mode only.
-7. **KafkaSpoutNullBolt:** Measures speed at which KafkaSpout can read from Kafka. Supports cluster mode only.
-8. **KafkaHdfsTopo:** Measures how fast Storm can read from Kafka and write to HDFS.
-
-
-## How to run ?
-
-### In-process mode:
-This mode is intended for running the topology quickly and easily from within the IDE and does not expect any command line arguments.
-Simply running the Topology's main() method without any arguments will get it running. The topology runs indefinitely till the program is terminated.
-
-
-### Cluster mode:
-When the topology is run with one or more than one cmd line arguments, the topology is submitted to the cluster.
-The first argument indicates how long the topology should be run. Often the second argument refers to a yaml config
-file which contains topology configuration settings. The conf/ directory in this module contains sample config files
-with names matching the corresponding topology.
-
-These topologies can be run using the standard storm jar command.
-
-```
-bin/storm jar /path/storm-perf-1.1.0-jar-with-dependencies.jar org.apache.storm.perf.ConstSpoutNullBoltTopo 200 conf/ConstSpoutIdBoltNullBoltTopo.yaml
-```
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/pom.xml
----------------------------------------------------------------------
diff --git a/storm-perf/pom.xml b/storm-perf/pom.xml
deleted file mode 100644
index 8d032d2..0000000
--- a/storm-perf/pom.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>storm</artifactId>
- <groupId>org.apache.storm</groupId>
- <version>2.0.0-SNAPSHOT</version>
- <relativePath>..</relativePath>
- </parent>
-
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-perf</artifactId>
- <packaging>jar</packaging>
- <name>Storm Perf</name>
- <description>Topologies and tools to measure performance.</description>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <!-- see comment below... This fixes an annoyance with intellij -->
- <provided.scope>provided</provided.scope>
- </properties>
-
- <profiles>
- <profile>
- <id>intellij</id>
- <properties>
- <provided.scope>compile</provided.scope>
- </properties>
- </profile>
- </profiles>
-
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <configuration>
- <descriptorRefs>
- <descriptorRef>jar-with-dependencies</descriptorRef>
- </descriptorRefs>
- <archive>
- <manifest>
- <mainClass />
- </manifest>
- </archive>
- </configuration>
- <executions>
- <execution>
- <id>make-assembly</id>
- <phase>package</phase>
- <goals>
- <goal>single</goal>
- </goals>
- </execution>
- </executions>
-
- </plugin>
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>exec-maven-plugin</artifactId>
- <version>1.2.1</version>
- <executions>
- <execution>
- <goals>
- <goal>exec</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <executable>java</executable>
- <includeProjectDependencies>true</includeProjectDependencies>
- <includePluginDependencies>false</includePluginDependencies>
- <classpathScope>compile</classpathScope>
- <mainClass>${storm.topology}</mainClass>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-core</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <!--
- Use "provided" scope to keep storm out of the jar-with-dependencies
- For IntelliJ dev, intellij will load properly.
- -->
- <scope>${provided.scope}</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-kafka</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.apache.storm</groupId>
- <artifactId>storm-hdfs</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
-
-
-</project>
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/conf/ConstSpoutIdBoltNullBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/conf/ConstSpoutIdBoltNullBoltTopo.yaml b/storm-perf/src/main/conf/ConstSpoutIdBoltNullBoltTopo.yaml
deleted file mode 100644
index 9f74aee..0000000
--- a/storm-perf/src/main/conf/ConstSpoutIdBoltNullBoltTopo.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-spout.count : 1
-bolt1.count : 1 # IdBolt instances
-bolt2.count : 1 # DevNullBolt instances
-
-# storm config overrides
-topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/conf/ConstSpoutNullBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/conf/ConstSpoutNullBoltTopo.yaml b/storm-perf/src/main/conf/ConstSpoutNullBoltTopo.yaml
deleted file mode 100644
index 51f2dd7..0000000
--- a/storm-perf/src/main/conf/ConstSpoutNullBoltTopo.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-spout.count : 1
-bolt.count : 1
-grouping : "local" # either "shuffle" or "local"
-
-# storm config overrides
-topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/conf/FileReadWordCountTopo.yaml
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/conf/FileReadWordCountTopo.yaml b/storm-perf/src/main/conf/FileReadWordCountTopo.yaml
deleted file mode 100644
index 61abe8f..0000000
--- a/storm-perf/src/main/conf/FileReadWordCountTopo.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-spout.count : 1
-splitter.count : 1
-counter.count : 1
-input.file : "/Users/roshan/Projects/idea/storm/storm-perf/src/main/resources/randomwords.txt"
-
-# storm config overrides
-topology.workers : 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/storm/blob/2a369e40/storm-perf/src/main/conf/HdfsSpoutNullBoltTopo.yaml
----------------------------------------------------------------------
diff --git a/storm-perf/src/main/conf/HdfsSpoutNullBoltTopo.yaml b/storm-perf/src/main/conf/HdfsSpoutNullBoltTopo.yaml
deleted file mode 100644
index a06ad6e..0000000
--- a/storm-perf/src/main/conf/HdfsSpoutNullBoltTopo.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-spout.count : 1
-bolt.count : 1
-hdfs.uri : "hdfs://hdfs.namenode:8020"
-hdfs.source.dir : "/tmp/storm/in"
-hdfs.archive.dir : "/tmp/storm/done"
-hdfs.bad.dir : "/tmp/storm/bad"
-
-# storm config overrides
-topology.workers : 1
\ No newline at end of file
[14/14] storm git commit: STORM-2416: CHANGELOG
Posted by ka...@apache.org.
STORM-2416: CHANGELOG
Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/e84b39d1
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/e84b39d1
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/e84b39d1
Branch: refs/heads/master
Commit: e84b39d1e6efa044bbe1762c7e971f9aff35eca6
Parents: 7dfd110
Author: Jungtaek Lim <ka...@gmail.com>
Authored: Thu Apr 6 07:33:41 2017 +0900
Committer: Jungtaek Lim <ka...@gmail.com>
Committed: Thu Apr 6 07:33:41 2017 +0900
----------------------------------------------------------------------
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/storm/blob/e84b39d1/CHANGELOG.md
----------------------------------------------------------------------
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9f98ff2..846823d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -222,6 +222,7 @@
* STORM-2451: windows storm.cmd does not set log4j2 config file correctly by default
## 1.1.0
+ * STORM-2416: Release Packaging Improvements
* STORM-2407: KafkaTridentSpoutOpaque Doesn't Poll Data From All Topic-Partitions When Parallelism Hint Not a Multiple Total Topic-Partitions.
* STORM-2414: Skip checking meta's ACL when subject has write privileges for any blobs
* STORM-2038: Disable symlinks with a config option