From 71af6ee95d70662b0ff6feff6b298a028e6a9d0e Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Tue, 31 Dec 2019 08:40:49 +1100 Subject: [PATCH 01/10] add example for Spring Boot profiles --- build-all.sh | 6 +- spring-boot/profiles/.gitignore | 32 ++++ spring-boot/profiles/build.gradle | 24 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 56177 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + spring-boot/profiles/gradlew | 172 ++++++++++++++++++ spring-boot/profiles/gradlew.bat | 84 +++++++++ spring-boot/profiles/settings.gradle | 1 + .../io/reflectoring/profiles/BarBean.java | 18 ++ .../profiles/BaseConfiguration.java | 36 ++++ .../io/reflectoring/profiles/BazBean.java | 20 ++ .../io/reflectoring/profiles/DefaultBean.java | 20 ++ .../io/reflectoring/profiles/FooBean.java | 22 +++ .../profiles/FooConfiguration.java | 20 ++ .../io/reflectoring/profiles/HelloBean.java | 17 ++ .../profiles/MasterConfiguration.java | 10 + .../profiles/MockedOutputPort.java | 5 + .../io/reflectoring/profiles/OutputPort.java | 5 + .../profiles/ProfileScannerBean.java | 28 +++ .../profiles/ProfilesApplication.java | 15 ++ .../reflectoring/profiles/RealOutputPort.java | 5 + .../profiles/WorkerConfiguration.java | 10 + .../src/main/resources/application-foo.yml | 1 + .../src/main/resources/application-local.yml | 4 + .../src/main/resources/application-prod.yml | 4 + .../src/main/resources/application.yml | 5 + .../profiles/FooBarProfileTest.java | 15 ++ .../reflectoring/profiles/FooProfileTest.java | 15 ++ 28 files changed, 598 insertions(+), 1 deletion(-) create mode 100644 spring-boot/profiles/.gitignore create mode 100644 spring-boot/profiles/build.gradle create mode 100644 spring-boot/profiles/gradle/wrapper/gradle-wrapper.jar create mode 100644 spring-boot/profiles/gradle/wrapper/gradle-wrapper.properties create mode 100644 spring-boot/profiles/gradlew create mode 100644 spring-boot/profiles/gradlew.bat create mode 100644 spring-boot/profiles/settings.gradle create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/BarBean.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/BaseConfiguration.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/BazBean.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/DefaultBean.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/FooBean.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/FooConfiguration.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/HelloBean.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/MasterConfiguration.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/MockedOutputPort.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/OutputPort.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/ProfileScannerBean.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/ProfilesApplication.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/RealOutputPort.java create mode 100644 spring-boot/profiles/src/main/java/io/reflectoring/profiles/WorkerConfiguration.java create mode 100644 spring-boot/profiles/src/main/resources/application-foo.yml create mode 100644 spring-boot/profiles/src/main/resources/application-local.yml create mode 100644 spring-boot/profiles/src/main/resources/application-prod.yml create mode 100644 spring-boot/profiles/src/main/resources/application.yml create mode 100644 spring-boot/profiles/src/test/java/io/reflectoring/profiles/FooBarProfileTest.java create mode 100644 spring-boot/profiles/src/test/java/io/reflectoring/profiles/FooProfileTest.java diff --git a/build-all.sh b/build-all.sh index bface02..f126a41 100644 --- a/build-all.sh +++ b/build-all.sh @@ -4,6 +4,7 @@ MAIN_DIR=$PWD build_gradle_module() { MODULE_PATH=$1 + echo "" echo "+++" echo "+++ BUILDING MODULE $MODULE_PATH" echo "+++" @@ -12,15 +13,16 @@ build_gradle_module() { ./gradlew clean build --info --stacktrace if [ $? -ne 0 ] then + echo "" echo "+++" echo "+++ BUILDING MODULE $MODULE_PATH FAILED" echo "+++" exit 1 else + echo "" echo "+++" echo "+++ BUILDING MODULE $MODULE_PATH SUCCESSFUL" echo "+++" - echo "" fi cd $MAIN_DIR } @@ -48,6 +50,7 @@ build_gradle_module "spring-boot/starter" build_gradle_module "spring-boot/startup" build_gradle_module "spring-boot/static" build_gradle_module "spring-boot/validation" +build_gradle_module "spring-boot/profiles" build_gradle_module "spring-cloud/feign-with-spring-data-rest" build_gradle_module "spring-cloud/sleuth-downstream-service" build_gradle_module "spring-cloud/sleuth-upstream-service" @@ -57,6 +60,7 @@ build_gradle_module "spring-data/spring-data-rest-associations" build_gradle_module "spring-data/spring-data-rest-springfox" build_gradle_module "tools/jacoco" +echo "" echo "+++" echo "+++ ALL MODULES SUCCESSFUL" echo "+++" \ No newline at end of file diff --git a/spring-boot/profiles/.gitignore b/spring-boot/profiles/.gitignore new file mode 100644 index 0000000..6c01878 --- /dev/null +++ b/spring-boot/profiles/.gitignore @@ -0,0 +1,32 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/spring-boot/profiles/build.gradle b/spring-boot/profiles/build.gradle new file mode 100644 index 0000000..7d8c61e --- /dev/null +++ b/spring-boot/profiles/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'org.springframework.boot' version '2.2.2.RELEASE' + id 'io.spring.dependency-management' version '1.0.8.RELEASE' + id 'java' +} + +group = 'io.reflectoring' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter' + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } +} + +test { + useJUnitPlatform() +} diff --git a/spring-boot/profiles/gradle/wrapper/gradle-wrapper.jar b/spring-boot/profiles/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..29953ea141f55e3b8fc691d31b5ca8816d89fa87 GIT binary patch literal 56177 zcmagFV{~WVwk?_pE4FRhwr$(CRk3Z`c2coz+fFL^#m=jD_df5v|GoR1_hGCxKaAPt z?5)i;2YO!$(jcHHKtMl#0s#RD{xu*V;Q#dm0)qVemK9YIq?MEtqXz*}_=jUJ`nb5z zUkCNS_ILXK>nJNICn+YXtU@O%b}u_MDI-lwHxDaKOEoh!+oZ&>#JqQWH$^)pIW0R) zElKkO>LS!6^{7~jvK^hY^r+ZqY@j9c3=``N6W|1J`tiT5`FENBXLF!`$M#O<|Hr=m zzdq3a_Az%dG_f)LA6=3E>FVxe=-^=L^nXkt;*h0g0|Nr0hXMkk{m)Z`?Co8gUH;CO zHMF!-b}@8vF?FIdwlQ>ej#1NgUlc?5LYq`G68Sj-$su4QLEuKmR+5|=T>6WUWDgWe zxE!*C;%NhMOo?hz$E$blz1#Poh2GazA4f~>{M`DT`i=e#G$*Bc4?Fwhs9KG=iTU1_ znfp#3-rpN&56JH)Q82UMm6+B@cJwQOmm^!avj=B5n8}b6-%orx(1!3RBhL~LO~Q_) z08-2}(`c{;%({toq#^5eD&g&LhE&rdu6Xo6?HW)dn#nW17y(4VDNRo}2Tz*KZeOJ=Gqg{aO>;;JnlqFiMVA+byk#lYskJf)bJ=Q) z8Z9b3bI9$rE-t9r5=Uhh={6sj%B;jj)M&G`lVH9Y*O*|2Qx{g3u&tETV~m)LwKEm7 zT}U%CvR7RA&X0<;L?i24Vi<+zU^$IbDbi|324Qk)pPH={pEwumUun5Zs*asDRPM8b z5ubzmua81PTymsv=oD9C!wsc%ZNy20pg(ci)Tela^>YG-p}A()CDp}KyJLp7^&ZEd z**kfem_(nl!mG9(IbD|-i?9@BbLa{R>y-AA+MIlrS7eH44qYo%1exzFTa1p>+K&yc z<5=g{WTI8(vJWa!Sw-MdwH~r;vJRyX}8pFLp7fEWHIe2J+N;mJkW0t*{qs_wO51nKyo;a zyP|YZy5it}{-S^*v_4Sp4{INs`_%Apd&OFg^iaJ;-~2_VAN?f}sM9mX+cSn-j1HMPHM$PPC&s>99#34a9HUk3;Bwf6BZG%oLAS*cq*)yqNs=7}gqn^ZKvuW^kN+x2qym zM_7hv4BiTDMj#<>Ax_0g^rmq=`4NbKlG1@CWh%_u&rx`9Xrlr0lDw zf}|C`$ey5IS3?w^Y#iZ!*#khIx8Vm+0msFN>$B~cD~;%#iqV|mP#EHY@t_VV77_@I zK@x`ixdjvu=j^jTc%;iiW`jIptKpX09b9LV{(vPu1o0LcG)50H{Wg{1_)cPq9rH+d zP?lSPp;sh%n^>~=&T533yPxuXFcTNvT&eGl9NSt8qTD5{5Z`zt1|RV%1_>;odK2QV zT=PT^2>(9iMtVP==YMXX#=dxN{~Z>=I$ob}1m(es=ae^3`m5f}C~_YbB#3c1Bw&3lLRp(V)^ZestV)Xe{Yk3^ijWw@xM16StLG)O zvCxht23Raf)|5^E3Mjt+b+*U7O%RM$fX*bu|H5E{V^?l_z6bJ8jH^y2J@9{nu)yCK z$MXM!QNhXH!&A`J#lqCi#nRZ&#s1&1CPi7-9!U^|7bJPu)Y4J4enraGTDP)ssm_9d z4Aj_2NG8b&d9jRA#$ehl3??X9-{c^vXH5**{}=y+2ShoNl-71whx;GS=a~*?bN{cm zCy+j0p4J4h{?MSnkQ5ZV4UJ(fs7p#3tmo7i*sWH?FmuDj0o>4|CIYAj=g@ZbEmMgl z6J-XPr67r}Ke$)WkD)hVD2|tn{e!x-z)koN$iH!2AUD0#&3&3g8mHKMr%iUusrnOd>R?l~q-#lr2Ki zb)XkR$bT5#or!s~fN5(K@`VL)5=CrQDiLQE;KrxvC78a+BXkAL$!KCJ3m1g%n4o4Z z@+*qk1bK{*U#?bZ$>8-Syw@3dG~GF=)-`%bU56v^)3b7`EW+tkkrSA?osI4}*~X?i zWO^kL8*xM{x-Ix}u=$wq8=Nl5bzHhAT)N&dg{HA$_n!ys67s~R1r7)(4i^ZB@P9sF z|N4Y-G$9R8Rz1J`EL)hhVuCdsX)!cl)`ZIXF>D+$NazAcg3$y)N1g~`ibIxbdAOtE zb2!M7*~GEENaTc+x#hOFY_n0y3`1mnNGu&QTmNh~%X$^tdi_4%ZjQk{_O^$=mcm|! z%xAxO*?qsc`IPrL?xgPmHAvEdG5A>rJ{Lo;-uQf3`5I~EC(PPgq2@n1Wc}lV&2O~t z1{|U92JH6zB?#yX!M`}Ojw+L1Z8{Is0pe?^ZxzOe_ZQcPCXnEVCy;+Yugc`E!nA(I z%O%hk_^!(IZso}h@Qe3{Fwl3nztZ$&ipk?FSr2Mo@18#FM^=PCyaDZ35%7gPt-%35 z$P4|4J8DnNH{_l_z@JQPY07;`(!M-{9j2=y__fxmbp59aaV4d)Y=@N(iUgGm0K!28 zMp;Ig3KkNy9z>t5BvQWtMY82$c}}d6;1`IJ^~At0(2|*C(NG#SWoa2rs|hBM8+HW(P5TMki>=KRlE+dThLZkdG387dOSY2X zWHr}5+)x`9lO#fSD1v&fL&wqU@b&THBot8Z?V;E4ZA$y42=95pP3iW)%$=UW_xC3; zB6t^^vl~v5csW5=aiZLZt9JLP*ph4~Q*l96@9!R8?{~a#m)tdNxFzQaeCgYIBA1+o+4UMmZoUO9z?Owi@Z=9VeCI6_ z7DV)=*v<&VRY|hWLdn^Ps=+L2+#Yg9#5mHcf*s8xp4nbrtT-=ju6wO976JQ(L+r=)?sfT?!(-}k!y?)>5c}?GB-zU zS*r8)PVsD;^aVhf^57tq(S%&9a;}F}^{ir}y0W|0G_=U9#W6y2FV}8NTpXJX*ivt{ zwQLhX0sSB8J?bmh(eUKq#AVmTO{VudFZpsIn-|i-8WlsexQ<;@WNn)OF=UpDJ7BI= z%-95NYqOY#)S?LIW-+rfw84@6Me}ya4*ltE*R^fy&W7?rEggZBxN@BR6=0!WH%4x0 zXg7=Ws|9Em`0pAt8k0cyQlr+>htn8GYs)+o>)IIf)p+yR`>lvz>5xFt(ep7>no4?4 zA%SUJ=L2D=;wq*f8WFl|&57Apa1;cT?b?bfJc8h&vkBvm%#ypP{=`6RL#Tf-dCq`;$!eR%>29EqpIkV*9 zEZl_>P3&}hY7)~q6UYw?*cBCsuPi$TU zRe}A|5nl7L_#e`8W0Hcpd~NWjAaV#3ngl$CoE3dz!= z?$3`dPgn5I+Q8 z@Bk>MqB7;kQqnDK=buPc+DsEDP-S;8#I(_z!*u&%_%nqI3+srxxsf9-Qg6%$l$Rtl zK2Wn-OtsBE5<1d}1Hl!l-r8eqD+{%b5$jfxQZw`2%)f+_^HMfbWyW4@j!^9M({>e; zeqCfR5b?^xh7MhHfmDvoXm8Wq;Jl2RU;jY*+a&o*H02$`#5HsG9#HOR4{g9 z#2mgNt%ep|IWrmctj=e%3xV&o^@8%OrR6io()6^sr!nQ3WIyQ3)0Mn}w}p^&t*V0G z03mUjJXbSCUG!o#-x*;_v>N8n-`yh1%Dp(1P)vz$^`oevMVh?u3}mgh}Qr(jhy;-09o$EB6jjWR!2F&xz^66M!F z-g}JBWLcw=j&Vb>xW#PQ3vICRT_UZ@wllScxk@ZQe&h-y)4B5kUJptVO%U-Ff3Hka zEyLldFsaM5E5`k>m}||+u`11;)tG@FL6TGzoF`A{R}?RZ@Ba!AS(tqAf{a_wtnlv>p|+&EEs(x%d4eq*RQ;Pq;) za9*J(n&C2dmFcNXb`WJi&XPu>t+m)Qp}c;$^35-Fj6soilnd4=b;ZePF27IdjE6PZ zvx{|&5tApKU2=ItX*ilhDx-a2SqQVjcV40Yn})Kaz$=$+3ZK~XXtrzTlKbR7C9)?2 zJ<^|JKX!eG231Oo=94kd1jC49mqE6G0x!-Qd}UkEm)API zKEemM1b4u_4LRq9IGE3e8XJq0@;%BCr|;BYW_`3R2H86QfSzzDg8eA>L)|?UEAc$< zaHY&MN|V#{!8}cryR+ygu!HI#$^;fxT|rmDE0zx|;V!ER3yW@09`p#zt}4S?Eoqx8 zk3FxI12)>eTd+c0%38kZdNwB`{bXeqO;vNI>F-l3O%-{`<3pNVdCdwqYsvso!Fw($ z`@$1&U=XH|%FFs>nq#e0tnS_jHVZLaEmnK#Ci==~Q!%Vr?{K0b$dSu(S!2VjZ}316b_I5Uk*L!8cJd>6W67+#0>-1P0i{eI%`C(_FkwRC zm}5eHEb0v^w3Wkqv#biSHXBG4yPC=^E!@hV8J5*JYf73=BqO!Ps#sP0fx~&C9PMN= z+V%$50uI|KE4^LCUXI74-qw$aRG&3kN-aOzVpRS1AX(Ua;Ewy>SlDn@lV(<^W?t-x z%K2iVK+;lG_~XF&Glk7w4<=Z!@-qDLc7)$q!>H^AU{s6e7krRmr!AZLf?8~$rRuP) zc$@c*PhIA^Lsu;uR{^x2)9nvsm}-67I`+iFZkhfNASUD>*LqxD=sAtpn{zY0xMxFp z4@USzYjMULeKc1lBe*8vxJDGNiSTtq_b#zd+Vzdc%$~+xf0;s|LR{F$YKe7YJVR$U}jKOo6=D+|6vnryopFbmNXEo-~I z*nm(LHmEGwkB%h%tXF4r|5h2p%VnRLx5rRsFpPR|e)*)C`WG-Iz94xsO&>1k8g6W? zG6#40`>I=B^scgmt_6!uU}=b3HgE@Jhj-X3jP!w-y>81ZD*~9C6ZRN4vlAFJQwK&l zP9&CP4%l-eN@0>Ihb_UWtp2kcPnh+L(fFJfQLc0`qqFbCkzr`8y2%{@RNrQbx*;tj zKtW!BWJFR$9(9^!Y%I%@3p?0zX#;(G?}sRkL{U>2rH4Wc{3{0@MV+vEaFcD18KIy% z7OyQTp?-N_)i%g+O#h(eLt_3ZDo)2l4PwjVS#=FzUNVvW{kFijz-@Y9-66fQL=xoc zXfLAC8<-!nnpM87K#eT;D^sW^HL5kS))Qj`kxT`%OewTXS(FT^X~VlkkZJJ?3*R8J zR>c>6)9K+9lg_a7!#<`KC$oEk-!~2N)@V}eq4O2xP)~N-lc}vH8qSe7tmQ3p@$pPde;Xk30uHYJ+VXeA@=yordN?7_ zpGsTlLlI{(qgtjOIlbx8DI{Nczj!*I>_-3ahzG;Kt&~8G_4G8qqF6IDn&g+zo>^L< z@zeVTB`{B9S*@M2_7@_(iHTQMCdC3zDi3_pE2!Lsg`K)$SiZj2X>=b2U#h^?x0j$Y zYuRf9vtRT~dxvF2Onn>?FfYPan1uc&eKyfBOK(|g7}E)t7}?{4GI%_KoO#8;_{N6! zDAqx7%0J`PG@O{(_)9yAFF!7l zWy1|Utdlc)^&J3OKhPI+S|Fc3R7vMVdN?PgoiQzo200oGpcy;TjSQ^e$a}Kh&C~xm zsG!Pqpqt5T`1`X$yas7{1hk?-r(Um>%&@?P2#NMETeQYhvk~nZW#BApGOLS2hdH)d zn!sf)7DotO?tRXBE#UpfKk-s}6%TfS0|7#>Rgk z%Np7ln*SH#6tzufY<0|UT+M}zJ1)1ap_cE@;QZp)+e-;k24 z3lZG_EA?tM$Eg|x3CK3!k`T7!*0}{fh8#=t^2EJ>TTo`6!CUm(HFUl7fFIB9Zlt4a z!4=|s-ZSn!@6Yc&+r1w*?*2fxKX>Hz2(vBwgE*>E=`A?Y1W-;{d2$4B%$NFAI?v5e zmYT{blxWeHn2J(0Vbz%FDz9~baqE#)R2TMG24xMZjCLcPfc1mR?5H4L%GnMR7ua{B zCu=nN(vV)5dJ_B80WBCy`tJ#YH6GyltGBSQvsN#q0;6XU1&60$&PC$0r}FUdr@1I+ zINcU{Ow6t4Qzmyk=A6u*z_!A*$^hBXJeKQ96bnF2qD$46hN!?1C|io|<_u@g16@Wd z(Fg?1=p8)dkWz<^ml6Tj5gO$hpB1N5msV!#PB5pfwCOBu`cv__=7kQq*r#Tc7E@6z zdr}5qs*slXK39`Yn%?=rslQgOTH0x?@z|h%fI5Y7kQ{X00BcL#8Jae4Dc9M zR%ySU5qODGnM;n#&up^M+PIddhxizA9@V%@0QQMY#1n z%{E8NS=?1?d((9Bk_ZC|{^(juH!;Mih{pTo&tu<^$Twk1aF;#W$;gxw!3g-zy(iiM z^+8nFS<9DJfk4+}(_Nza@Ukw}!*svpqJ)Nkh^sd%oHva}7+y)|5_aZ=JOZ6jnoYHQ zE2$FAnQ2mILoK*+6&(O9=%_tfQCYO%#(4t_5xP~W%Yw7Y4wcK|Ynd#YB3`rxli+9(uIQcRuQW_2EFA@J_ae$<%!EbI9c5htL`8>3Myy)@^=J)4p@nB2*&sWCOmwH zwYi;-9HOboaw0ov-WBk89LqGY!{)>8KxU1g%%wMq9h@Aie^42!f9`?o32T4;!dly? z(N?67=yo%jNp;oIVu7;esQ$wG=Vr+`rqPB&RLzr@@v`H-KK6wTa=8b<;$yE1lQGy?A1;JX|2hSzg9`a{;-5oh|=bFSzv&b zst=xa%|xW;id+~(8Fj7hS5BPVD(@(`3t@HUu))Q{0ZrqE2Jg zm6Gv~A*$A7Q#MU25zXD)iEUbLML1b++l4fJvP^PYOSK~^;n$EzdTE(zW3F1OpKztF zharBT_Ym7Y%lt#=p2&$3gs=g4xkM8A%Cbm*xR)9BnI}5=Oxp4GEF*bjFF^87xkP4L z;StW)zkX!yzz5^Q4HfEicKi{8elkFQx|0TH5Mtzsln>TN2*5Nypl(7sj_UxoN|KSyOP0g{L+vTbHlOyIEJ@ zjfku4x;`_FLga2P{FJLrgpIt;A-ukDuPsuW4#ApWE7|&i85Frv()~gOM`v`YVsF0c zx|J0}YRtNo7DIl>N&+%c(o1^C?%>Zf5<-<(yVcj~p88d;@=(jtox_$Af#v4%=g4oD ziv4MKh%Uf}NHP$SqF6mZj>}_HfC-@2>S~<3qOIu*R^%7;`VGN{ay@0(xmKM^5g9H4 zaq4>^38z|jszHqa)d>j#7Ccxz$*DGEG9PtB(d31?a;2$u>bY`CigPsg$zpDTW?zKg z+Ye-wtTjYHi#Hs`5$aDA=5Gl4J>p1Xs3PJZWWgax9~(h;G{hDip2I=+bW1ng3BrMC za72TsJR+;*0fSYuVnHsA;BnH5x8yc5Z=Bno0CUc14%hAC=b4*&iEzgAB!L= z`hhC!k&WLZPFYJY4X1pELFsAnJ!}Y@cW6I~)S53UOve!$ECM^q8ZE{e{o}hoflqqy z1*ubPGaeqs1&92?_Z|pDIR*gw{Tf^KJV)G*JLdzktzF;w@W<(X2;}XY0Mlzs8J?$L z$HVp2*+(o8?*n6cqx3_k6 z_&05@yeYRSfWQk)=oa0v#3BHNBBd>{fP`)#O^*^0_#?tW5jf!vCBp<2W+WCTEYeSv z9x0#bu>tB9M0W%_p^S7&BHa{2hfNL5eUUq4dFsGvgW}38M#j+AdeC5Q0pg^g zVzX3vrRi^YI(~*BW_Jv^o?2;5SRY4UiQy4mO}td`T?9Cn>K+dHL)+V&T+H2e9cz36 z3w!e<82_a0Abraxx8?L{a%&###&w=O83@y6xz0Yz{8$Wp? zpRHDDFRKHe+@^Y7*&@z$+aA;ksdi7xdV}c(i1><3F00dIA(v8LW(^O*HX)5kc#IRw zqF;w9l3uQK5us~@YEWk+?*7*(7!*}^OBGk+&H=rcQ31wWiI7@}vU8P`@-3x85BGy25yPLiFcZ9Ix z&g>o*aIM5;Y#3A-9~8-WmTezK5V~98kP{j^ZZ|WDa{ZX{nzq*qy3?Lw?|D4hN>kzB|OT6-b>reho-)KPiAg^M6 z^V7T^-LL<$VK9OM_AsP21hWykSObS?gk4L=NQ@Wevk9nXUWk~lu4S>zqFX4H{cWCE z8{eF=%>j8Xll5o2)cdA;Gx}>chr}9ZPv2kT=8x~q=B4i_@+{8-#jh5lsK}aj>0zxd zIl8*E$!(}Vii%YIB_2V6>|Ove`W+f~dqsd+*K|~yHvkUoMukz^XnLgcXunf+E9#k| zU0yT>#IG*W)+6ue)vv=xfDT{9k$;BDL!duM&qpGVui6NbuaKa`h?7i(W~4YUu2O@t zV=FEUMaC0QAIZg2c%Yb_WFI$vZ0z*fj-GdWkVMt>lDy@w)qhCE7c^Vx0i34{@bnQJ zMhB3B>8stMqGsKyqUsN>cE5xczm}r!D&5+?zTtYl6!U!4nmiPv?E)Pe$l(A@E1T7dD)Px*$)#pB(Mccz%i%RKcuskizkH& zM^+m#S#sK2?f8;gH5BaXCfyI z=Mo5s;fHbBh@$hNB(!H7;BeU>q)!Z^jaCks!;!d2W7 zv{8hf2+z&R2zAS%9Tu1(dKX~*{rOT|yjLsg6Bx_1@bTy#0{R-?J}i!IObk@Tql*9w zzz?AV8Z)xiNz}%2zKEIZ6UoVuri+AT8vVZBot|VA=8|~z-!4-N@}@Bfq$~F4`^LO) z?K#tKQ7_DzB_Z%wfZ*v)GUASW0eOy}aw!V^?FkG?fcp7dg4lvM$f-%IEnIAQEx7dJ zjeQdmuCCRe*a?o*QD#kfEAsvNYaVL>s2?e^Vg|OK!_F0B;_5TuXF?H0Pn&9-qO85; zmDYsjdxHi?{3_Il0sibc3V2IAP74l2a#&X0f6EdwEb_ zCHuQC@Q$(2$$0W&FuxtPzZJ`{zM{%lcw)>^c&ZZe3{GU#x8ZmhC${E>XcP+}<0zKn z`!He406MT}e^f*=$WZoCHO>xt?AE)A6xB*54a+>4&{!W0*`Q93ibK&4*}N2!PdjOa z8?@WRHjyEXqa(1=JSuglKreLS>x>SiHMYiH7)EW4L&&HyJUh+>opC2p&vz)-)hLZx z$xgyMGH)3R3o|Ptu(n3@oM8uX^(hq+q=`-aC1BlQp2I$eKj1tJuqDUh( zDkDsZ^23iaH3;bn7U>k)AD&%$u4G55$I=scldY;vFs+SJmR6mE&8&=C%8}PL3Pz1e zQ8C!gVj0PV2ym8>BOJZh9EPGH7B0X&x$=hK?E>1-@+vYaj!Grfw5!*_$pLHotuVn@tVzDd6inT? zVRbufqa&mdvhz=1^!A^mshoYUOn2TjV3fhuz*2mdNqBX{nUrI%6StBzCpt&mPbl5F zvw_Cj$en(bhzY^UOim8~W)nxy)zWKuy$oSS;qRzt zGB#g+Xbic&C4Zo0-$ZvuXA7-ka&rf8*Kn)MO$ggardqZ=0LyU3(T};RwH9seBsgBc z$6-BI}BN*-yID>S62)&!|-r4rDIfw zn19#SN$JA4xngbeGE4txEV5qszS(EnvzvVfh08c;IO5>d^UpU#m~24P{^7AVO7JAS zXZ6RdAp5-_yL;j@AlsMp8N&HVwHV>9DfH4c81xmzCzVZ3fXAQ+=RnI0B<;YfHZuqa zH|&*09Aj{ZsDVS+5jB{XEkd)PR5JO&0q`JK;9>!6T7%b14rbcBtNiw}OPI9h?u#%^ z{#w3(2+S5shq7N4smmX#Ns_ayWl5jP^7M^2hVn&gl1y>C@BvQ$Ah*^_cgzF=iG z39Lr1x6KpDuS0W9tH%r}N=vnOgCk^E`0I|6X8%H)E5a1{r;Ooi{4RF@DssCC6!o~J zDpXb3^$sNds;bMqm6n#cJ8M2#j7A_?^(fYr0QA$GrTQV$n;9;Qkh~$WT|e1Yq}o;h zEk_Ww1Kf4%%?R!{!c91CSJ*2fr<8xHF)(7!_%EKZ*$KsDg&ALtP>P19z99^whu6ms z^F(P(PMjgfp#lXpZt(?04@z5J{`JHow@|N~KFN{8WLok3u$zxk=`cv$?EaF;?XU6*mT&GJ_`>Ma3MgI?U07^UN9N3Fe37d_Q@ z-K2Z>R)Wso&W%+APtaorr8H4bEP6FH4p7!F)=w=jfs{I20h3Vck4N=Y(~XC1-kIAd zy5x^LnlUYu)zXH(P}oXq?U#Bgp{4bf<(9x%vx;I>b+jS0&jtaYZ?(5Pfi=RUF`r58 zPQbIAX=tIC=*W@cR#+`*i)vPR-|p^(ORBp*UB+Ei6;0-CF@No`$y^MQ8{I(2`CNzye&0=Q^qYjw%}y zZk$+l#(MVftcugPvORxL+@7k(4XzR~ti3!@toSymCaI5}vo}ri9vdMZa)_TzEsCB^ zLAkET9Z0E*!fv>)%Z#tIxUhYw%QRE2;98~{O{W%9rXI<-_{I=y%%qwb%iNi=+!>Qf zK(HtaA|ze7afz`txb*_lkb0u$(ijK97^%;axfg0J0#7NIs61X5HEQ=zq4Zv>VMu>$ z2~v10H$A`~ZB}6dK%@F2UgC9sMoSgd@q}!<7mY~z+C3H5tBW}xeKN&KIXP_?N=ed~ zFv^}TDs}$Eb(JDOQ;H7ZUNrivfKib({Ix|*X$AZawRj(j{g<^=Frb3--rEyv z6xZd8uQqr-K=@KuDrN*E`gfQ`mxKf_5w*!nJcKf(S=suW%7rFjx+s2> zi#9ouh%>Rl2Ch+}ie_3lybm-tkHbTSJILVkcjl~h@Q}u~N~u`668%(zQ9>9i7C#5$ zx{s(#H|$tR^Isy#9Q9XsY<1MHT-F7OyLQJdGEvzDtP8S6C2h^jU=C=>>*UM{Ijd1dNe~wr z+2V*%W+RpfrPRjc)E0!+gT^{TN*3CN1C}}95a1F4XwxwLS9A^ttvzq%M4HJ+$y?4I z`yKD+?Z?h%Uf%Z`@?6k*M1Nf&Cz(V^NgBygk_J*oqqX3`NcK^Lkg7rqVHhw@z>zv- z%X}I!;8!nQ^_RTCBos2Bl+SVD9Fa##0@yip*+{E)wPQxv$$hRA!c&QWLoLFG2$U zYDR(@dUI1w4`Zyv?%zhHwZ){BfpG(vq}!Y;6q(jI@xnbko7P(N3{;tEgWTp9X{GP3 z8Eh9fNgec!7)M?OE!e8wyw>Gtn}5IO|5~^)!F(*STx1KCRz?o>7RZbDJd>Dg##z!; zo}rG4d{6=c-pIFA4k|&90#~oqAIhkOeb6poAgkn^-%j66XICvZs}RA0IXj6u*rG#zR07|(JUt8bvX^$La@O#!;a) ziCtKmEDwgAp}1=mhU`6(nvaz%KG1c@?X8FbZK*QU*6mn${cWs15OGLA-803ZO-?=7 zah4u9yUPx8iI^Q~Bc7;DSaf@k0S@+p?!2(*$4}3v|?Nx~swkjwTmia)C!dVfht zzo1E-1vmsM(nC);|(Kp4yaPusRKec@I0b0J(n9k*tg>E zC-M)?LH%OLASR6}G-`?oyQ%KJ3(+KfS;-Rndh?ku8frhoZdKm<$0bj0e4I_lCX`7S#zIYBZ*s)i1dsNx5wX6~IDx z(Oz=(Bo4-fnzObxxiw~v`H}FuI<4v9nlM*7QryonD7aNenD4Iivwde7(TYd34Y|)E zZ;|i*$m}OZEsYWN9Xn+cJ?tl$HcJt&tK#m5)0pE@XV}gwcJV80^2W;>rR>%lUXzzrnFRHk2?0nQST``j1g;Rr}E@4Bo##q3%WJ3kW9`oLwIq zA0vY(vUKK{!(xz~Aai`k?GLCg(L^>jk7c19wzM!kci)KXbo`HMF5|jVUqOh5zPHx~ z7u)Wv`L*($bdq$~K@z$=!D+{HF@qBwO~Iv@@Nxw?Fyp2O5_#Ys8J$}5^H>J%`@CS{ zt-hYIu7NOhv0I=tr-?4EH2w4i=#_UUmFjs z%A-veHM(n~V=b%q0^_6lN0yt~Pi!0-4-LyFFewUhvZI$BFGs7)rVm2-{L|9h^f~Z)eyKyr z7?*u`rR)t7ZJ=8!I1#4|5kHXDmljgsWr(i6WPJ0eCg9K=mNGR7`F@<9Y)ptr=d(G2 zyFZ6ui;z7lu4{L3aCARB69KtaMekNz59bzEC8)@)F`W`q&hnF!@hlaZlivmQh~9 z8R-`kyDt3>Is4#t4`YaCAl(Y_9rDyTs1KYE_5gKHl-~>Ih(L@+s?${L`>}yrDEr-q zaZJ6`3Uhb_efWr)4dESDe#xM2C-gvCth%+_s@(-6U(RvIlv?Ex6v_UD{5h)9b*>N7 zzip!Gp<%x}c#!@x5`?mLYygtk7JG(HNpnAPnU%2^Gmjs75I>IS^yb*`pyeYn!J7D^ z_Z#@1;rrh7(T48tPjx2LKtKflO``Iz@cr-po+gBW$}#TuxAUQHEQAn2AEUg92@)F; z3M`=n3n&Q;h^mjIUSbe7;14c|RaJ{dweE`QJlDm5psETI1Mo@!_NG-@iUZ5tf+VTP5naWV2+Jq7qEv=`|Y`Kg-zESx3Ez zQ)3pq8v?(5LV8cnz-rlKv&6J}4*g7EdUU6RwAv#hOEPPngAzg>(I@$3kIb+#Z%^>q zC6ClJv0EE@{7Gk%QkBdOEd0}w2A}A(xKmF(szcN4$yDCezH)ILk`wx*R!dqa012KxWj{K;{m4IE$*u6C-i^Xn@6TimgZXs~mpQrA%YziFDYm9%33^x>MsMr{K`bk4 zmTYOFO0uD{fWnFuXf{4lKEGfjCSAEiBcUh~-RK~vwagYh%d^zqS*rgiNnc4TX!3<4FL7tr3;DA>RcYrMt3 z7h~TlyR(x;>v|5s1e#?b~H|Pqc=q};~YvHmKp(4Zk9bYF9IcEMmW{Q;%denJT?l4 z70{bSJ{{dIb)jJC54M+j%am#jwFugdb8V~47)xgJ;{uA!=Zs?&88BQVhSI&P+}(>q_==| z7JnM15Q4kwb~Px<@LEs%cxdZlH`{A~E3?IKpfJGR2rv7%N}=c)V?JJ@W7AH|AkZUh zvi2w)>RY)$6mkHQRo9L;PYl3PPg~?S(CX$-5+P!2B}GqIGEw- z3&}?!>|j7^Vh!EMc2U!gsDhS&8#Pq)SlamRXJ#FxX`caWHH_RW3%~WsoF&WECP$2g z3vaHqsO>V7k2xZwX3!-T2cj>VPidn8C|_4c?CyU;gpnaO(?YGO=a)9=Sc(n>Zb)C_ z>8fRKP6=d9Wg?&2G&5nNVU7Xk_8F-TmDrM6uNLZNK!U|gEn(vb`sw~_Q7LRLhitWE zJ{DBl&v1l}uTVoMM*y8$1{W*UIP`Ju*BeYbo`gJO3-K_tZ&4g%BSpS&lGf9 zD<3|fTK@&&<9U(QZ?zOW4zHKQXw`?v;uSZJ3ZIAji)F;jrOD;GeX1VSR+>@*5?@>z zVUfy2G!UmbDU$F&S&~3{;e=EUs{9uU^x(oT)!;)yX4Es>NE-7X%5^brZcL7_$KhIv zr5CGYP6|tw9`3$Cz3Myl8 znbJvOI4#W@<>Cyg>1I0>WiZtflPr-GM&DAaVv>AI;InpOh-5usQbSpOmTKY9e3EKR z;Hno1gPK2lJj!r+UKn9Zp#3yQStL5eP+`n?y*fm?v zA84*u&xPM4%6OaA%lsEMxp<}G&L4b#3zXfT`Q&U=2$xO!&?4X~_EUw`E}jd$70B`D z%VO!*-NSxZ=hz=*vGi#2+0DPI?Nr{|cA-Xm?8(IBQT5razQXk&(-b@ZJgwDKQH#!m zNC}wPd|`LEdw{jkq}>P?kLv_l`1H;`3Ypo z<=~^h)h>9lcSp#~`+8{d*nkO{Q57=hcqST+<>@KCkjsY4-m!~JrSs!7e3YBf5+gie z@3YxN5s{0Nw97uJlOQ$kM!sMpu6~+PJ9*Ym^Ru?p*)mlo*nLP}tQcyY@^-0%KE==U z9_PrE;U|ZK{=rZX`6#d#514_!C+5->pSvmgNS}EpK($i?)6CZ!Huf)`&x;5Z1A(&Q z@DlP6YDZ(sbd(>nxM#=4mhsQA4E;<+v`Q%cvx`xmNiP4h>WvTUPJ22uWaL49LZe&$ zu1$oP!=mMt@SLsRR9nk&V1bN$rN33*%D|rhd|xC)oT5}P_9ccwLRy4*EnFy#-VG|7&>jsJ2#RpDz#r@68GuOAE*sQSmL#Re$ z8y$k2M}GP&w8RPob)Z+eZez0hGJ6;ig$hoS`OMO5oKKR#YtoGWNpHT|{A-<2v@r9k zdHaj`SnX5h4E^0M=!*2hM>m9i#hdJD+AEofPeP$bAN9B`?Qin)0|4sWhwTizniPlA$1E6xG?)-y`KbWVB#R7|wk*IeoeRw}# zv0XV|5pzw9*e0TCxIsLcdLNFOYX4Y^gpD&=N$!;WMK)%4;Wh80b>{oPy}ot6_RYmF zZFlk2_X|kWVuVY)O#Vf9iHpmhr1G2no4g{P?=gJ_UpU}HpD|jo+qJb=ynu~|cc+v- z;x`}SwQprny~&aqm;cD>#RsRo_#Tf(pEw{Z8_{2^g#CKVen}EUK}tsX@2GvX6kFB{ zz@BgZBarBKocTk%rxxP`3yE^XTF~#~>G?6S_kr*M-OA&x38`~(+>=FcD7CF1Zzp~R z`rhZwkz2j21wH7{BU2yzTYRZMGS+cNw5Qs<(MJzN+PcO{SFY&&dRNlj2{vylsOs_+ zxNOcD(t>RX?HVbjT||`Df>@!92R)`K$w3^9!FYA7Zh8->KU!x)e?ztv$;IVrH@|W@fd8 z7BiE@%*;%u*_qv$`FHN(BD$hGqB^>w>&yBw^JV6HC=#GpjX!WQ(zeKjLwM3%)TCMT z#xyLTD8e|^YTKwg=Vv1|?|13o6!&U$_A}W2wWMcD^#DSn@g(5GbsHO6W$I9JNSxoCmsH}pFn8j_Wxk~5^ zVhEXZ+s@i0YjOeagPLSQYoxR{i2biszj7RW*S<_0j2Dw-Ef7qqLN%~y`ZAHIINOP} zvmaSn7x|DlC&W$UxkMbbJ&xpGD97rRFi#}3H61(AYVcPN9YUF0n72Zo#a#jfh`6TX z7!Pw#0~N0S?BC*wDZ0l04tmB!J145jwS;Pci*%m~ID_r&x0H;>J>$x}okimL!WLb^ z%m!KzacfeEw#alud8ZbsYF& z1@a|GCQHDAcQ3iM5LfSbz{fwQEh%&k<8f6$Q`yJ~Y7aO&6=u1}-*Gqw6$crh2cZ*X zMJE4cPZcdI%GQ>e=U|%r7EWn5pWBsM{|l8thH#qb@2{EkxwMBgjvOdH_IVX`Hh3}l zHcZa5HIB;>NekQX)ukMQJ`DTqS}jZ#j|$iH=Y_~kA^2?d%gm$PmPGuA)POynhUyaK zegRG1n2fzKfWg9@a>C@^5M)xpFSicmIRz7$?!Cq3uh(hTvD(>sag!Yf5*aMvtv=^^ zleZUVg$1$=zDs9p6Q1CAH&);!jkC-ZJ{fW`hE2o0x^4F_jcyr4#!ggqbcMo}icm`y zQ_77P#ZDAzmQz~g1=4DW!t7IZa}Z7thh#dEqn7+`5Lf8=4OAj_>AZ3IGQlz5loU2V zh|Ok)*^>O^ITIz*6(a6LT46*2Z8qn|UEzXV(Cl(`t!NL2^RU)JQ5CwNXU<%q`gjnv zF8YRI{0Qs{HiYEeK^2%=T5HFvrq^)R3Z~s+&dp-ZNpWu25qg9QUYwJZRjYFp(D>*A=`$9U_~N!BjcnQhdaf0Wf4k~Wb-yz6v=9i4rRTbdv0 zO)%vr@`J~@XKn3Cmo;jazVHe{VYoA-^m4ZO7VwZ~TARsMO7PY(!ck&QGkAgY9Q9RJ zLr}6J8cX!W%WFefwo9}P-hOjJJd>||gfOKNQ$xEbxDL$!N<$66h}w{A$tdnEEUq5; zQB17>Yh#_2o^GIeLQ`D^c**S1E;}*EAjaUHZAmh>Q~WW`RrCigz!CK>NF|IY`w>Yt zHl!vK+Cf`LljiFI=u=(p3$f!)&jk0aE{~>@e!_NZAc2Omti-mkw)JiJbz_^F-VP%u zQ&y+sQ5}T;hcIKT?jPxfEv!MA!t{oa;sV+#hIQ7_qx8Lz5Sulr_iep}MwMTaYYHyE z;th6PF7kKkE$1mPSGQC0?W9DiI&FS zPw(Wqb7k(snDvn6ol!D7!#GhJjH2M&gJc}C(-vuZ?+cGXPm&H#hftWUx3POg66a6n zfN##yl=25{SXg!9w>RJsk>cLGe2X4*AU?QPz|qi6XRQfR&>EZ1ay72<=1iIAao!gl z=iXCdaqY-04x%}=Y(<*>tlU_^(VrHIH)W}5({50@Pf_Emkvmy1_vz}FN4%!arFz{@ zGv%Z<%-w_KloV$v=!Z~|Z<%S|Y2a7~>BkxgdN}R+5+GE`KL1&xvnC1ZF`O&)@+-)Gcq!xuuB9S0X>R-t2pteqfiBX18=s!G>_Y z1xdnN_B)8}I9o<`n6y`b6?TV^e{iJi5!y5A8#Yc0miLEe zI33k{;HS8^<|IEkcVzjj#3rzLtPbmdq8r6_xeOf+1flw@2u{ z7ph8+9FzeiT#-P8tS?i#BdQ^$h{Ww*F=6X>5d^;jC>JrKa`a2vZCP4F`(r%|qT)+p z8I(A**}QO~>w_{AcjCG6S2(!)!0Q0koYHOqp0J7jIN>?pqxj+UPbG(ZzH%R7XM90` zj$jS22XlLiS_ef1-*ioM!Q*00STA}&18-3EN|(Q&<%b4;8@@tEm^uU}c!LZu9o`^A zX?d0=!n9~@Op+U(i2*`#N{3pe!XtMPb%k4>*#6S)3<-sC5x+);@IFHe;)vLac7gVb+ zVy%FX+y_#;fY94b0?IYZkO^Ow#D_#PU~5k6IsF|@9#PExC0GDbVu*%(SN5nu45KYs zKy!crklZl|C;1xq4#gk_`Nhg`S}5lC++i0e&GcafLxzk_hVLkBG5d2y{94=Z+|x=1 z%axSnz&LR0GB_NUJ02Lc;Ywvu?Q4ScA)Ezcg)!G2B1)N>;~wK=y{3lDg{gpiV|7Qn z#pOEzcxTd{r1`A7Q=fO{Wkuq(Nu{edMD>fb`0?+_%wU!>D5zX;AqW)-;3!Ex0vhNX zU(=77+{)#g(yr-uoy1;VzA7=eqw-JnGPqHOS9eh-G-@b?^PL|t*sa0#ONj?=tb;`? zl3AWgQ;F`_s;d-UQw4ap81^{HPK`38^=*#j0=$C|aKZrRIa{?amtPS#3sAyjQNNE= zMb?g$oC)nJIPC#jz%sw{QK8};07-+BdV^4n4PcL?xNe2Unx(ja7Qv=z_StA;h(t@` z(NNC7C@e%oWn=;U?G`?^0-gqzf+ur;K~}LsU5XJOUlJ1+>uC@)ch>nl zTSAKzE;N|>ob6G}%w)1smx;CC>fI+tlBydTE74*M`xWyfEVkhU0|-YvvQ@BS*=1*E z51c1H+!>B81O@#;EpxFY;eQ!72d*%yDa90owz9bww$P3P!PL8B1NB1>hZm6;z}(0;}OlhLJezvWPX0@NORT*jtJ!^cR@vI;g*o2t`ZiJwUsBg)gff zZE|OPnxbToa;liDWvy7?*;dfZj1DP^FbC{!haAw0nvpCY1``va4NgJN+5Q4oFCb0h zt^a99;!%c9Qzhh3JiTHZ?tWHR5Wz2sk&=FEtvf)LAVL}ekqCQE?nH=)#wWLp>@1CT zsg*%F!$+?0Z2>!V;;{xXE<^&RS}z%8PcOkF{p!LGufDBPhMPC^ zG$q{wZ z#Ja4}W6245crq5zje}Y@*c9{lc@AzpQqmGuXJ~LY$*{`hg&Gf3P11|WiFee_O|b}! zVRY5AG_P@)S3`T7$B`vU`zoGU;5|1#4QY$XU%4+;XJ0S*Gf z^`C83$;j1G*u}-n&e+z>nM}^X#K>0cbBxQ`${65k4P9l~vmH4wj!dK9Ds-qvw$pf(6VOiY2 zE?B}k{2zUxzM&EhG6jZ^@X=))R&lRCJ#H4rUE-D}<&<(5y_%LK&nIcv={%BK0e!`un#9Tp#Xwr-Fflcti3K={AE}6#+kt{Qie|AZ6 z6*&nr;n(wh^uhJE3@XxoOU#BJE&q;S)ux&^y%En`f>||6x$_bSMn;dC71xBhpU~E{ z5f2v|P{1Cv^jl+$^NJs3E!XibZM8w%4kl>uy8yA#xpwUfn$HvbVs|_LMy>AUN(Ar4 z6ZtLFzwcQpxj;zF&-MnRPYxT3{|`I(dzBso9p=4TUAQ4of#Wd3q@H-0Gz8C6U2uxl#VXmC}x+B`>D)ffK;%ZXO>H zPVvNavG%b4+j~NPJ?rVff87JMOM5lOQOltlI~`eXFb2A)9UhlOiw3q{Ke>OF<`kMl zD=jNgN&(C4hl51!cB-wzNNv$JDl%R#CFx^wJ8zI;*wqhcfv8FGOLzgs8B8@F<^2`p z%)SN|zLITOn%{T>nk3;{6-GYt$(;vrEOutbF+({n^elu<|244j+ z86+n$mOkc15>j*V=xfd1B$*G_jnCJcV9-J8EZ4((lhmZiNJw`_M7fwG&8pHy-Ke_I zrkS&<(%!(i9Q}xb&7WPk`{_kfquVmahoIG>3~7f7S+RSV+E92f8X9;%>e3J=Cr>x0 z&~#wS|C19#Hq^JQmKY}+yCL3daSWFY*=wp%?jSI5|8X-huuF_swuyAM*laABQv<nM&9OUnkdus9i3(4|D}`eMP1@}Y5Bb1U(z#8*%%$T>s4~qFx5>;H zHo2s5PKg@JpAq1ZZ4ryNp{ihW>z)*VLmyu=cWSVjU!#O$Av&KhM`<{OsHeT4W^L$D z{FjnPLb}b$BGoEeF$aDxO-llzmVFo67b$7hXg_8Tqtl11I(W(^t~3EMSd=YsUc-tL zeLEb+dK9(xLL!m2ow1)kliqtx)H+c?rCAXtFh}k)h<{do_@=OvP_jjD3nLJIHX;cA zVfvn9=>eu_t@R0_vlV-GJm~znRBf*`LeMt24Wb(uH5ag1#POrx5gcU1N=^GbQA zX9vONEw_HE$REtCE;n>zdhek^PUnZ};@#Hm_lec6sYLgf#WB9v_nsZ5KeZMY7auW5 z_kJ*q9eK)**B@+THL8Vch#NR9ncS;4qP#j6})Vi(T4b#5_y$z z7?C9%S=An`M&>9nt=_&CMr#bKi5!PK%Oi^X!xk~)OE$*!pzhBbDl|3c_cJ?Jt|od% zuYTxQifMN~M*;jbwvtdar!}ipi6*ul!tJ)0=`QptvVjiLWO?Ld6ii1euZ#(56TeW0VKXYA zO;JSEAuLdOhiOC(zo^YHO>63rTdS-vZ#(9539=q3ZSysm;qjs%@UoRNo1fD+cYOcer$pT%eNH6nAI) zF#HH}KZtL)Sp+0rH3lrc-tc*6T!UfgJ4jfcO4jby`$s!NkCaEoshYG5Jo6~Z904c_ zN@%e>N*~A}l2(TI*J0P&&ek!u&;b12$=W|DWJ0HN04;s(4eX5ydQQ`7)_VOrV%JU| zAsp{6!;B$uFYtT>M{r;b#P62;8PhsNPB~ zDoO@&p=doKv4mZP-D#zF_D~qc8PYJQJ|xuo%cr(3q7)B2GZMPwDGIJ&zZi;fUEyQ^ zlcs~)j^o>q<<~(~Ioj!$ZboT%dYqkYXq&vL*WDjLt_ESAA*A_+)v9X4Z~1?D*Gu@I zNYE?q&aC%8EUc1@Gw-PszuMQ!Erq`S#kHQj5KwM@PRZ4NlK(ROXVva0&c~E!#qtJ0ujV8(>y;aKR3G#1Mf43 zs*c3YkGCB~5XCJWkhOHBOJ@*-bm(s=s<7LjkA==WAdsxiSCN_HG*VRQs+ZOv^y!x- z2C;A|nMuaXAm|6=uTAFdv78xK6bw>VseGo>i1Y#EWJOx3B56}m<5I*`T}qD9x%_qM z>9{{znOJ%GMVUDWcqR9C$0bwpMbQjd+S2r_HA|s-X~_nZcDoQ?DCv38rI(hSCE_ZV zbvPUoTrAj=%zqNQ7P^-Fp>bqVgI}m6*^!WlyGKv+92^oWZlrs7 zLP%PeYC`}14V}Z>{6=9~EdATJEHiIgFI)OD3;bRds~f#P3rA87s!!-^uI1br2CapZ z`1v@|yHda{pTH)AkuX@Swr8a=g6N?>VNRM z7dRL!$B(sDymlKemGkMDPE2d*y(`$P4}_OZoiG2^U!|m)OKnsrH$J?=XL-5>htARqAgN!n1k0v0x4yHek#IorCFRo7^?-1;kV#W$fYQ!QZ- zomxY^(n$ZyZEU3bRd(Qmx=%pGu6}>mQ28S?VS|^mSzr&Wfbtc!fa(?ZZ>1~p-zrz^ zzm3k-e4;KOo(bR9U`{KmT>prvOF+)a;9Ml_ou|vL{IM=Wwe`oeC6zehu8qmGfVHua z1Y$@hbgk2??zN>r8?u<}nJOl7GDqOU+A)^>wkuZ=$Y+0?aq+`izt9p#hof!8mlE^O zf~Gi`+8)>#I!~O!_k0@}6j5)Cw87lr9N9gq4%B4BC9m4se#V(Ln8hzIpyRB}YGS^g zuNz)bukTc4-C-cH9TGtxvp~CV=`XTDd&4S2E=a~QX zH34ta32)bdsH=6WJ#2@#8V6}tbI48DGdKfUvU_^LA8y+nb4GUQkR}LPxm+CNd1|r_ z1{{kl@@K!{B?`H_fqa2bMp=P_xGQl3^UVQO)zE&*>6|fd0-ij2&(}+rzuIf z5BCVJgPeH`_W2=)_-9p+r-e~Ku;noOyq)`Rpluve)JTNOUH0EkxO#^Pz8g7A>2|Gu zo_MJ?scrYD45&6ToEltGJj8>3)|>Uy;dJZ@3c-Eg_+sB9D&U1|zG;L97$k}{!5VLm zZTG>$Pkz}N1Z_+lLxbHRQ6so1{TgU- zNgLZjHZh}%$P)p3^Gekk&O5Tieo9&&cDwA6`Vp6H4v$08e1lb0n7X`!_x6ZQd5Ncr z-1or8K7tmVoT%EEwQD=~7Pr?K#Q{0Fu|sSC$>>4Wb1Msgv(Z1Z(3m7U zMO0y=!H*S-W8oYSQ1PnB#xO?}$Q)^p(#SI7QlV{J=a2?GYE5VN`98&>h?oe*R}ep{ zozpe2vsQT@R#sltkEM-?rp}MoSIFEzNh`e`A6Ph1sa~lqf`_P8wdR(|ad7+8L@kAF z;vhFm@833@Jipi6uq3Pp_bF!`={6RZ)_q3e&#G#EWcSA-dg~O=vK_0rWH@i|&I%f1 zoygC}jg8DWcewP#zZ&O+CV8OUQ)Dm2p4Bjk$?oZgE_%JhAOFZW({kXYL>TpT;Lzz_ zI|FZMvT5ZIj4~Y)tmhAPt~%q0DYhX1((N?ZWM}JC*I_>20dJ=5-SmxUPm+W65rj^`Sjpw$s`^3 zE*(gDcZAiVe8og}D*eTK{{60Jzb!|N-s5|xL@(8VWewvmO-}3iw=6G!_s9I7pXH&* zrdXkqzmYytJaFoVEQefFHzj&&L-8Ck-zIBhH1+A6Dx7TbAE^RAhyx%HXL5skx89S4{#ET7{&c zmPoAZzn~8EGBAIa)Vb6MJ!#GZi5MYbm5C>b(F_nXi)XRA1togzy^M087T#tVYDd`x z;*c=}(IpnMfRND&nI{v8vJ54n?8f4lN`3K^%b)}oat1TifJuxO&ZZTXv5pUhub0Va z0wwYURnZ6}Gm9@r5z`F%e3zeTCje1FB69h@e{T5iwyiaFBF^|31@L?}B2xY5NZ=o~ zE$(4v0{AEMu;!Eh>^}AfO&zIZILKE}6cHN{5EEVqDy8a~1SAO{o{UWYu(Q(T`PAts5V>@5aLwuP6?A4V6(t8AZ*csoO|B$?XQ9mzToari6>M0&(#_q-@sf0G2g@us?RlnK?i5>!_})FfdEnul&4?fFyZ!m znCK()B;nqc9yH<3(+;1HNFSx>BO2|cmH9_>Fz+Q=1y^syP5ZMgbdJd#BU7(9as%Ha z^HX%VEDCVvM$S*Chwpb+?xd6lMjE*fvLWo&C>YLzd&w85R^HGrZ7(kpVPCu?l0Gs1 z>hIk~pj+7mBThy96}uG6s>OMG6mD=@i)9C}#fhwl)Jyp^xn=OVCWhssK}rg8=eT@_ z#MM-!#b3{H*Xr$FEUim5yRH+?cP*`J{c|f&rbWvFlCDFuH4#)*;lNUt$}#2XSF&9v zrQcdn7C`A`pBI)gGu9`(w@al@TAb`ex0c_we6RkY{rql>Q9pi>PGM8b2KT7qFnaxV5b zmoEvhO^tU`ABvOe!>+KynhALJ%$E>t)0)=h(O|==6SCC1QdZFZD5R7X(TTm*Q7_hO z7=l`B@tJOngSoFD`AxA6D{dmf-hq?o<*Jej1-3o?L1`s6?+mT&LguymtaBrJyuUnZ z?rVkLYMuzew?h6~WR}&&rjgWu%Ol0zRpK~!e`c9{nSB|I6c>-U%w~d<3Pru2oslnD z!7N9~Pvko?^+^eupC}q1Sey*kNzo2lD|DB`-Rbj%!6@17B|U@DbT%ss`OK13)V3c zBwneSClO9vQ^N*Z%RXYO`Wr~pe)sPVHe|_LFY!-A<-IfJFyW4DQ`-%WQ$+9`xjvG( zpQ|w~wLPi9e&l?tir%<7e!wa+NTIeV($?_M8K9Ok9K|eg(1Gw$>)_r!@~1mMWch?I zlu47XEEFQ?B*b6E2Mn(`k^R%I5MNchehcs$@A>Qon=44fmd(0d!g;b+#n@O=a#iwYWb+LEvPA@*#Kw4&DzJnYfh;LQnC6!87g zdeW^0s%^91PAO0q`>$Mb==p<41NxthJ-IB>>x%WSPot3rFI* zMf_9_Wl1cS$EV%`sC?Jhn@_2EIcHtJ_h7LBu5E^=&na;`bMz8S&E_6(zjFs3RZeiQ zuRTJN2!tO#0FHtOBj@_b2Se=SHmzr0Tt=WHWsm zPs9+a0tP&xdv8i{VnZqpkkTa`J-)KLAX(5g`{CFP0HkK9R?;p};94=j88#urqEf@h zNp86`#tPiH=peJZ1GkQ~j!|~G>DtG7jQ3c|>9GN9;LJVY1=w~3+AxFB$^Eo!vtkY< z^lHsv3=oH=6dYkZUJB8!gnGuu>Mpma_%KKAHQD%Qw+A~YE zE7L`H=rT?lQtq`I0KgG}wsC>BEIza!{njtF{Q`O>%)n&}o3jSMpQUFP%j1UC+HN<| z%(W?wu*JQbLVt+3ZDuiiDA#YyF+Ybg*l!h`SyN{^k0hQeu)8@TkKFQCrJXjud)K0> zE{25F{XD-Q59a5JYP&@17qn_&5_&P?3hqsnwKyDL`c}1=5ZJU0UskWz3a|b_9B++G zN)j91j2Rf7HbdQc&*p52&{LV;l9GveK^#X>?Yyoup(pf4w|r>&$=OG@Y_VMwA6hl! zIwQFIwy79_k(kp+&XQW7iS%nnfT|GF1~u@KPe&}8SiTJ;%RF2cz}~XJ6NDb<=rK#j zVHko2=aA8x+I!P%vZ!O9)e9UMJ0?eeR#JpbX0d512u#wxBlv;hf62v?LqwumZ%wcg zHVp25KY-e>DBPKKKy-JtDgj!RZ(S-1&dd=Xfl&QQQBJ6^qysCBFAbkG_9f#dv+)s1 z-L3APDR&JQ*PJ&s9> zB@&43RN*^1zQA-|GKN~I4qBYTZiMEPc`j3U596%W1rSO;yzSV-svR6&RH9>mD7B=u z8}eph-j#vh0v4B6McTDb$}TryMb+$sTV5 zi}_AlY6U+=R!x+it_{Fws^cQRi&m1^#pnUclQP{S=|M!jX6e!UuBpP(5qVg`=VuE5 zSpDtgx;0OGi1AVvVZScV;hZR4>PKLNj0j~Daguy8P6p8aJ#Wk2&=#n`iu={^&Cuoy z-OsacXUkkO&0G=_vb3pgg0D+_3b#{KW7s4b3?1@R)oPF<|d zG_ke%UusA5tAf>hpXrV2XKnZ|oQZ$?y0G!zbdF41MIG$yJ~1FUD|@rgG{@}|75Z;9 zC`IibDim;0C(9(jCO=WZUxP;=Hp0PKO>Q?1=4@jTW27?wUSwYJ5=htt-^akbm08Acywa z?nLL@sHAx-9N~vRRHk5`7W$g&)+fS=7KXruHCEE+=h`IRE~j?$(+$Nuv|ud;8rc|h zjdgESU_~0ZjvT}PN$$DBE25Xd!H!-qq-$f;-@rXwG-;l9#g7}!%cbSj%7`g-jyxA_ z0$^z@B zu8A=6hEd*PVO0if!FvNKOXTxHr=b0u@#o{$PVZQee5{z+S>bCizS`MmieM)ykX4gZhRpUGL6F zOkE$%^Gm`Lbd9qfXKCCp+^1dWmdg-NcoY+kwC`Rb+&@P{ix_T1_FL9HZn=tICT|&< z$H{Fd^@RXGa-_mGD1nN-V{GI0VrHfZ-iIa5NBVY7d=2t7+GO%A8@~x-5WU&2kH3_D zqk`_7tUqx{tWQlZ-v4d6|80u@L?!?4Mp>n?rirVL^s#1|6k-NPhJuub9zPdcC}t;X zlSfrFHxP;_4{1f~)}Y-ZvKZ5b3;!(mc+UO%q3O5S6&}Cuz2Hp2pO&BT6t;!bgS)$a zV_9(B5LMlN&4d5ZT`tN%!FUkZm!{_`EP1t|i5H*9W6l-hV^L zx!qJXeRAxC%aOh`>VU)L$Lc!pX&4TJA|Y^ok|g zGfQh;Rq}&N2EcF_JpyGSyGxM67#h+Ah=vdzPjUHZ_san!2g91j89&82?co8PbaI{{V*nJH-6oY-Z7TN1S54VidmMQ1IuCPAZY34*eyYOy*dkm= zWBmKt^*?yxjMko^(;OB+>mxwSTDg_&Nl3kTd_i5(x1YIH)T#2#9z=oU?&C~X&VJh* zC&dao)x@Os%2go&Td7bn6)YQM?7DCgOVd$hW<_kcf^{WhDRMGkvZ{&qjlF;(tv{(W z7$>A%gQ_qOYF&LitAX_s zomK?d5dU)Ok%o9z@e`X9dtYzo3)In;lfq*F;iGLslrQFTj^L#bFN^{P8Tk8zAsf z#keSh$;y9iM*Sqr_l1wz=EFXba$=NjYTWp-_yIAkN(S$eb$CC-PN#PoowN+o!DMey z#1(8Z4#=6dGYIRbLJMW+NVx09_`a_oo2N5P6Z`Tkkoz#_$XUhstzb@kZOA5N-Y!&% zw`TU0oGR(@E?u*=*M7z>?Wu^u7Z1R*c26GLw>%x<^sLJa@s8Z>F+cnGE%Ai`xC$d^wpgSo<>ze4WIAUE6Lvdxh;telK?xt9P)*x!)dTu6T=j*xL zkiLe*hoAV9l5hLoLxsK<7T_|lg=&wrp z*p>*BX3Uskrs5!gzfdod;X7^vSzcbzyR-0=!S>ltmUOBo(|z6E{s8j`iup7Rq~vE7 zRnWHm0f!Stlaf!zjvNbv9ylRrAYS{z{=tAs9k;ZNLce>*n4SX8jOywN_%rLNaG}t~ z3h7z*K+BU_xjdJ`t2JLTP$_d_le(Q74H##t9LWR}SnS@N19=Bkcl~6^qYRq5j{F_{(HdqNhjv^v)WoRlgkB#D!dh)d)H`V7AzDMv^$;{C4^ z(Dq~@#uN*gj+&HwR7MHYDiPnX`kXeGWIfJ9eqj8bvQ2arlrH)hxXo0QSh5|MBTKeE zn5cG-Uw&+L!y!~bvoll=Czr{~1HZ_c!tHx2zp8bUQBFMx795^CHcZ}?I3aiRZ8Jt@ z_{Hn+8>RJw9-4C{0#Rp|wR+54)ebE0`@9tpTE5X1Xwi_`zv5^+*X5_|WJ80m%iU#! zT$4bGhj}sl7l<6Z0^tq*6CTg}-@Q72iy{Bz{wn^9sb^_OyU%K%z3+0RnnaOdp-_&A zQpL(UuCU2T_aYTHVh0pT!zd})&LdL+6U;(qJd1Bq<=yFVF^WpMKADb6Dj1$ITTdnr zkEq|WD~GPtoLj?PH)h*5-p)HVd?zkG0du&3gDZJxTqlEp5F{V2jX(sCDo9KxX{~aP zv9JUY9(aVBC`pL{5iA~t(Polf=)9)gCaTKHT4&*1Q6EEeIM(pMN8<=dWxi^di<509 z(Sc7PN2z!hPuWQ`IF#i9hKhwb)9IO*-DGnF8Ot9ttlIN585zN6DTZM(vZCYWiK?k( z7OX+Nw@PZPs(N$ve{RS5vNXIEVz8|9x=3v*9zwT!STp~?Qmg(NmI|Nik%c~5QgbqB zYEC2?PcR%9L%(TgZ6eC+%rKl7BV#Sj;Ak`*nMxvU=@)1JNif^6T!`Pdk1J#2sVZBR znwpA)HPg__PDhM$6HM5|rkcgs*u9Po^PZrmgIYu~Cg$X1z*^GJDa@6o5`#TI*T1|3 zznkgm;}!R_d3@?ilQRYNV-;l9{Kma&PfC-Er}SYZ{KO0|#PQyAu1iHR9Xr5GZ+xX1 z$YVe3p(Ocvf+RYOR}K zqi8EWh=!!)B@I*IE%9u;V<-m1N_NcrdL8g z?a`g{d?N z(w+7w)4f1)n_7Zi9{9NXYDO>am#{o);@PlG(P+lnkeTc2M^U1R`+n3=5-SaTeBM0) z%kNRG@}o6-%AToQ(590ntVT?F6@U)=&6Isy2)}N*L1f4m5LPgamROcTYv*(iPyZ7c z#oWFCg`-d6eUw=UClhNO#vmqk7d}WW7zq;B057V=1_yWz^`sQ|iCPKK-*76K4e|ht!@`_yeX!1BAATkU7xFeYV z1PZo?&s`Us8+@fNYnk8(bz&7v_8NI9_DcEqlA8O-SC!D9g9; ze)c@z0tWx5DPDXxE&%#5N?4|>b4aw8>yRvSSEiX0?vLOiRHB=2|NhsXiZGo^5&B@< zeI31A+X0#Tx|c~iFv?`0v!=blr=KbwgLb78Gt8U_OIAAE2z9eNK&!s5F3F0>=8W!r zKT;oYg44jC_`bW%@*i!jZbKwGRx%8gdl9{Hbb1jDI`x3IjAJZW5Ei6(S>l@9E&B&0 zB3*=O@#A7@kk#)a|5-MdEKD-rCeGj6t~5#M&W2oS;K0izF)(Eg#omlB(Rx#OB)aoT z#GwXoK_5A|4xhFvu3CMq($#~xb8~18q6z}|Mk(d{j*7ZYQanRcz1UwW+(Xbs<`luO zHb8f`LI0u?3T)Otb_0X6$!xt|`V&k)`37wFO)&S%>7x!C60RXywvpkR*hEEuATHLB zx@Mc;`Zkyu+td&XI? zbu%d4p@UVsAW5iTL@C%3XR+Bptl=TbDEL_lvW3tV3l)rQ*yEL9_5{2}*ri^pn2SG} zR+-zw0QeD)q(v=8w55$|>$m^`e=SRmAT^m5fBNae&*Lv;slWJ>PpPj@Hs}8)xC)6D z{+kM@_=jba4xHOwYq(92K^_%!WFTeunUd}dMB?$5o(Bjbd2zGrme0Pwz*zf#={HE= zk-#G(=Qp%0W&TPr?xACqCk52iu;mm2Y}17p~)Pp;4!j)g8pxkGAfftTfDxEj~L%JS-YlQ79DmS zN^OP@{~`ohPv?81{MqY#@>z!a4@vL8_|AX)S7Gx{=taWH*~L{AVEm8Me{X*6*Emr? zRYrPOpr*5hLko^{?~9y*>xc*tZ&YiM%KMfA@nN^p#E|?c8W35t>GBAcZmA?4{UPUr zmeY-OaEd_%oDz|Gb=lAS!M&m9W`6(rdUJ;x06jy(gJfSoPLhvmgsi*@_=ffX5ej3s65C6K;Qq$m8<98QKQ&(2=PnxU-p zy1o$8j9+3oDY6_(6~00AZvJDQX{iOaWATzEh(B-7G*n?ii^k5}^sObC8mWZ$GqLO` zFQk3dGhc3LgXh1}46U4`@|u=PV=ro6Gk-U&3KzERYKq8iQ&`M{ z66z)|kDF*;2!t0`h2%3jtiMmCM!^ZbbEazf%%%b%rN^OWL#s=lwAd}0e;=qX?usTA z9(Zn-UmlKH6$@~yBkPop@gA+{^6&}OC$4EF1IHAN{w%|uvsCbY>|1Y3+n*y}m=gfM_MD2y2ybg5Ee#G4-0q!EQiw8pk8 zajMzrRw<+V4n|~tR*qNe&{ACV!QlqG+Tu_laOhYoqD#AJ;#RB7epfO@XP3?5L=4w| zHUPUmS;`H7X9qE!R2UvMsm6A;@=1O#5XSU1sWSQI@4a zZGFgOeXx}tmJs?=@*}5@_Cw*EWqjMYiP;ArX6+xYip?F}`38=k++5@zfoItr7BvNp zF4AQz;o;d5e2Pd(OFTD+j|Q|942$uF+L(@u_{M20MhtWi8oj``eZXbdJ;tUMbs@T5 z2y5LW6wZ&jO#>UCoMKMSy6g6DP)D&BF@YE9UtKg?xrubeFm**3WxIPdoUuJm6|>fa+?m%l%uRVj9gvr3LL<9h zzwJCHAAzE&-HEze3O~GobD}0Q8+EwwOWusWqu$p8zx0Xc)rsjG`nO_2#mkonxKUW8 zdT^tvODb;w?|v&f4=o3rG4P^EMVhblocIjZ`>hvC`9QX&{`gG;d5Q(*;i-d2Xpw&Q z(C@{o(K1N_^R@FKtK=F!$oRG`ANJ|~1L!u@kE-(fHSnoz^B9DTIMV%qFHDsLJLx;a z{kiDL9o$beEYbKDFhRicb1(FhJbGP|=3Wa8j344(w4YiN#2MMp;ozg{ZV|3@nlHrC zW^uW#Wd@qdwly%Kn#Y-3@(E1S1%~fg$8y?v55Ejv(DaH8Mi2lDLbwD&5!bxl1li;o z(LdPNVw+uqJe!`sO+I-1;BEVZO!%Dz_O@S66!?*QN}cGHJ0w6VOK24*rD{2LcnT6} z?;~uSqXzkQdoCHMAs~sk5Ds?W8B0!Ldi>wV}UtY5jdD4LGbGekgSgCxr;tWYlL{X}jf-~Z+7*=_Z1Km-EIkFnc0w}d*@k;T?0~RO(X-cMt?gUsdi*&sn>-7~!6{jts1NIoIy~YrX86%dgI}?$~|o75S{0+o3V$9hED;=AC2cw%Uuz zn%c_kE}cfHoSWej)Zc!aoh-n&ZK3_#(~$eJS8R2BuOn~A=IX3_35k7z6YhpHcdy?T zKih&CDm+TZQ+|d2B7GxKmyr)L^LpH%>r{7P+NA>@T2c_uw_wh}K= z{~#_+Nj<<2q>=ewjhBlt2DB&B#;NNHLLb&fj9u06uW|Ud5K!YyMi_OJ%*>q>C92EM z;>IlY(CJs-@UI?NF>1~-TU(XGwu|5~DS1{Lf9-8?OV3s@sIuccBOP*vKf>i@a+@$VGIzJD@${J?%^ zbWR$Kh@|3gAi3o+$wOkin1d7AoX>tYxR^ft5(7R*bJfR)v>mbg6-;nitLx>KfB0b0 z^R~_tVhPem2#B0P>L0Ca+st1MG&OmIKG0GA=mB{yop&crMUe&u{f>E@M9R(+e8Ni% z*kG=uijDODHo=eQsQfCP4ijs#+ve{s^Ck58tsW-rT2IDABK( zeZdFd?BB}%F6P((0YEmP3v&Vnlj%yt>UUG<0=6c-yY4qn()-Z5_dBePVW5rSoXDv6 zv8I!H;5&?F&m}_q9}C63GW9WD8U(lJ|8ioI7FNCX;8Vp}8QfcR?|g8Q>Enk2oF z%&lWU`bbvMjQq9e!|U7LrSj=juRk{#iT|GsM%2i~OxoVX%-+Sy^;6eO^>gme-r_S3 zb~O5Iyma_Si+Yi&yu<7#aChR<4D%Ji3O83tM<(wnUtt6^PYoRjhFS$ys_g$z_7+fi zC0Q3J1h?Ss?(QDk-3jjQuEE{i-Q6L$JA~kF!GaT9-`9W7yzXXt`pv7g?&7i*wd+#% zRNYfm=j`pVNwQiy*i_M^bg6a^-)2XN1Tm228%TlQ(5#}Y2#Ex7J~7qh&TQN9^zalC z1H^Vo0E6t>kUAp;eRo}NlV8|xjI4spihPIp{qy&vUN)h8%} zz?D7T5Tc;y#e*q4HO2E?Jtj9&@8CVOJCW6!pyTmRco8Kv0Xe@6$Aa0@irX*O@&*?;0Xf=JVLq>VInqATRQrg0KFw6m) zYg7;|g=VSrv)PxGi8one{g1!M%v@sL?hdjIV?Y@vbPGfEogW)9_IE1kkDEfOO9HE> zYwdcQW>QETgH6=aL}R#kOEDiOF+E%)Fg#=%8_Y}-im<;Z@9{>u{=gWSNna4S1xp!i zAp$Z{_|iqq(#N5J$R*J%UzJ5r*LjUrR#bPJU>Hs&SnMxaTLXxHH(F*_2V~o8hA|nc zp3>%Gs8VfFxr5*6ZDUmI(nJcX0m( zYBNX@GlF#qx-^JPA^N33M@fAMI*Z(nd!S}V)@;#^^kg&FUafSD$R=LIXP^A9zF-U( zH$4Wx4}3%f0^fE3yj8TPNFT;nA0(Zw3*4 zrB&9mN&Yb5^O_1&=JFLH13`qCvwlv+Q_`9U>}z+ZaViQ51E_P&%67bG!@m8FJg-oA z(H`d$B-%*g$70WK@hf+v7$rs^YtUhvm zHNWOcwjm+ukW6e!ptxSP#z>z}0xX0Yz%+@Algwn)EqKbBhT=UeQ#cuNu`WYx%-Bnl zt29^>_UO?mZfPJheZdvvf?K5wkq2;ys>AL{1du4}apz}9PKeB>gLKFs8-Lt6Bk{L$ z6_P1=jn$8sIE!1$aC+3U=C6J{O}hRGCFHD#Mp>QK-1+@Uwp=uSp5GOs!tv3$z4&y3 z{EkQOEa__=H|_`ig#*(ZW0Wi69Q?y&zvXY_2!~9&feRWFNHTC%-zzibWhC+w#U@hI zPn2l0y1fm)%pjF&8K(9JAIvA3Rgav1vQg+`Gs4PJC1TCRjP9AgS>CotwJrypkL;^-V)FCwm@eg^K46Nze^kOIrx>Xm8;V1!@~5 zjePDRBu#2!$$GR&S@dX{ss-0edeZ{El>0Y0=SODhhkB;oX$+_ui6vV77$DHsXMPfE zpR*zx19U6vU42UUQy!XKeNK4v%ToprR+MHPX5+y|OJ~`bF`8_&k6Do)wI~fqtGDKL z{2q{jPaA2Ru{ZfTn&gIx)Cmg^tC&`5m5aL?rH34}hzcMS{Dx+q5~oU3J{zXzfQ~<( z?vtESZ-7w3vlkP#kfY<$ZR{|F~eYQaL!%@WRn^)=9Suhl8TN zY)-M#liNT`Tnt;$%w(1( zg}2^JS8f-j6fSZtO&|A5Gw6M zYKO*RxVR%@k##Du;j)qW1$B2tW+d5e%ZiNjk+~9>xOq3Pbf*7D8PDDd&M9 z{!%^(kHTc$I_nSki$=X~yO&{Vq0%Nb4HI))Tv@YL8z`rpSTGZ5f&_?C*bE^|NvfX3 zwMCad0|fcQ`mPfyF!t6C%~Ym3r?Se{+nAksT#IeQYvRYvw7-mxkF^GUjR#v(Fh8Jr zTnQ4)2a?$yLPQB1#DMN6M^NVv&PPNE$q*$7$`C_<;SDb$IjIQ4L_m1M7!}bdpV_h~lgB{l{?ze1J5!l0w-9X3U zGyVmIb>DbJScwTXf=NEc-JS0U+GF7EKz<#3I)kF(Jx)UwuESdYv3k?^F;{QYK(j_* z;Le43=8!W~vmPBsWDrleZqHsB`lL4#S-mw|pYQ2VnS7rKVF!7K3tGhMCss1ANZ0nU zwoV>GTsCu8lS_IU<>BWi2ILHb;)FaX5dqz}t>FN2dc{E6-B)bGb_nMLt(z~EV^Bs= zzW8EIrp^ij$lM_t>IEE&+E%bQl0vl{xQV1~0Zg(GqH?nwQ-%$wjU2jL*jfnIR(K+l z+rFvcKjtjLmwaD+YVNR18KQj~A*&|TsN58f?N z`sBJk#VpbL3`tzVbfI_ekY8p*s6phlB-CGkhdUCw=pot+$OIls^wlm-E)yp{;YHQ{ zvOn$l)r#42pH>%Ie~Pjoe#jk!1actbgIwzI}$(lrU6Co)9xQL(kItc^-ug$3N+ zN)toZeqHnQ(ill$2%O4%yV~Y1LUIV#M`5&emYxdJwM}HOB1(RpS}(zpFc=NJ*nq0z z)Jzl-ea6fF%bWXhv}Ne7YPtg2fMEJL#9LbfE;mTtdt!+AFU!-vZNJkH0I@(B28pvLecY{H*DArFRNkf%@R`Pa}@rm?Qm zZlL8~M%iA^0(N482GD(g_!BSJnkRszhLXunIa>~%rwmsBVQVko3=ycfP$*6$3exc` zRdX3!im3{wq@+o^sZqOV0sB^-$;3OUh8P~(qW?EyPRz80IZ54jFgA+9}W-3;&y@QUu8Qnb3`fPU#*+ymcX zqURlh7>E(hjLDVwT-mLb4{!7;te)HK;$drFN%uKLHbuLbg&+i%WY4j#~h|Vxt1INLW8So(L_McXXgO7AHCm2>eK`_a_wgl+^ zMCpgZ%Bo%K$Nm1|XS-Sqtu%Gh!SHo6Jgb}iE*?>$2Eadh8obE?;t(Mgun@J&I3 zf$2cf`-~vn#gk`p^&#{;hvUtgRhBktk9~HNoIsR(L^wB@LWC_5V)}=fBL}Ro}t*KOD{~mH*p@^f^;qsG_zZ znn3sJWi+zt(UXit*ZmSoD9e(j;lFv-%tifK%7%L;XNUeG0-ptuHU76ChapF)-ndDW zFkO!`&V#mTM~~^Y(`nsJUmywt)?khymcv#;wOuS;0Qp$#Z0vAhI3*kvG?fXe3Ckmf86&t4znPfK40DOkk2q9Y>{k6doM4N=0G z@nYkzu9$cx0o%P-$f)4PlhsOfP?$?rE#<*(LlrXNu!$#FwyLcRMduKx8gxQGN24uQ z7RKn%yEK>g==N^l#+e2*6S$)VT7!D1m^;%BwG(Jxn=N9=*Fa$V<(sd=yZ3|0TCjrZ zsiiCGSS~XOCq#tM){+X7mllexaghdMP}^4`=vsGnjc;f3n_p7T-N=7L`KdOq=9^Sz zTn#8{gU%`{i+zy5HD#$Tl!;Mf^tgGDpSUTzGH(1$W2UlkUJxtqD;ghak ztEOJQZkWo2dC(iD0DmK^=CEd(%5VG`lk9EJO{J3Ii$0Ir3Uk8-iV^(6nKu$i<`Di9r@K zFQ!;FXBGi`FBD|75XU1tFz*`bYRQEMc1qG@Y5 zVvZ@gH(q(_QzV1JO`P#2f_umu-yH4HD69&ecgz5v!RM|D@9Pa!3yXL^8N#t*Zl?&b zuOhm4TvaN8LwIH4$VPM2Tmdjfj>@8$ulxr|2)I^wizpB1V}|JnjP(s9Ok!xGhqiwm z3e4s^PrZPlPz4wY?ElN!>-VAXev2UK--BRbMu82ZX3R^#ehfO2=@UXY`W^~>E;c`Y4<6|DZq~W?QzYtE)dOD zkUxtF%5{VozKQV!Wh_HYZYUUL1XD5!$sk{tF(&ngSK*=ZNLEZPq3N&Y8L!|%JT+%b z;-scI%&^MR8Mf@$o@?HQCmMyAelx#@(; ztyb4)HG&W91!+`qTB_%@4L5f*Cz)9L*kC<%1Kq7#@mw8KI4RiM7FHB;)gGuJKgjW7 zxKT?n4Jd?ciIyc1750xn;*Tz0nVGNst; zRbA|!Qy@zaJb;pCFgVf_mU_|3OMd(o5$o6n;h7UNgVJi7b8=(Pg~3WRmp*$vT9r8aMf`?_kijY9*qyhS?hiFHQmAhqx4k zWTMe7LXER#MdLvO*OUhM5~2F3*}Q_IUHXAPl!1CEYy`E0EEEo({YH=)>83LYe87)r zxkYx6J*Eh4r(H@H3Ykd;yIL6NvOaNkg)YQ!Ao>n7Jo!=HHlR9F>U}JLK0>o;VbU1F zjSoBkSsMg>ke%s0iz6{^rf7fCccC^S)F~`6otj~ndP6RZuHi7?f=ov2))KFmw4|wo zKi0{q1G0-V{{Vj(dO}3+H!WmcHQOq1OfpXs^}*d(f=<4Y#2k7ql*Zcu+AZ?r-KfZh zx!NxU#JCmzCvVo@pHBUk&4?sL?caE_cpEetj>v{c=Eb|M=1>YkD|R9ZA=%_LAvMJ> z^K280mSmSE#!d?F(VscJsjhng@%%{VRv!e222OY~xm~AuQ#{Ys_@BE$>>}m(n3gWK z4f=&9`^kiE8W9b3_L%3NJB9m;|k zUY9SQ0b_4C<$S0gLHJfUt#9bsb*-epuUg281#OJc#j*nO8Ulf+rvHsmv%I#g)_@UZ zA6u@t+-Se15m7})tPc_%;M**jPb~6TtjKV%hrr&X)Rrlb;~iz+Q=KZ7GiQQu>jO)T zc$6~Z(04%xf1fKFKl^lTHu55(Ww4aa4=rSkH(E7=?4sXIgTsy7_H%}ofFz=>@eY1U z7aHe>V*JeuS`7tVB-BM6Y-=N1qEh9Sb9jZiRGq~y(s3_lM1E2yvYiw6%b%$XXmSND zZYjx~au4{Wyc8*UzYyIQhoSYu?6MGw)`@S=2L)%H^LZG=HL5;&!u7@O3TB(wp+0q+qbWt(23#?l3&o1 zdu)^dCgS(B6leE^YS)++mSC*+R?77Tl(TwZdpiYkMz<*piGX(~65AxVH>ir2dH4 zw!4eGy*tK=6W}CKV6qad6P!YA&$_h0&g zCdw1q=PKJc`EAprZSd~;!o5J>Qzd_uE_ZPLB(0ds0}nCsyIg7>zItBRcMgg1Fv{7q z_%0m}M{gtR_@vy1VGhB*RIX3oQ~7{aQ_5bLXeG`QUI~kH6G&tAC17KHS!DYOs(}@e zjZ^1@34@$gL>r_jto3H@gN^8%L!;?2UV)u|L7MBk#OKV|L!MFxN7H|u(mGM_5p?*8 zpe~)nbB)n5x(n`2l^E7SW%GS-1PVAo7BQ9SW8Qg|6FTuxNvtBHqN)?$g0xP-R|!8W zX&HQhW&VulO{VowAzAQzgAPsvRCi8b!b?(yFr9%LzR{&q_LdS=}sc%(-pEdt>W z`Q(=fEI0z`M?D~qeEY%h z%M|A(CwGf(SLYj~9%2R8W87@sxR8*JkU~hf*j4JH-k4=P43;Do8fN@)vtyNSeN?d7f@_Ht)J~b(8)&nLa!yS6wtuvge+wlA38{lW$mYA|j@a zO+xlW(qgSL%%aKdybn}^ZVJuuMw?)*9mztFA9?sma6BLS32e*p!iOrzcUospllr(l zLsW@rTs^N;;G|$fFLy+P zQ@)8@UQ9V)`f<6HE-w);J%yLot%V^850q`D3`0W2E1`#Q`w+krMzhG!{}j8+CFunu z#e<5d86DvQDRGKsBSz9<7s4X@Bbgz%J&`%We2rL!6b>beg>6|4gNEt=`D#6a_F9udtCDAgC| zxg}dx+7r~enD`(xecQC#)^=YIuAe!c0jYMi&p)76BQn}mY1YB-7|<@aq;nBqU(~ zohC}+GxO*aO3n#t4h>#jd?BywPK$lU9vPFDVt=@~qbQuKhD}{y!W+zA%_n zRyKgcE&l(-tW<0)|KVt>Q$X`bTscPqxp5f~6#Q9Zu8N*PgS#zBahO zJ)Lp`xv!}r^tbwdly>??MLto;ptM6!qld+;pcS=)6`*z7S|Y|cjNm)4UVl~{1{Cnv z)9mcJyt7xYW0IxkA8 zwU&O6-Yg(?*+-bHe^1dctyH;7E^gG@C}SHZAct>iCHqb1GR-;oqF$+R=c~w=MNwl} zd(1;|Q3N_Cm`#=ABFYm1#%*>w$@d=Qr?%6MMtmFhV#7C5Qy9`r(BcDE%&)FFDJfb7 zir=kc=44FSC{C6Vw>|woBNy*OGwWMuv?G_`z!^Fo z;o+>ZdH2{gRB|Pe4CsX0j_c#(R*GYqlH|qX)A`Hw-4N8%a&_ zRT2d`|4<_nrg|zKT|@ES`7}E;wAPldMw1uL4Rgwn;nV(y!pc+Pt9{6OPh9nCKl)fE zl?xpABa#bv{LFH)IUSPS{5K-9A?{p_LL7S$!Bx^G7sM5@#7wV|Qb@F0Wc%BS>O$e9 zB(Cof#Zkt?@I5Zk$~V2k)5?w(DuZ^U-#CM30K|shyQU11F1d;ICrrol z6P_7Fc2a||(B4uTIAm0Gh++aUGBmW{seRw&UXPFpwH6@(0Vz=Z2Wjo!F2a8Iyt6di z^%Ccs-m)gHWV*bp{D2B*5RpbDfd~cFL4?61fCBW?2M8a;!GqH{m=SlPrL-;b7K*?u zEzMcyEsjNj3YMs~MN$+-cFd?Ic-CR2+u}j1O5s$#@P~MM#DRKH6jMuni=T>o7{E?l8wu zw*{w?1xx83{0~A~n!#sP1YEsY&rzNcgl~nRQ%RgU;E)DUJ~RK)*?ACjm9MQn_DhKDok6 zvF6(5V$|ZsGm6kshJ~^>Wt1VhFitFY!Xh3?XyM_9gYlvV@@L}!EbZ+Cvc0URVypPc zVyif6?|K#UzF)0liC?UKNi=9$F%F=8(yM|DIX$eGCqQd3^slQ}-R%``WyFIE{+uG> z(gcz3=SE^N;?n!W*e|t{2&bXHPLIbeYCT7s;rq7ifhB5WH%|vM&N8kG+9GH^Blijh z{D8I4O6zWssRj(RsBzi`Aw?;){=M((#5~y4v^>F@<{o5fHx-g~l|>Y|rl5<8BZYcWt+fh+75CVbu5enxhdg;B zS8uzR^?19KPi)^m@aEX-Xkls><`b9u(!vjYSQTW;I@Cshh1iV%t&abG^Wm;uJfiCQ zKo$_<-rT`ELLBtNtYxI0o+g;5}Z<-WB!e^q9=7I@Z$hA?}Ge1+_0ZljRpD2ub4x14Mz zs7Ucar1@!l0-|Inr6`w7SahQ)8VqQJOGT!OSVFam+PtvKaYH{a>oG$`3y zMAJ%f@crm8;m;>#Ov{-XMY^7I8`aY!oXkuz-73AQipx#2XCxh3$dJxF9p~rK3ahQi?VPCCNpUK2z1|1{~C=jNsdCcTxe&jfy znt}=LFkqw81hQfG1W>h*HB$a0cs!;;7-FeND(S0Zg{h~A^|Pd|JNignb+El_m__!fl2 z+Qw*S$5TPf&5|o`e&)}J&&5L|e%}Qz7H62tuNO0047f6u>LP-m;Vi|uj6G@jQE^pE zs+;gc`@mH?One2m(?J@N*!T*;K~PHjQ0x_vq=|N~EO4bd1Y8rb!UnI-;27$xy7?sR zey1?cV&Oet0hoR>`7Z=2HnkmW~*tApcum_s%BG zL$t$I!c`*aW)eB?1o9`Y8=s}7ufvcbp1 zubAR>eS(8}qlihCh7CeFgkq>KjA$_CO-KS&tOy1&D|HdB#^pLDa6eLYII1|W^%^3fZmmW+cU%|O@fZhQHglOrY=~QiDD-A{L(!joMUy?i{di-Wt%SbW;usj$Zw~C=kWj*P8Pxo1jB;w z?hT2c^q$5xJ#WiHHom=Wt45b`{O9oFWS4o7dKpbGzyj9KlYedl;Jw^q#TsRn!yZUo$%Vf7B9h4YgHnTY9M-UJZk?{K6;Cm;FVxW{htB)QqiR?#>r-XUN-w1j26pdz zXWR&lUJRIwjXnm9MiTP0K6$$`_-~_m#(225n}3IP&ZMr-FtNCpF{e;ZKQ-e!-f$0F zrEn?pi1q;C5(>lCFwQCZSb(9+6YqhNVx;2jR)K5EJ6qCqG$%;-c{`EaDCG05HJ9|! zmk#k(LL^zdEpeGNmIB$M0}GXJ4nECG<7i8C8xyeE3uc7{-a_)H2|3v}KZ*Ur8_Wa9 zor#E^{6w!7W-WDWRI#DGq3aoVrLkf?{9?w$bq^APuNED+7jWRnx{I4CO5WCJ$lzz7 zHnLnwM1O31N8AAK!N!EMe_b!>7Bs`cZ_z#X%D8Yi6b||2oOh0!<b_~5R!$;2kxcsIITT^RU^G~Pi_}lxBBYK07*XZ|rS1TJ z(vpT}U!Vhh2s)6hUe5BLdlX{4$%OYEc$@wFT^ToS-9N>m)nd3`@kFusikCNrb)~j< zLdT88w&;%iN{%2qLgIc!?sw#z+9?7#ZVhQgj@WMlzt-d6@r2ShY>v0w0V`6w!z>@v zPSaBJLldlq?gIUU>qZmf|kw*@C@A4IGmWgF}&U99xR~zeB_**D8O)qcgXP2 zV@u+V$ut~6#_@9o?f>b?&{0QiXUjx~)=?z-|3h@J%bqw7Lzrd0w$w!WT z2q(7WIs4h)CX)9{952RVq53ep(`bL@t?OxNJ?=Xt@zHJ&N(byV@RpI)i$7&mzNfHaRwbVn9q9~{9 zE<`zqXl+D6&&!owK6tN}@_g~?rZ=Zk>0P(*@CYd3Y9UZ-tNe+u|DEbp(FJuOHH~O8 zP@I|6!K2^0?fblEK1@VeL}5jS`nlkxo(Cn768>^za5XbCRXbzDjyWzNRd%)r*lH8T zv~X&;=$rwr>W)M6F=7w+$pGr1FtSabXmLN;(7FjvIISC=+7850IQ}lxb9f@Y9`)4(v? z!S}$knJ+s0`b!vwKe=w7nD5Hw1s2Sz_b&9rDb1adpk*0p`S|~GknJ1S*X-i1bxzzh zbRz_ob>t{u=%;YR53Z<$mz0LXe=-|-W#M5$GJ!O02#*COIx7f$Y6xA5!0R{+jg?%n zv9oCq%qC7%(cO@D?^ro4zeRC_UJFT`1IyN6-3T{w(TNp8HaXDix5hK+c|sj#5c?*7 z)Pp#rLiVjxQ(swxo$lo4OKBy2dC5h`r|$d11PS3D%##ZDa7#>5Y`34-m|&8dlRTFa zkt7FNGW&f}!t&_bUqOc@4u&XDeg(qM^feW_rG5SiHH~~z*4`LM@@QkiM{#|_=&I9O zaV>pSnU#i|sbI>BdZrV8gXK2aa}2(rNA0vaOuzYa=-3!78~1Uffqfbw`}Kb7vgTVAvYk_m!c|woPx# z;oQ(i_jORr9?CTjnmTc5F|NcIKQOL49@)mXdXpzuN;}*KoLFpKq9SoplDj4xt7@Hu zRnp89#SH~T6<5T&Da5`|9Sgj^u|!>!njWVgYqFZ1zlF%R>WNfq;fEqjl>d-TWr4si zs`y(iStaPun&V&W9HQ<_BN=N@VIK|8c_SC8vn2+9Hbs6yAa@8u@yQpav^PLAG=-ZX z>S| z)1UD@yv2xpBl*QmOs7BQhfD|cIRasV_#;8`u60mEYuZw^0e6Zge{{D#4))p$Uq=8w zQ#8LIqL1)bturpfbBk!!xuS@Tt95VQfeRWzl$T_CRnUzJ(n@5P9QH_`!hl&F%Uw2$$5xrg|YA zAosxu7#3bR#C%EMK#k#&!LD5T*(U<44bA!HHPYV27@tg5jX)6p z>Ciag6<4-9GJlimunzNDg>_>XX=7Ka%pR9-uC6Y0MY(qB8S+h5?uk=&&7~6Y738hV z-j?(=g1k!JhSDc$(<~yHf$z3x(NvW4ZM@QGrJ&{^ddk^m=f{PkTtLePkwez+_qS-5+mGxLRRa|BEPyr-P zFB_TBc1Tu^Di@A;CFSM@}5c4wSMEw4G-a+7F*HY$+#?UTn zn)I$BNL75_P*bFGgjn(6b4!N4sVNAuo);3_Bcz!e2{yvyfVOypHm z7h7+0Q%0}IwAdq=vu|+;Sr5CF+~Wu?#kPDByvr6h&~{U1Cx=6_8;oakt=iN27Cwg* zF1!%!=a>7+oQ|oq^DAQ4&$Xm|qY3Fh=*<=x`26KNg^tz7UoE;Q3r-AA4jN(_&h>oZ z22V}8Lo%~YYMe7#qhD?^@rPf*Z`td+!;brxHz$1PpFXc~wkEw;7j|d89Ei7QcHDoq zJ$rkXwcbE;2J-^gA~pnUc9H$(Hu3+RH5mOXIsG@zz<(Vvs~zj&sA2k;&`;D$L(0?n zksXok)ze6QBUu5WO!_tu2n0}XBAGu7%%Vx4<2G_d6S9=~T%~#LDpR#s?iQ9l2P%1a zE92{P_qqEfN8a}VEXUErWyv@MynCYKVB(4Iz&q#8!R5{U{Ina0Ba~lc#vcqdCz9w( zkOhgo%Af&?zUgJA8&A!Sl7ccfH~rk!Y^!Pj`enRZN97JP6(6<;E?WLln3}}}r9crpBED>xpqWg3=UtWLP&^z{^p_ahC7Rw7tz3 z#oRE2>Atgt5NCPdD7rDSGNsz}d?C?aJl4O*%?BZwo5^TOi$Mury3lHIaJ{Ydl|jtQ zW-e(fG7UiI*JW-Ab5dSlvd|cU(l{W6BD*Xq+nve?-abtU8Kq7ssYMbo-zONfJcx*IkSvFubJA6=28~V^^CZY%cW9YEg#0diCV% zB%99)q36QH)1m5?l3G)EBl{y`VQyPy@ZbXxs+iYx%*G~fTrzG#Gv6;7OL@V%RF!Ap zLAk7CMTWzaN^60LKvAoTCHSaIn{FI)HRxn(SW~5fWXh{8U2LCZ6?b$E=fDnenci&r zC1_1**l5%V=`n;fwaI5F=9H3T2OW|PdY+sQ`%7EG3U*GbXk9vL(?1^!W>^QQS-&1B ztyi9*?Q4|aN+3@LH$;exFStpl#Hgo5G7@W`FK{!fdQ7M@FzFz(KT%VQ-}@}(`+B}i zU&FsVljVocSa(nUoDKH&n!PZmSdc%uKdM|>Bl?2tK}Cu32L@nwz3~6lnf@r! zM}L2~(GB$)W5;TGg*JU$iXqN-c+JXXj_SZX1f?YHw-0>}(q|4QcEODFRp7e>FaLP- z;w4G>YHuC4>P84<|CjasMtO#liCo^ zY0hJ5iYOr{NgbclRCT*cfpb#4DVupU+s_a1gH9%D-amPx3;7@vEJaD2_(gTPVZv{t z4%{>Q;zxhqApxmZh!A58q|*9?j@KV@FJ=@U+Rq`{p|BIPWgq+snVqN$;{O3>80wQG zK3TZGQX*?tR+fTf31tg$qila}I3wyV71L1e8L?5sD^Y@xe^#_h=M1fyN^ zN8)cDSm_n7k;zAT{;;LgORSu@NCr_T{eqE@m$Z!=i46W9hZ}{04>{&{xo{8yrYB8f z&#BI`w1u!6F1FmvMn>m8iC@q-+Nq1%eC+eo5n@@c^~Cfnj)(Kyt6p)a=y z;Q~%c9@P;65}#?~e@buO&}@*wDoe7Y1FtK_;bdt3vc3gJ&pr7=Em0G@Z9}elWz+~= z14WFybXGKEz%T#YQ0LOs^USHgr>K4ho!dOc9!XxqEgs( z_T?66y$W0I6}Nri8{_&n%=n^B;&M+gZC{!2K4{5BY@-Rv+iHOar1k71n_-+DBy`*% z3r;9uF^ED-L<-lLL9!ny<8BMa^>R!wfg--vXT{PI>_OUYDnQ^5mEC{i-WXlSDj-;=LKdg zesdllPgSy-wnyTZbJf{Wag0hCkI44)osR$e#Q^-p!%qR#tP-7 z_rOGa?0RZn0!uwbd8#s&=!f@ zROV>B9%OFObFdYv=r{!myU8WFC3b95T(L&Olx@D3QZ@|i%Ab-uRbuH@;Y#{)phjJ` zaE=m?B!u8SP@S@Bwe4`4X(=rag=GO6D=4s8PTFiTHVg?gm-pYFpzrD^h=C^6tk3po zSI2E@X|qiiTsFFK66$Aa!$Yu47%Fo4rOEdnH2bfG*MA5UOO?fZnw@T@n!mvKg@s0v zH}i&lPMMf=BcnqIzbY3Kd=^RV^5Hz$yl8t&frec-C^xY(`g@NiII2%VS4E$8`Fy9f zR-P|~6h8)>^jGn7IxdlKQ5>hE4x04xMjsVcfR}gp5_brRET2MsL{1uVyyH|Kbp5Fe zlxM}bX-9@hub=KgT5$|c1J!2-Z9~uVPZ7eJGQY%SNP)xqiOgU3 z+ifY+PuCOD=v*DDn?sUkfuHg{@=A9{wNC`RjKW++>4ZPR%6{a{N|+3izHZdT2IAw` z_=kls__3-{xFmH!7-TC7Lobqy3;?eXxy@RPVK50-PM4e<1iLw~`&;tCeeERN`4y{5 zXIG%zOE%aEWKAfy)t5Yo%_H)F)X z*237(>3^X^&We|k>-&TfGz|tS?8PtNpMTN=nvUVTORNw{olk;sC&Zo1XdMCz0`(@T zMn?CW4DK#UIpdP>F3s6dCg1s&0BjCvG(kmvO6v57Q2( zVh%|crSI2B6Ok9dqmeG7gQ9V$LUhAQ_d5A+7DBlwh(dV$Rss!tCFi4Vq0n)wtCqr@ zu1t<~sHE;%=W(Gon~LGoRW>fLR6B7a3)ajT@ECnZEaCckeLqIoaRg+!LTJ`)aws#H zp7CR0%3tdjPi3T8Cq_=4@&;s22tk7>H6T0U!W5&G02f3cdqIseYQ=0{YyPwcr}Y+^ z)jgE_ke)3v9(HK)Aw5lm8mjccmAvfcofJ3pGzaf*@AMfk_i_H`JAJRa_opS)J8IIb z_;JbpPbk6DOBL2l%?lRuB5SOI$npb0=&@+%iuCeFKIwR~aU{rOvw|CvYW^_zJt0Ws z<_Kj10~(pkzoy?NGut|RJGy{-fUQyp;G>AFQ1UbaCqG!B=86#bj`5I9Lm90+#(ruZ z9~RGDF~!@EUPlb~%X5~5OPksYYato_oXkOQ;Y2!_jTrumT>LZ4u!6M0RH z5EESc?CTu1ScFR(yAn}2@&{IIV*_Yg@6lGV+?j=^7$;Gg5RYcgSbz8C`eq+>PYOy$ zJ83<3W4c;UDODP{du4UE(fsh6?nDz|Fy&kzkq?Dpxi|yz!)hpgyTFpx)n-2RRYUkJ zoC2p7ZdFY)wQyClj{Ro06L6+;Y56t?9M8k7Wvkk`bfSJJbMf7dwGf;)TMFYJ!lv?f z>ao(Okdqvr=s#tvm_kWX?Hks8G)AR%3>c$k?1G*LJtMIz?z(RL!q%OaM(;!mHc6Au zU1kRONtdq)UCw8DqWSiYT^9bWUk#w21O!+L|DU@0zxezC0U!U&<-hly!5@fLjA+b1NfS2V+BHb33O$s{%;TQcX=v|Dv9hk)*9>ondDA#{2;gkpcl}`P7z# z2B`VlW64Vae?a-|?oa3dEBoDMjsUu1pKiY;Q9^rk3tE! z{eP>;2*^r^iYO`5$%wv3_^rmj8wLa|{;6aE?thah_@^2G{-HmW-hb8jm$1P;Ww3A6od` zUwaSd?kAm}2Y?v^T)&ZI|526!=Kc?Gfaf)JFm`m52B^Io+x%OA;ypa2M`3>lpew^* zf6s;Z1AY|qZ{YzH+*Zzx04^C(b1P#3Lqk9dGWs_9rvI&htlLpg4?u?p13LUSMZiDG z0>R%lAm*SCP)}6>Fjb1%S{qB-+FCl>{e9PvZ4aY80Bo)U&=G(bvOkp!fUW#Z*ZdBx z1~5E;QtNNF_xHGuI~e=r0JK%WMf4|BAfPq6zr~gKx7GbU9``Cak1xQw*b(024blHS zo{giEzLnK~v*BOHH&%3jX~l>d2#DY>&ldzp@%x+q8^8ec8{XeP-9eLe z{$J28rT!L8+Sc^HzU@GBexQ25pjQQWVH|$}%aZ+DFnNG>i-4n}v9$p}F_%Qz)==L{ z7+|mt<_6Ax@Vvh_+V^tze>7Ai|Nq^}-*>}%o!>t&fzO6ZBt23g4r?*WLL8)z|!gQsH?I_!|Jg%KoqXrnK`% z*#H3k$!LFz{d`~fz3$E*mEkP@qw>F{PyV|*_#XbfmdYRSsaF3L{(o6Yyl?2e;=vyc zeYXFPhW_;Y|3&}cJ^Xv>{y*R^9sUXaowxiR_B~_$AFv8e{{;KzZHV`n?^%ogz|8ab zC(PdyGydDm_?{p5|Ec8cRTBuJD7=ktkw-{nV;#0k5o;S?!9D>&LLkM0AP6Feg`f{0 zDQpB`k<`JrvB<<-J;OKd%+1!z`DQP}{M_XnsTQvW)#kKd4xjO+0(FK~P*t8f?34gT zNeb{dG5{jMk|Z%xPNd?)Kr$uFk;z0bG4oFYGnNlV6q8Vd`WhQhkz5p#m^vZSc48n^ z)8XlE1_e=c^$WG1no(|j8Tc`PgwP}{$Z2MV1V$=SXvP)gXKtqW)?5PUcJu&?e*#h! zqs>gH(jDQk$9cz8;-w$cc*dE1}qLepfsBCXA@(bAJ66ft0aCq$Wrcq)WXX{0nm+#w=uBj1o9rLyA i;x|p)^~-yfPOPa3(|vBayXKz \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/spring-boot/profiles/gradlew.bat b/spring-boot/profiles/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/spring-boot/profiles/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/spring-boot/profiles/settings.gradle b/spring-boot/profiles/settings.gradle new file mode 100644 index 0000000..19868c9 --- /dev/null +++ b/spring-boot/profiles/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'profiles' diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BarBean.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BarBean.java new file mode 100644 index 0000000..838cd56 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BarBean.java @@ -0,0 +1,18 @@ +package io.reflectoring.profiles; + +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +class BarBean { + + private static final Logger logger = LoggerFactory.getLogger(BarBean.class); + + @PostConstruct + void postConstruct(){ + logger.info("loaded BarBean!"); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BaseConfiguration.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BaseConfiguration.java new file mode 100644 index 0000000..e9e6f1d --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BaseConfiguration.java @@ -0,0 +1,36 @@ +package io.reflectoring.profiles; + +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +class BaseConfiguration { + + private static final Logger logger = LoggerFactory.getLogger(BaseConfiguration.class); + + @PostConstruct + void postConstruct() { + logger.info("loaded BaseConfiguration!"); + } + + @Bean + @Profile("bar") + BarBean barBean() { + return new BarBean(); + } + + @Profile("local") + OutputPort mockedOutputPort(){ + return new MockedOutputPort(); + } + + @Profile("!local") + OutputPort realOutputPort(){ + return new RealOutputPort(); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BazBean.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BazBean.java new file mode 100644 index 0000000..0f0bb15 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/BazBean.java @@ -0,0 +1,20 @@ +package io.reflectoring.profiles; + +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +@Component +@Profile("baz") +class BazBean { + + private static final Logger logger = LoggerFactory.getLogger(BazBean.class); + + @PostConstruct + void postConstruct(){ + logger.info("loaded BazBean!"); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/DefaultBean.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/DefaultBean.java new file mode 100644 index 0000000..03a5b03 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/DefaultBean.java @@ -0,0 +1,20 @@ +package io.reflectoring.profiles; + +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +@Component +@Profile("default") +class DefaultBean { + + private static final Logger logger = LoggerFactory.getLogger(DefaultBean.class); + + @PostConstruct + void postConstruct(){ + logger.info("loaded DefaultBean!"); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/FooBean.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/FooBean.java new file mode 100644 index 0000000..3bcf97c --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/FooBean.java @@ -0,0 +1,22 @@ +package io.reflectoring.profiles; + +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +@Component +@Profile("foo") +@ConditionalOnProperty(value = "mock.enabled", havingValue = "false", matchIfMissing = true) +class FooBean { + + private static final Logger logger = LoggerFactory.getLogger(FooBean.class); + + @PostConstruct + void postConstruct(){ + logger.info("loaded FooBean!"); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/FooConfiguration.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/FooConfiguration.java new file mode 100644 index 0000000..8aae647 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/FooConfiguration.java @@ -0,0 +1,20 @@ +package io.reflectoring.profiles; + +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("foo") +public class FooConfiguration { + + private static final Logger logger = LoggerFactory.getLogger(FooConfiguration.class); + + @PostConstruct + void postConstruct(){ + logger.info("loaded FooConfiguration!"); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/HelloBean.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/HelloBean.java new file mode 100644 index 0000000..f12e191 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/HelloBean.java @@ -0,0 +1,17 @@ +package io.reflectoring.profiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +class HelloBean { + + private static final Logger logger = LoggerFactory.getLogger(HelloBean.class); + + HelloBean(@Value("${helloMessage}") String helloMessage) { + logger.info(helloMessage); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/MasterConfiguration.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/MasterConfiguration.java new file mode 100644 index 0000000..f22fdd4 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/MasterConfiguration.java @@ -0,0 +1,10 @@ +package io.reflectoring.profiles; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("master") +public class MasterConfiguration { + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/MockedOutputPort.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/MockedOutputPort.java new file mode 100644 index 0000000..d2aebc8 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/MockedOutputPort.java @@ -0,0 +1,5 @@ +package io.reflectoring.profiles; + +public class MockedOutputPort implements OutputPort { + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/OutputPort.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/OutputPort.java new file mode 100644 index 0000000..79e7530 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/OutputPort.java @@ -0,0 +1,5 @@ +package io.reflectoring.profiles; + +public interface OutputPort { + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/ProfileScannerBean.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/ProfileScannerBean.java new file mode 100644 index 0000000..016ebea --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/ProfileScannerBean.java @@ -0,0 +1,28 @@ +package io.reflectoring.profiles; + +import java.util.Arrays; +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +@Component +class ProfileScannerBean { + + private static final Logger logger = LoggerFactory.getLogger(ProfileScannerBean.class); + + private Environment environment; + + ProfileScannerBean(Environment environment) { + this.environment = environment; + } + + @PostConstruct + void postConstruct(){ + String[] activeProfiles = environment.getActiveProfiles(); + logger.info("the following profiles are active: {}", Arrays.toString(activeProfiles)); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/ProfilesApplication.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/ProfilesApplication.java new file mode 100644 index 0000000..05827cb --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/ProfilesApplication.java @@ -0,0 +1,15 @@ +package io.reflectoring.profiles; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProfilesApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(ProfilesApplication.class); + application.setAdditionalProfiles("baz"); + application.run(args); + } + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/RealOutputPort.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/RealOutputPort.java new file mode 100644 index 0000000..8a5e284 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/RealOutputPort.java @@ -0,0 +1,5 @@ +package io.reflectoring.profiles; + +public class RealOutputPort implements OutputPort { + +} diff --git a/spring-boot/profiles/src/main/java/io/reflectoring/profiles/WorkerConfiguration.java b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/WorkerConfiguration.java new file mode 100644 index 0000000..0c41ba9 --- /dev/null +++ b/spring-boot/profiles/src/main/java/io/reflectoring/profiles/WorkerConfiguration.java @@ -0,0 +1,10 @@ +package io.reflectoring.profiles; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("worker") +public class WorkerConfiguration { + +} diff --git a/spring-boot/profiles/src/main/resources/application-foo.yml b/spring-boot/profiles/src/main/resources/application-foo.yml new file mode 100644 index 0000000..abec02a --- /dev/null +++ b/spring-boot/profiles/src/main/resources/application-foo.yml @@ -0,0 +1 @@ +helloMessage: "Hello Foo!" \ No newline at end of file diff --git a/spring-boot/profiles/src/main/resources/application-local.yml b/spring-boot/profiles/src/main/resources/application-local.yml new file mode 100644 index 0000000..b7adf63 --- /dev/null +++ b/spring-boot/profiles/src/main/resources/application-local.yml @@ -0,0 +1,4 @@ +helloMessage: "Hello Local!" + +database-url: "localhost:1234" +mock.enabled: true diff --git a/spring-boot/profiles/src/main/resources/application-prod.yml b/spring-boot/profiles/src/main/resources/application-prod.yml new file mode 100644 index 0000000..5e3f538 --- /dev/null +++ b/spring-boot/profiles/src/main/resources/application-prod.yml @@ -0,0 +1,4 @@ +helloMessage: "Hello Prod!" + +database-url: "path-to-the-real-db:1234" +mock.enabled: false diff --git a/spring-boot/profiles/src/main/resources/application.yml b/spring-boot/profiles/src/main/resources/application.yml new file mode 100644 index 0000000..3aa2e3a --- /dev/null +++ b/spring-boot/profiles/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring.profiles.active: foo +helloMessage: "Hello Default!" + +database-url: "INVALID!" +mock.enabled: false \ No newline at end of file diff --git a/spring-boot/profiles/src/test/java/io/reflectoring/profiles/FooBarProfileTest.java b/spring-boot/profiles/src/test/java/io/reflectoring/profiles/FooBarProfileTest.java new file mode 100644 index 0000000..8bc9331 --- /dev/null +++ b/spring-boot/profiles/src/test/java/io/reflectoring/profiles/FooBarProfileTest.java @@ -0,0 +1,15 @@ +package io.reflectoring.profiles; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest +@ActiveProfiles({"foo", "bar"}) +class FooBarProfileTest { + + @Test + void test() { + } + +} diff --git a/spring-boot/profiles/src/test/java/io/reflectoring/profiles/FooProfileTest.java b/spring-boot/profiles/src/test/java/io/reflectoring/profiles/FooProfileTest.java new file mode 100644 index 0000000..54dfdba --- /dev/null +++ b/spring-boot/profiles/src/test/java/io/reflectoring/profiles/FooProfileTest.java @@ -0,0 +1,15 @@ +package io.reflectoring.profiles; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest +@ActiveProfiles({"foo"}) +class FooProfileTest { + + @Test + void test() { + } + +} From 9e9b030c3f1c94cb1014b7ae4200bfc1bc490695 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Tue, 31 Dec 2019 08:47:14 +1100 Subject: [PATCH 02/10] add README --- spring-boot/profiles/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 spring-boot/profiles/README.md diff --git a/spring-boot/profiles/README.md b/spring-boot/profiles/README.md new file mode 100644 index 0000000..cb9caf7 --- /dev/null +++ b/spring-boot/profiles/README.md @@ -0,0 +1,5 @@ +# Spring Boot Profiles Examples + +## Related Blog Articles + +* [One-Stop Guide to Spring Profiles](https://reflectoring.io/spring-boot-profiles/) \ No newline at end of file From 34615492636908a05b4b356e621a30bb34dbe047 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Thu, 23 Jan 2020 06:59:18 +1100 Subject: [PATCH 03/10] AWS Hello World docker file --- aws/aws-hello-world/.gitignore | 32 ++++ aws/aws-hello-world/Dockerfile | 4 + aws/aws-hello-world/build.gradle | 24 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 56177 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + aws/aws-hello-world/gradlew | 172 ++++++++++++++++++ aws/aws-hello-world/gradlew.bat | 84 +++++++++ aws/aws-hello-world/settings.gradle | 1 + .../AwsHelloWorldApplication.java | 13 ++ .../awshelloworld/HelloWorldController.java | 14 ++ .../src/main/resources/application.properties | 1 + .../AwsHelloWorldApplicationTests.java | 13 ++ 12 files changed, 363 insertions(+) create mode 100644 aws/aws-hello-world/.gitignore create mode 100644 aws/aws-hello-world/Dockerfile create mode 100644 aws/aws-hello-world/build.gradle create mode 100644 aws/aws-hello-world/gradle/wrapper/gradle-wrapper.jar create mode 100644 aws/aws-hello-world/gradle/wrapper/gradle-wrapper.properties create mode 100644 aws/aws-hello-world/gradlew create mode 100644 aws/aws-hello-world/gradlew.bat create mode 100644 aws/aws-hello-world/settings.gradle create mode 100644 aws/aws-hello-world/src/main/java/io/reflectoring/awshelloworld/AwsHelloWorldApplication.java create mode 100644 aws/aws-hello-world/src/main/java/io/reflectoring/awshelloworld/HelloWorldController.java create mode 100644 aws/aws-hello-world/src/main/resources/application.properties create mode 100644 aws/aws-hello-world/src/test/java/io/reflectoring/awshelloworld/AwsHelloWorldApplicationTests.java diff --git a/aws/aws-hello-world/.gitignore b/aws/aws-hello-world/.gitignore new file mode 100644 index 0000000..6c01878 --- /dev/null +++ b/aws/aws-hello-world/.gitignore @@ -0,0 +1,32 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/aws/aws-hello-world/Dockerfile b/aws/aws-hello-world/Dockerfile new file mode 100644 index 0000000..07400c4 --- /dev/null +++ b/aws/aws-hello-world/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:8-jdk-alpine +ARG JAR_FILE=build/libs/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/aws/aws-hello-world/build.gradle b/aws/aws-hello-world/build.gradle new file mode 100644 index 0000000..7985e86 --- /dev/null +++ b/aws/aws-hello-world/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'org.springframework.boot' version '2.2.4.RELEASE' + id 'io.spring.dependency-management' version '1.0.9.RELEASE' + id 'java' +} + +group = 'io.reflectoring' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '1.8' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } +} + +test { + useJUnitPlatform() +} diff --git a/aws/aws-hello-world/gradle/wrapper/gradle-wrapper.jar b/aws/aws-hello-world/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..29953ea141f55e3b8fc691d31b5ca8816d89fa87 GIT binary patch literal 56177 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 i;x|p)^~-yfPOPa3(|vBayXKz \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/aws/aws-hello-world/gradlew.bat b/aws/aws-hello-world/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/aws/aws-hello-world/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/aws/aws-hello-world/settings.gradle b/aws/aws-hello-world/settings.gradle new file mode 100644 index 0000000..6fefad1 --- /dev/null +++ b/aws/aws-hello-world/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'aws-hello-world' diff --git a/aws/aws-hello-world/src/main/java/io/reflectoring/awshelloworld/AwsHelloWorldApplication.java b/aws/aws-hello-world/src/main/java/io/reflectoring/awshelloworld/AwsHelloWorldApplication.java new file mode 100644 index 0000000..772e434 --- /dev/null +++ b/aws/aws-hello-world/src/main/java/io/reflectoring/awshelloworld/AwsHelloWorldApplication.java @@ -0,0 +1,13 @@ +package io.reflectoring.awshelloworld; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AwsHelloWorldApplication { + + public static void main(String[] args) { + SpringApplication.run(AwsHelloWorldApplication.class, args); + } + +} diff --git a/aws/aws-hello-world/src/main/java/io/reflectoring/awshelloworld/HelloWorldController.java b/aws/aws-hello-world/src/main/java/io/reflectoring/awshelloworld/HelloWorldController.java new file mode 100644 index 0000000..b155b06 --- /dev/null +++ b/aws/aws-hello-world/src/main/java/io/reflectoring/awshelloworld/HelloWorldController.java @@ -0,0 +1,14 @@ +package io.reflectoring.awshelloworld; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloWorldController { + + @GetMapping("/hello") + public String helloWorld(){ + return "Hello AWS!"; + } + +} diff --git a/aws/aws-hello-world/src/main/resources/application.properties b/aws/aws-hello-world/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/aws/aws-hello-world/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/aws/aws-hello-world/src/test/java/io/reflectoring/awshelloworld/AwsHelloWorldApplicationTests.java b/aws/aws-hello-world/src/test/java/io/reflectoring/awshelloworld/AwsHelloWorldApplicationTests.java new file mode 100644 index 0000000..41138d1 --- /dev/null +++ b/aws/aws-hello-world/src/test/java/io/reflectoring/awshelloworld/AwsHelloWorldApplicationTests.java @@ -0,0 +1,13 @@ +package io.reflectoring.awshelloworld; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AwsHelloWorldApplicationTests { + + @Test + void contextLoads() { + } + +} From 3fb809911af16e2f058b6796aeccd4727b54b7aa Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Thu, 30 Jan 2020 21:35:03 +1100 Subject: [PATCH 04/10] Reactive Batch Processing Example --- reactive/build.gradle | 25 +++ reactive/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54711 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + reactive/gradlew | 172 ++++++++++++++++++ reactive/gradlew.bat | 84 +++++++++ .../reflectoring/reactive/batch/Logger.java | 9 + .../reflectoring/reactive/batch/Message.java | 19 ++ .../reactive/batch/MessageBatch.java | 24 +++ .../reactive/batch/MessageHandler.java | 34 ++++ .../batch/ReactiveBatchProcessor.java | 94 ++++++++++ .../ReactiveBatchProcessorTest.java | 25 +++ 11 files changed, 491 insertions(+) create mode 100644 reactive/build.gradle create mode 100644 reactive/gradle/wrapper/gradle-wrapper.jar create mode 100644 reactive/gradle/wrapper/gradle-wrapper.properties create mode 100644 reactive/gradlew create mode 100644 reactive/gradlew.bat create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/Logger.java create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/Message.java create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/MessageBatch.java create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java create mode 100644 reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java diff --git a/reactive/build.gradle b/reactive/build.gradle new file mode 100644 index 0000000..305bb7a --- /dev/null +++ b/reactive/build.gradle @@ -0,0 +1,25 @@ +buildscript { + repositories { + mavenCentral() + } +} + +apply plugin: 'java' + +version = '0.0.1-SNAPSHOT' +sourceCompatibility = 11 + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile 'io.reactivex.rxjava2:rxjava:2.2.17' + testCompile 'org.junit.jupiter:junit-jupiter-engine:5.0.1' + testCompile 'org.awaitility:awaitility:3.0.0' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/reactive/gradle/wrapper/gradle-wrapper.jar b/reactive/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1a958be6420a4dd04b588fe4b31eb5d7ff8748c2 GIT binary patch literal 54711 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/reactive/gradlew.bat b/reactive/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/reactive/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/Logger.java b/reactive/src/main/java/io/reflectoring/reactive/batch/Logger.java new file mode 100644 index 0000000..cd89b3b --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/Logger.java @@ -0,0 +1,9 @@ +package io.reflectoring.reactive.batch; + +public class Logger { + + public void log(String string) { + System.out.println(String.format("%s %s: %s", System.currentTimeMillis(), Thread.currentThread().getName(), string)); + } + +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/Message.java b/reactive/src/main/java/io/reflectoring/reactive/batch/Message.java new file mode 100644 index 0000000..5dffd9d --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/Message.java @@ -0,0 +1,19 @@ +package io.reflectoring.reactive.batch; + +public class Message { + + private final String content; + + public Message(String content) { + this.content = content; + } + + public String getContent() { + return content; + } + + @Override + public String toString() { + return content; + } +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageBatch.java b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageBatch.java new file mode 100644 index 0000000..3484192 --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageBatch.java @@ -0,0 +1,24 @@ +package io.reflectoring.reactive.batch; + +import java.util.Collections; +import java.util.List; + +public class MessageBatch { + + private final List messages; + + public MessageBatch(List messages) { + this.messages = messages; + } + + public List getMessages() { + return Collections.unmodifiableList(messages); + } + + @Override + public String toString() { + return "MessageBatch{" + + "messages=" + messages + + '}'; + } +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java new file mode 100644 index 0000000..66920f7 --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java @@ -0,0 +1,34 @@ +package io.reflectoring.reactive.batch; + +import io.reactivex.Single; +import java.util.concurrent.atomic.AtomicInteger; + +public class MessageHandler { + + private final AtomicInteger processedMessages = new AtomicInteger(); + + private Logger logger = new Logger(); + + enum Result { + SUCCESS, + FAILURE + } + + public Single handleMessage(Message message){ + sleep(500); + logger.log(String.format("processed message %s", message)); + return Single.just(Result.SUCCESS); + } + + private void sleep(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + public AtomicInteger getProcessedMessages() { + return processedMessages; + } +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java new file mode 100644 index 0000000..319e5ce --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java @@ -0,0 +1,94 @@ +package io.reflectoring.reactive.batch; + +import io.reactivex.Flowable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; +import io.reflectoring.reactive.batch.MessageHandler.Result; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +public class ReactiveBatchProcessor { + + private final static Logger logger = new Logger(); + + private final int MESSAGE_BATCHES = 10; + + private final int BATCH_SIZE = 3; + + private final int THREADS = 4; + + private final MessageHandler messageHandler = new MessageHandler(); + + public void start() { + retrieveMessageBatches() + .doOnNext(batch -> logger.log(batch.toString())) + .flatMap(batch -> Flowable.fromIterable(batch.getMessages())) + .flatMapSingle(message -> messageHandler.handleMessage(message) + .subscribeOn(threadPoolScheduler(THREADS, 10))) + .subscribeWith(subscriber()); + } + + private Subscriber subscriber() { + return new Subscriber<>() { + private Subscription subscription; + + @Override + public void onSubscribe(Subscription subscription) { + this.subscription = subscription; + subscription.request(THREADS); + logger.log("subscribed"); + } + + @Override + public void onNext(Result message) { + subscription.request(THREADS); + } + + @Override + public void onError(Throwable t) { + logger.log("error"); + } + + @Override + public void onComplete() { + logger.log("completed"); + } + }; + } + + private Scheduler threadPoolScheduler(int poolSize, int queueSize) { + return Schedulers.from(new ThreadPoolExecutor( + poolSize, + poolSize, + 0L, + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(queueSize) + )); + } + + public boolean allMessagesProcessed() { + return this.messageHandler.getProcessedMessages().get() == MESSAGE_BATCHES * BATCH_SIZE; + } + + private Flowable retrieveMessageBatches() { + return Flowable.range(1, MESSAGE_BATCHES) + .map(this::messageBatch); + } + + private MessageBatch messageBatch(int batchNumber) { + List messages = new ArrayList<>(); + for (int i = 1; i <= BATCH_SIZE; i++) { + messages.add(new Message(String.format("%d-%d", batchNumber, i))); + } + return new MessageBatch(messages); + } + + +} diff --git a/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java b/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java new file mode 100644 index 0000000..189ea7d --- /dev/null +++ b/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java @@ -0,0 +1,25 @@ +package io.reflectoring; + +import static org.awaitility.Awaitility.await; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import io.reflectoring.reactive.batch.ReactiveBatchProcessor; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.Test; + +public class ReactiveBatchProcessorTest { + + @Test + public void test() { + ReactiveBatchProcessor processor = new ReactiveBatchProcessor(); + + processor.start(); + + await() + .atMost(10, TimeUnit.SECONDS) + .pollInterval(1, TimeUnit.SECONDS) + .untilAsserted(() -> assertTrue(processor.allMessagesProcessed())); + + } + +} From 5fe5deca66e4127b940b2d80ce13fefa05c1137c Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Fri, 31 Jan 2020 09:18:02 +1100 Subject: [PATCH 05/10] added Single.defer to fan out messages over multiple threads --- aws/aws-hello-world/gradlew | 0 aws/aws-hello-world/gradlew.bat | 0 .../reactive/batch/MessageHandler.java | 46 +++--- .../batch/ReactiveBatchProcessor.java | 141 +++++++++--------- .../batch/RetryRejectedExecutionHandler.java | 18 +++ 5 files changed, 115 insertions(+), 90 deletions(-) mode change 100644 => 100755 aws/aws-hello-world/gradlew mode change 100644 => 100755 aws/aws-hello-world/gradlew.bat create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/RetryRejectedExecutionHandler.java diff --git a/aws/aws-hello-world/gradlew b/aws/aws-hello-world/gradlew old mode 100644 new mode 100755 diff --git a/aws/aws-hello-world/gradlew.bat b/aws/aws-hello-world/gradlew.bat old mode 100644 new mode 100755 diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java index 66920f7..eceb1fc 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java @@ -1,34 +1,36 @@ package io.reflectoring.reactive.batch; import io.reactivex.Single; + import java.util.concurrent.atomic.AtomicInteger; public class MessageHandler { - private final AtomicInteger processedMessages = new AtomicInteger(); + private final AtomicInteger processedMessages = new AtomicInteger(); - private Logger logger = new Logger(); + private Logger logger = new Logger(); - enum Result { - SUCCESS, - FAILURE - } - - public Single handleMessage(Message message){ - sleep(500); - logger.log(String.format("processed message %s", message)); - return Single.just(Result.SUCCESS); - } - - private void sleep(long millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - throw new RuntimeException(e); + enum Result { + SUCCESS, + FAILURE } - } - public AtomicInteger getProcessedMessages() { - return processedMessages; - } + public Result handleMessage(Message message) { + logger.log(String.format("handling message %s", message)); + sleep(500); + this.processedMessages.getAndAdd(1); + return Result.SUCCESS; + } + + private void sleep(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + public Integer getProcessedMessages() { + return processedMessages.get(); + } } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java index 319e5ce..4b3e059 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java @@ -5,90 +5,95 @@ import io.reactivex.Scheduler; import io.reactivex.Single; import io.reactivex.schedulers.Schedulers; import io.reflectoring.reactive.batch.MessageHandler.Result; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + import java.util.ArrayList; import java.util.List; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; public class ReactiveBatchProcessor { - private final static Logger logger = new Logger(); + private final static Logger logger = new Logger(); - private final int MESSAGE_BATCHES = 10; + private final int MESSAGE_BATCHES = 10; - private final int BATCH_SIZE = 3; + private final int BATCH_SIZE = 3; - private final int THREADS = 4; + private final int THREADS = 4; - private final MessageHandler messageHandler = new MessageHandler(); + private final MessageHandler messageHandler = new MessageHandler(); - public void start() { - retrieveMessageBatches() - .doOnNext(batch -> logger.log(batch.toString())) - .flatMap(batch -> Flowable.fromIterable(batch.getMessages())) - .flatMapSingle(message -> messageHandler.handleMessage(message) - .subscribeOn(threadPoolScheduler(THREADS, 10))) - .subscribeWith(subscriber()); - } + public void start() { - private Subscriber subscriber() { - return new Subscriber<>() { - private Subscription subscription; + Scheduler threadPoolScheduler = threadPoolScheduler(THREADS, 10); - @Override - public void onSubscribe(Subscription subscription) { - this.subscription = subscription; - subscription.request(THREADS); - logger.log("subscribed"); - } - - @Override - public void onNext(Result message) { - subscription.request(THREADS); - } - - @Override - public void onError(Throwable t) { - logger.log("error"); - } - - @Override - public void onComplete() { - logger.log("completed"); - } - }; - } - - private Scheduler threadPoolScheduler(int poolSize, int queueSize) { - return Schedulers.from(new ThreadPoolExecutor( - poolSize, - poolSize, - 0L, - TimeUnit.SECONDS, - new LinkedBlockingDeque<>(queueSize) - )); - } - - public boolean allMessagesProcessed() { - return this.messageHandler.getProcessedMessages().get() == MESSAGE_BATCHES * BATCH_SIZE; - } - - private Flowable retrieveMessageBatches() { - return Flowable.range(1, MESSAGE_BATCHES) - .map(this::messageBatch); - } - - private MessageBatch messageBatch(int batchNumber) { - List messages = new ArrayList<>(); - for (int i = 1; i <= BATCH_SIZE; i++) { - messages.add(new Message(String.format("%d-%d", batchNumber, i))); + retrieveMessageBatches() + .doOnNext(batch -> logger.log(batch.toString())) + .flatMap(batch -> Flowable.fromIterable(batch.getMessages())) + .flatMapSingle(message -> Single.defer(() -> Single.just(messageHandler.handleMessage(message))) + .doOnSuccess(result -> logger.log("message handled")) + .subscribeOn(threadPoolScheduler)) + .subscribeWith(subscriber()); + } + + private Subscriber subscriber() { + return new Subscriber<>() { + private Subscription subscription; + + @Override + public void onSubscribe(Subscription subscription) { + this.subscription = subscription; + subscription.request(THREADS); + logger.log("subscribed"); + } + + @Override + public void onNext(Result message) { + subscription.request(THREADS); + } + + @Override + public void onError(Throwable t) { + logger.log("error"); + } + + @Override + public void onComplete() { + logger.log("completed"); + } + }; + } + + private Scheduler threadPoolScheduler(int poolSize, int queueSize) { + return Schedulers.from(new ThreadPoolExecutor( + poolSize, + poolSize, + 0L, + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(queueSize), + new RetryRejectedExecutionHandler() + )); + } + + public boolean allMessagesProcessed() { + return this.messageHandler.getProcessedMessages() == MESSAGE_BATCHES * BATCH_SIZE; + } + + private Flowable retrieveMessageBatches() { + return Flowable.range(1, MESSAGE_BATCHES) + .map(this::messageBatch); + } + + private MessageBatch messageBatch(int batchNumber) { + List messages = new ArrayList<>(); + for (int i = 1; i <= BATCH_SIZE; i++) { + messages.add(new Message(String.format("%d-%d", batchNumber, i))); + } + return new MessageBatch(messages); } - return new MessageBatch(messages); - } } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/RetryRejectedExecutionHandler.java b/reactive/src/main/java/io/reflectoring/reactive/batch/RetryRejectedExecutionHandler.java new file mode 100644 index 0000000..8f9429e --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/RetryRejectedExecutionHandler.java @@ -0,0 +1,18 @@ +package io.reflectoring.reactive.batch; + +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadPoolExecutor; + +public class RetryRejectedExecutionHandler implements RejectedExecutionHandler { + + @Override + public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) { + try { + threadPoolExecutor.getQueue().put(runnable); + } catch (InterruptedException e) { + throw new RejectedExecutionException(e); + } + } + +} From ec2bdc932703a155bc94cd6774cbd73d1e582d1d Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Fri, 31 Jan 2020 19:48:06 +1100 Subject: [PATCH 06/10] Reactive Batch Processing Example --- build-all.sh | 1 + reactive/build.gradle | 6 +- reactive/gradle/wrapper/gradle-wrapper.jar | Bin 54711 -> 56177 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- reactive/gradlew | 6 +- .../reactive/batch/MessageHandler.java | 36 +---- .../reactive/batch/MessageSource.java | 9 ++ .../batch/ReactiveBatchProcessor.java | 129 ++++++++---------- .../ReactiveBatchProcessorTest.java | 22 ++- .../io/reflectoring/TestMessageHandler.java | 43 ++++++ .../io/reflectoring/TestMessageSource.java | 43 ++++++ 11 files changed, 185 insertions(+), 112 deletions(-) create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/MessageSource.java create mode 100644 reactive/src/test/java/io/reflectoring/TestMessageHandler.java create mode 100644 reactive/src/test/java/io/reflectoring/TestMessageSource.java diff --git a/build-all.sh b/build-all.sh index f126a41..0009f7d 100644 --- a/build-all.sh +++ b/build-all.sh @@ -30,6 +30,7 @@ build_gradle_module() { chmod +x gradlew +build_gradle_module "reactive" build_gradle_module "junit/assumptions" build_gradle_module "logging" build_gradle_module "pact/pact-feign-consumer" diff --git a/reactive/build.gradle b/reactive/build.gradle index 305bb7a..2779c4c 100644 --- a/reactive/build.gradle +++ b/reactive/build.gradle @@ -15,9 +15,9 @@ repositories { } dependencies { - compile 'io.reactivex.rxjava2:rxjava:2.2.17' - testCompile 'org.junit.jupiter:junit-jupiter-engine:5.0.1' - testCompile 'org.awaitility:awaitility:3.0.0' + implementation 'io.reactivex.rxjava2:rxjava:2.2.17' + testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1' + testImplementation 'org.awaitility:awaitility:3.0.0' } test { diff --git a/reactive/gradle/wrapper/gradle-wrapper.jar b/reactive/gradle/wrapper/gradle-wrapper.jar index 1a958be6420a4dd04b588fe4b31eb5d7ff8748c2..29953ea141f55e3b8fc691d31b5ca8816d89fa87 100644 GIT binary patch delta 50150 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 Q?*&P$Fv3ap{Zsb;0FvA;7XSbN diff --git a/reactive/gradle/wrapper/gradle-wrapper.properties b/reactive/gradle/wrapper/gradle-wrapper.properties index 4c46317..9492014 100644 --- a/reactive/gradle/wrapper/gradle-wrapper.properties +++ b/reactive/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip diff --git a/reactive/gradlew b/reactive/gradlew index 4453cce..cccdd3d 100644 --- a/reactive/gradlew +++ b/reactive/gradlew @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -155,7 +155,7 @@ if $cygwin ; then fi # Escape application args -save ( ) { +save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java index eceb1fc..664477b 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java @@ -1,36 +1,12 @@ package io.reflectoring.reactive.batch; -import io.reactivex.Single; +public interface MessageHandler { -import java.util.concurrent.atomic.AtomicInteger; + enum Result { + SUCCESS, + FAILURE + } -public class MessageHandler { + Result handleMessage(Message message); - private final AtomicInteger processedMessages = new AtomicInteger(); - - private Logger logger = new Logger(); - - enum Result { - SUCCESS, - FAILURE - } - - public Result handleMessage(Message message) { - logger.log(String.format("handling message %s", message)); - sleep(500); - this.processedMessages.getAndAdd(1); - return Result.SUCCESS; - } - - private void sleep(long millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - public Integer getProcessedMessages() { - return processedMessages.get(); - } } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageSource.java b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageSource.java new file mode 100644 index 0000000..ddbefcb --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageSource.java @@ -0,0 +1,9 @@ +package io.reflectoring.reactive.batch; + +import io.reactivex.Flowable; + +public interface MessageSource { + + Flowable getMessageBatches(); + +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java index 4b3e059..8c0587b 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java @@ -5,95 +5,82 @@ import io.reactivex.Scheduler; import io.reactivex.Single; import io.reactivex.schedulers.Schedulers; import io.reflectoring.reactive.batch.MessageHandler.Result; -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; - -import java.util.ArrayList; -import java.util.List; +import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; public class ReactiveBatchProcessor { - private final static Logger logger = new Logger(); + private final static Logger logger = new Logger(); - private final int MESSAGE_BATCHES = 10; + private final int threads; - private final int BATCH_SIZE = 3; + private final MessageHandler messageHandler; - private final int THREADS = 4; + private final MessageSource messageSource; - private final MessageHandler messageHandler = new MessageHandler(); + public ReactiveBatchProcessor( + MessageSource messageSource, + MessageHandler messageHandler, + int threads) { + this.messageSource = messageSource; + this.threads = threads; + this.messageHandler = messageHandler; + } - public void start() { + public void start() { - Scheduler threadPoolScheduler = threadPoolScheduler(THREADS, 10); + Scheduler scheduler = threadPoolScheduler(threads, 10); - retrieveMessageBatches() - .doOnNext(batch -> logger.log(batch.toString())) - .flatMap(batch -> Flowable.fromIterable(batch.getMessages())) - .flatMapSingle(message -> Single.defer(() -> Single.just(messageHandler.handleMessage(message))) - .doOnSuccess(result -> logger.log("message handled")) - .subscribeOn(threadPoolScheduler)) - .subscribeWith(subscriber()); - } + messageSource.getMessageBatches() + .subscribeOn(Schedulers.from(Executors.newSingleThreadExecutor())) + .doOnNext(batch -> logger.log(batch.toString())) + .flatMap(batch -> Flowable.fromIterable(batch.getMessages())) + .flatMapSingle(m -> Single.defer(() -> Single.just(m) + .map(messageHandler::handleMessage)) + .subscribeOn(scheduler)) + .subscribeWith(subscriber()); + } - private Subscriber subscriber() { - return new Subscriber<>() { - private Subscription subscription; + private Subscriber subscriber() { + return new Subscriber<>() { + private Subscription subscription; - @Override - public void onSubscribe(Subscription subscription) { - this.subscription = subscription; - subscription.request(THREADS); - logger.log("subscribed"); - } + @Override + public void onSubscribe(Subscription subscription) { + this.subscription = subscription; + subscription.request(threads); + logger.log("subscribed"); + } - @Override - public void onNext(Result message) { - subscription.request(THREADS); - } + @Override + public void onNext(Result message) { + subscription.request(threads); + } - @Override - public void onError(Throwable t) { - logger.log("error"); - } + @Override + public void onError(Throwable t) { + logger.log("error"); + } - @Override - public void onComplete() { - logger.log("completed"); - } - }; - } - - private Scheduler threadPoolScheduler(int poolSize, int queueSize) { - return Schedulers.from(new ThreadPoolExecutor( - poolSize, - poolSize, - 0L, - TimeUnit.SECONDS, - new LinkedBlockingDeque<>(queueSize), - new RetryRejectedExecutionHandler() - )); - } - - public boolean allMessagesProcessed() { - return this.messageHandler.getProcessedMessages() == MESSAGE_BATCHES * BATCH_SIZE; - } - - private Flowable retrieveMessageBatches() { - return Flowable.range(1, MESSAGE_BATCHES) - .map(this::messageBatch); - } - - private MessageBatch messageBatch(int batchNumber) { - List messages = new ArrayList<>(); - for (int i = 1; i <= BATCH_SIZE; i++) { - messages.add(new Message(String.format("%d-%d", batchNumber, i))); - } - return new MessageBatch(messages); - } + @Override + public void onComplete() { + logger.log("completed"); + } + }; + } + private Scheduler threadPoolScheduler(int poolSize, int queueSize) { + return Schedulers.from(new ThreadPoolExecutor( + poolSize, + poolSize, + 0L, + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(queueSize) + )); + } } diff --git a/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java b/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java index 189ea7d..f859868 100644 --- a/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java +++ b/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java @@ -1,8 +1,9 @@ package io.reflectoring; import static org.awaitility.Awaitility.await; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import io.reflectoring.reactive.batch.MessageSource; import io.reflectoring.reactive.batch.ReactiveBatchProcessor; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; @@ -10,16 +11,29 @@ import org.junit.jupiter.api.Test; public class ReactiveBatchProcessorTest { @Test - public void test() { - ReactiveBatchProcessor processor = new ReactiveBatchProcessor(); + public void allMessagesAreProcessedOnMultipleThreads() { + + int batches = 3; + int batchSize = 4; + int threads = 5; + + MessageSource messageSource = new TestMessageSource(batches, batchSize); + TestMessageHandler messageHandler = new TestMessageHandler(); + + ReactiveBatchProcessor processor = new ReactiveBatchProcessor( + messageSource, + messageHandler, + threads + ); processor.start(); await() .atMost(10, TimeUnit.SECONDS) .pollInterval(1, TimeUnit.SECONDS) - .untilAsserted(() -> assertTrue(processor.allMessagesProcessed())); + .untilAsserted(() -> assertEquals(batches * batchSize, messageHandler.getProcessedMessages())); + assertEquals(threads, messageHandler.threadNames().size()); } } diff --git a/reactive/src/test/java/io/reflectoring/TestMessageHandler.java b/reactive/src/test/java/io/reflectoring/TestMessageHandler.java new file mode 100644 index 0000000..876216d --- /dev/null +++ b/reactive/src/test/java/io/reflectoring/TestMessageHandler.java @@ -0,0 +1,43 @@ +package io.reflectoring; + +import io.reflectoring.reactive.batch.Logger; +import io.reflectoring.reactive.batch.Message; +import io.reflectoring.reactive.batch.MessageHandler; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +public class TestMessageHandler implements MessageHandler { + + private final AtomicInteger processedMessages = new AtomicInteger(); + + private final AtomicReference> threadNames = new AtomicReference<>(new HashSet<>()); + + private Logger logger = new Logger(); + + @Override + public Result handleMessage(Message message) { + sleep(500); + logger.log(String.format("processed message %s", message)); + threadNames.get().add(Thread.currentThread().getName()); + processedMessages.addAndGet(1); + return Result.SUCCESS; + } + + private void sleep(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + public int getProcessedMessages() { + return processedMessages.get(); + } + + public Set threadNames() { + return threadNames.get(); + } +} diff --git a/reactive/src/test/java/io/reflectoring/TestMessageSource.java b/reactive/src/test/java/io/reflectoring/TestMessageSource.java new file mode 100644 index 0000000..5ea417b --- /dev/null +++ b/reactive/src/test/java/io/reflectoring/TestMessageSource.java @@ -0,0 +1,43 @@ +package io.reflectoring; + +import io.reactivex.Flowable; +import io.reflectoring.reactive.batch.Message; +import io.reflectoring.reactive.batch.MessageBatch; +import io.reflectoring.reactive.batch.MessageSource; +import java.util.ArrayList; +import java.util.List; + +public class TestMessageSource implements MessageSource { + + private final int batches; + + private final int batchSize; + + /** + * Constructor. + * + * @param batches the number of message batches to produce. + * @param batchSize the number of messages per batch. + */ + public TestMessageSource(int batches, int batchSize) { + this.batches = batches; + this.batchSize = batchSize; + } + + /** + * Generates a limited number of {@link MessageBatch}es. + */ + public Flowable getMessageBatches() { + return Flowable.range(1, batches) + .map(this::messageBatch); + } + + private MessageBatch messageBatch(int batchNumber) { + List messages = new ArrayList<>(); + for (int i = 1; i <= batchSize; i++) { + messages.add(new Message(String.format("%d-%d", batchNumber, i))); + } + return new MessageBatch(messages); + } + +} From b6d167f4ae8f6cb4551bb26420e03e790b2dc3f6 Mon Sep 17 00:00:00 2001 From: thombergs Date: Sun, 2 Feb 2020 06:45:58 +1100 Subject: [PATCH 07/10] finished reactive example --- .../batch/ReactiveBatchProcessor.java | 44 +++----------- .../batch/ReactiveBatchProcessorV1.java | 55 ++++++++++++++++++ .../batch/ReactiveBatchProcessorV2.java | 55 ++++++++++++++++++ .../batch/ReactiveBatchProcessorV3.java | 57 +++++++++++++++++++ .../reactive/batch/SimpleSubscriber.java | 42 ++++++++++++++ ...andler.java => WaitForCapacityPolicy.java} | 2 +- .../ReactiveBatchProcessorTest.java | 14 +++-- 7 files changed, 228 insertions(+), 41 deletions(-) create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java create mode 100644 reactive/src/main/java/io/reflectoring/reactive/batch/SimpleSubscriber.java rename reactive/src/main/java/io/reflectoring/reactive/batch/{RetryRejectedExecutionHandler.java => WaitForCapacityPolicy.java} (85%) diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java index 8c0587b..c833878 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java @@ -4,13 +4,10 @@ import io.reactivex.Flowable; import io.reactivex.Scheduler; import io.reactivex.Single; import io.reactivex.schedulers.Schedulers; -import io.reflectoring.reactive.batch.MessageHandler.Result; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; public class ReactiveBatchProcessor { @@ -18,6 +15,8 @@ public class ReactiveBatchProcessor { private final int threads; + private final int threadPoolQueueSize; + private final MessageHandler messageHandler; private final MessageSource messageSource; @@ -25,15 +24,17 @@ public class ReactiveBatchProcessor { public ReactiveBatchProcessor( MessageSource messageSource, MessageHandler messageHandler, - int threads) { + int threads, + int threadPoolQueueSize) { this.messageSource = messageSource; this.threads = threads; this.messageHandler = messageHandler; + this.threadPoolQueueSize = threadPoolQueueSize; } public void start() { - Scheduler scheduler = threadPoolScheduler(threads, 10); + Scheduler scheduler = threadPoolScheduler(threads, threadPoolQueueSize); messageSource.getMessageBatches() .subscribeOn(Schedulers.from(Executors.newSingleThreadExecutor())) @@ -42,35 +43,7 @@ public class ReactiveBatchProcessor { .flatMapSingle(m -> Single.defer(() -> Single.just(m) .map(messageHandler::handleMessage)) .subscribeOn(scheduler)) - .subscribeWith(subscriber()); - } - - private Subscriber subscriber() { - return new Subscriber<>() { - private Subscription subscription; - - @Override - public void onSubscribe(Subscription subscription) { - this.subscription = subscription; - subscription.request(threads); - logger.log("subscribed"); - } - - @Override - public void onNext(Result message) { - subscription.request(threads); - } - - @Override - public void onError(Throwable t) { - logger.log("error"); - } - - @Override - public void onComplete() { - logger.log("completed"); - } - }; + .subscribeWith(new SimpleSubscriber<>(threads, 1)); } private Scheduler threadPoolScheduler(int poolSize, int queueSize) { @@ -79,7 +52,8 @@ public class ReactiveBatchProcessor { poolSize, 0L, TimeUnit.SECONDS, - new LinkedBlockingDeque<>(queueSize) + new LinkedBlockingDeque<>(queueSize), + new WaitForCapacityPolicy() )); } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java new file mode 100644 index 0000000..dd6ad61 --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java @@ -0,0 +1,55 @@ +package io.reflectoring.reactive.batch; + +import io.reactivex.Flowable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class ReactiveBatchProcessorV1 { + + private final static Logger logger = new Logger(); + + private final int threads; + + private final int threadPoolQueueSize; + + private final MessageHandler messageHandler; + + private final MessageSource messageSource; + + public ReactiveBatchProcessorV1( + MessageSource messageSource, + MessageHandler messageHandler, + int threads, + int threadPoolQueueSize) { + this.messageSource = messageSource; + this.threads = threads; + this.messageHandler = messageHandler; + this.threadPoolQueueSize = threadPoolQueueSize; + } + + public void start() { + messageSource.getMessageBatches() + .subscribeOn(Schedulers.from(Executors.newSingleThreadExecutor())) + .doOnNext(batch -> logger.log(batch.toString())) + .flatMap(batch -> Flowable.fromIterable(batch.getMessages())) + .flatMapSingle(m -> Single.just(messageHandler.handleMessage(m)) + .subscribeOn(threadPoolScheduler(threads, threadPoolQueueSize))) + .subscribeWith(new SimpleSubscriber<>(threads, 1)); + } + + private Scheduler threadPoolScheduler(int poolSize, int queueSize) { + return Schedulers.from(new ThreadPoolExecutor( + poolSize, + poolSize, + 0L, + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(queueSize) + )); + } + +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java new file mode 100644 index 0000000..e70298c --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java @@ -0,0 +1,55 @@ +package io.reflectoring.reactive.batch; + +import io.reactivex.Flowable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class ReactiveBatchProcessorV2 { + + private final static Logger logger = new Logger(); + + private final int threads; + + private final int threadPoolQueueSize; + + private final MessageHandler messageHandler; + + private final MessageSource messageSource; + + public ReactiveBatchProcessorV2( + MessageSource messageSource, + MessageHandler messageHandler, + int threads, + int threadPoolQueueSize) { + this.messageSource = messageSource; + this.threads = threads; + this.messageHandler = messageHandler; + this.threadPoolQueueSize = threadPoolQueueSize; + } + + public void start() { + messageSource.getMessageBatches() + .subscribeOn(Schedulers.from(Executors.newSingleThreadExecutor())) + .doOnNext(batch -> logger.log(batch.toString())) + .flatMap(batch -> Flowable.fromIterable(batch.getMessages())) + .flatMapSingle(m -> Single.defer(() -> Single.just(messageHandler.handleMessage(m))) + .subscribeOn(threadPoolScheduler(threads, threadPoolQueueSize))) + .subscribeWith(new SimpleSubscriber<>(threads, 1)); + } + + private Scheduler threadPoolScheduler(int poolSize, int queueSize) { + return Schedulers.from(new ThreadPoolExecutor( + poolSize, + poolSize, + 0L, + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(queueSize) + )); + } + +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java new file mode 100644 index 0000000..fc81c47 --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java @@ -0,0 +1,57 @@ +package io.reflectoring.reactive.batch; + +import io.reactivex.Flowable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class ReactiveBatchProcessorV3 { + + private final static Logger logger = new Logger(); + + private final int threads; + + private final int threadPoolQueueSize; + + private final MessageHandler messageHandler; + + private final MessageSource messageSource; + + public ReactiveBatchProcessorV3( + MessageSource messageSource, + MessageHandler messageHandler, + int threads, + int threadPoolQueueSize) { + this.messageSource = messageSource; + this.threads = threads; + this.messageHandler = messageHandler; + this.threadPoolQueueSize = threadPoolQueueSize; + } + + public void start() { + Scheduler scheduler = threadPoolScheduler(threads, threadPoolQueueSize); + + messageSource.getMessageBatches() + .subscribeOn(Schedulers.from(Executors.newSingleThreadExecutor())) + .doOnNext(batch -> logger.log(batch.toString())) + .flatMap(batch -> Flowable.fromIterable(batch.getMessages())) + .flatMapSingle(m -> Single.defer(() -> Single.just(messageHandler.handleMessage(m))) + .subscribeOn(scheduler)) + .subscribeWith(new SimpleSubscriber<>(threads, 1)); + } + + private Scheduler threadPoolScheduler(int poolSize, int queueSize) { + return Schedulers.from(new ThreadPoolExecutor( + poolSize, + poolSize, + 0L, + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(queueSize) + )); + } + +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/SimpleSubscriber.java b/reactive/src/main/java/io/reflectoring/reactive/batch/SimpleSubscriber.java new file mode 100644 index 0000000..30c0848 --- /dev/null +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/SimpleSubscriber.java @@ -0,0 +1,42 @@ +package io.reflectoring.reactive.batch; + +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +public class SimpleSubscriber implements Subscriber { + + private final Logger logger = new Logger(); + + private final int initialFetchCount; + private final int onNextFetchCount; + + private Subscription subscription; + + public SimpleSubscriber(int initialFetchCount, int onNextFetchCount) { + this.initialFetchCount = initialFetchCount; + this.onNextFetchCount = onNextFetchCount; + } + + @Override + public void onSubscribe(Subscription subscription) { + this.subscription = subscription; + subscription.request(initialFetchCount); + logger.log("subscribed"); + } + + @Override + public void onNext(T message) { + subscription.request(onNextFetchCount); + } + + @Override + public void onError(Throwable t) { + logger.log("error"); + } + + @Override + public void onComplete() { + logger.log("completed"); + } + +} diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/RetryRejectedExecutionHandler.java b/reactive/src/main/java/io/reflectoring/reactive/batch/WaitForCapacityPolicy.java similarity index 85% rename from reactive/src/main/java/io/reflectoring/reactive/batch/RetryRejectedExecutionHandler.java rename to reactive/src/main/java/io/reflectoring/reactive/batch/WaitForCapacityPolicy.java index 8f9429e..2a783f5 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/RetryRejectedExecutionHandler.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/WaitForCapacityPolicy.java @@ -4,7 +4,7 @@ import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; -public class RetryRejectedExecutionHandler implements RejectedExecutionHandler { +public class WaitForCapacityPolicy implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) { diff --git a/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java b/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java index f859868..f38dbd5 100644 --- a/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java +++ b/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java @@ -5,6 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import io.reflectoring.reactive.batch.MessageSource; import io.reflectoring.reactive.batch.ReactiveBatchProcessor; +import io.reflectoring.reactive.batch.ReactiveBatchProcessorV1; +import io.reflectoring.reactive.batch.ReactiveBatchProcessorV2; +import io.reflectoring.reactive.batch.ReactiveBatchProcessorV3; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; @@ -13,9 +16,10 @@ public class ReactiveBatchProcessorTest { @Test public void allMessagesAreProcessedOnMultipleThreads() { - int batches = 3; - int batchSize = 4; - int threads = 5; + int batches = 10; + int batchSize = 3; + int threads = 2; + int threadPoolQueueSize = 10; MessageSource messageSource = new TestMessageSource(batches, batchSize); TestMessageHandler messageHandler = new TestMessageHandler(); @@ -23,8 +27,8 @@ public class ReactiveBatchProcessorTest { ReactiveBatchProcessor processor = new ReactiveBatchProcessor( messageSource, messageHandler, - threads - ); + threads, + threadPoolQueueSize); processor.start(); From 5b76cbac62256fb4b20f266f273e9d949b5c74fd Mon Sep 17 00:00:00 2001 From: thombergs Date: Mon, 3 Feb 2020 06:37:25 +1100 Subject: [PATCH 08/10] reduces visibility --- reactive/build.gradle | 2 +- .../java/io/reflectoring/reactive/batch/Logger.java | 4 ++-- .../java/io/reflectoring/reactive/batch/Message.java | 4 ++-- .../io/reflectoring/reactive/batch/MessageBatch.java | 4 ++-- .../reflectoring/reactive/batch/MessageHandler.java | 2 +- .../reflectoring/reactive/batch/MessageSource.java | 4 ++-- .../reactive/batch/ReactiveBatchProcessor.java | 12 ++++++------ .../reactive/batch/ReactiveBatchProcessorV1.java | 8 ++++---- .../reactive/batch/ReactiveBatchProcessorV2.java | 8 ++++---- .../reactive/batch/ReactiveBatchProcessorV3.java | 8 ++++---- .../reactive/batch/SimpleSubscriber.java | 4 ++-- .../reactive/batch/WaitForCapacityPolicy.java | 2 +- .../batch}/ReactiveBatchProcessorTest.java | 11 +++-------- .../{ => reactive/batch}/TestMessageHandler.java | 7 ++----- .../{ => reactive/batch}/TestMessageSource.java | 8 ++++---- 15 files changed, 40 insertions(+), 48 deletions(-) rename reactive/src/test/java/io/reflectoring/{ => reactive/batch}/ReactiveBatchProcessorTest.java (67%) rename reactive/src/test/java/io/reflectoring/{ => reactive/batch}/TestMessageHandler.java (80%) rename reactive/src/test/java/io/reflectoring/{ => reactive/batch}/TestMessageSource.java (83%) diff --git a/reactive/build.gradle b/reactive/build.gradle index 2779c4c..9c61496 100644 --- a/reactive/build.gradle +++ b/reactive/build.gradle @@ -15,7 +15,7 @@ repositories { } dependencies { - implementation 'io.reactivex.rxjava2:rxjava:2.2.17' + implementation 'io.reactivex.rxjava3:rxjava:3.0.0-RC9' testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1' testImplementation 'org.awaitility:awaitility:3.0.0' } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/Logger.java b/reactive/src/main/java/io/reflectoring/reactive/batch/Logger.java index cd89b3b..e39e729 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/Logger.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/Logger.java @@ -1,8 +1,8 @@ package io.reflectoring.reactive.batch; -public class Logger { +class Logger { - public void log(String string) { + void log(String string) { System.out.println(String.format("%s %s: %s", System.currentTimeMillis(), Thread.currentThread().getName(), string)); } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/Message.java b/reactive/src/main/java/io/reflectoring/reactive/batch/Message.java index 5dffd9d..a81eddd 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/Message.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/Message.java @@ -1,10 +1,10 @@ package io.reflectoring.reactive.batch; -public class Message { +class Message { private final String content; - public Message(String content) { + Message(String content) { this.content = content; } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageBatch.java b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageBatch.java index 3484192..dae86a7 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageBatch.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageBatch.java @@ -3,11 +3,11 @@ package io.reflectoring.reactive.batch; import java.util.Collections; import java.util.List; -public class MessageBatch { +class MessageBatch { private final List messages; - public MessageBatch(List messages) { + MessageBatch(List messages) { this.messages = messages; } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java index 664477b..381e623 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageHandler.java @@ -1,6 +1,6 @@ package io.reflectoring.reactive.batch; -public interface MessageHandler { +interface MessageHandler { enum Result { SUCCESS, diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageSource.java b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageSource.java index ddbefcb..750ef72 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/MessageSource.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/MessageSource.java @@ -1,8 +1,8 @@ package io.reflectoring.reactive.batch; -import io.reactivex.Flowable; +import io.reactivex.rxjava3.core.Flowable; -public interface MessageSource { +interface MessageSource { Flowable getMessageBatches(); diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java index c833878..86a8c9a 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessor.java @@ -1,9 +1,9 @@ package io.reflectoring.reactive.batch; -import io.reactivex.Flowable; -import io.reactivex.Scheduler; -import io.reactivex.Single; -import io.reactivex.schedulers.Schedulers; +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Scheduler; +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.schedulers.Schedulers; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; @@ -21,7 +21,7 @@ public class ReactiveBatchProcessor { private final MessageSource messageSource; - public ReactiveBatchProcessor( + ReactiveBatchProcessor( MessageSource messageSource, MessageHandler messageHandler, int threads, @@ -32,7 +32,7 @@ public class ReactiveBatchProcessor { this.threadPoolQueueSize = threadPoolQueueSize; } - public void start() { + void start() { Scheduler scheduler = threadPoolScheduler(threads, threadPoolQueueSize); diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java index dd6ad61..f40fd01 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java @@ -1,9 +1,9 @@ package io.reflectoring.reactive.batch; -import io.reactivex.Flowable; -import io.reactivex.Scheduler; -import io.reactivex.Single; -import io.reactivex.schedulers.Schedulers; +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Scheduler; +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.schedulers.Schedulers; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java index e70298c..f4c7633 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java @@ -1,9 +1,9 @@ package io.reflectoring.reactive.batch; -import io.reactivex.Flowable; -import io.reactivex.Scheduler; -import io.reactivex.Single; -import io.reactivex.schedulers.Schedulers; +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Scheduler; +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.schedulers.Schedulers; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java index fc81c47..2a2d312 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java @@ -1,9 +1,9 @@ package io.reflectoring.reactive.batch; -import io.reactivex.Flowable; -import io.reactivex.Scheduler; -import io.reactivex.Single; -import io.reactivex.schedulers.Schedulers; +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Scheduler; +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.schedulers.Schedulers; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/SimpleSubscriber.java b/reactive/src/main/java/io/reflectoring/reactive/batch/SimpleSubscriber.java index 30c0848..f260fb8 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/SimpleSubscriber.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/SimpleSubscriber.java @@ -3,7 +3,7 @@ package io.reflectoring.reactive.batch; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; -public class SimpleSubscriber implements Subscriber { +class SimpleSubscriber implements Subscriber { private final Logger logger = new Logger(); @@ -12,7 +12,7 @@ public class SimpleSubscriber implements Subscriber { private Subscription subscription; - public SimpleSubscriber(int initialFetchCount, int onNextFetchCount) { + SimpleSubscriber(int initialFetchCount, int onNextFetchCount) { this.initialFetchCount = initialFetchCount; this.onNextFetchCount = onNextFetchCount; } diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/WaitForCapacityPolicy.java b/reactive/src/main/java/io/reflectoring/reactive/batch/WaitForCapacityPolicy.java index 2a783f5..69bda7b 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/WaitForCapacityPolicy.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/WaitForCapacityPolicy.java @@ -4,7 +4,7 @@ import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; -public class WaitForCapacityPolicy implements RejectedExecutionHandler { +class WaitForCapacityPolicy implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) { diff --git a/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java b/reactive/src/test/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorTest.java similarity index 67% rename from reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java rename to reactive/src/test/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorTest.java index f38dbd5..10f97e3 100644 --- a/reactive/src/test/java/io/reflectoring/ReactiveBatchProcessorTest.java +++ b/reactive/src/test/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorTest.java @@ -1,20 +1,15 @@ -package io.reflectoring; +package io.reflectoring.reactive.batch; import static org.awaitility.Awaitility.await; import static org.junit.jupiter.api.Assertions.assertEquals; -import io.reflectoring.reactive.batch.MessageSource; -import io.reflectoring.reactive.batch.ReactiveBatchProcessor; -import io.reflectoring.reactive.batch.ReactiveBatchProcessorV1; -import io.reflectoring.reactive.batch.ReactiveBatchProcessorV2; -import io.reflectoring.reactive.batch.ReactiveBatchProcessorV3; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; -public class ReactiveBatchProcessorTest { +class ReactiveBatchProcessorTest { @Test - public void allMessagesAreProcessedOnMultipleThreads() { + void allMessagesAreProcessedOnMultipleThreads() { int batches = 10; int batchSize = 3; diff --git a/reactive/src/test/java/io/reflectoring/TestMessageHandler.java b/reactive/src/test/java/io/reflectoring/reactive/batch/TestMessageHandler.java similarity index 80% rename from reactive/src/test/java/io/reflectoring/TestMessageHandler.java rename to reactive/src/test/java/io/reflectoring/reactive/batch/TestMessageHandler.java index 876216d..2775742 100644 --- a/reactive/src/test/java/io/reflectoring/TestMessageHandler.java +++ b/reactive/src/test/java/io/reflectoring/reactive/batch/TestMessageHandler.java @@ -1,14 +1,11 @@ -package io.reflectoring; +package io.reflectoring.reactive.batch; -import io.reflectoring.reactive.batch.Logger; -import io.reflectoring.reactive.batch.Message; -import io.reflectoring.reactive.batch.MessageHandler; import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -public class TestMessageHandler implements MessageHandler { +class TestMessageHandler implements MessageHandler { private final AtomicInteger processedMessages = new AtomicInteger(); diff --git a/reactive/src/test/java/io/reflectoring/TestMessageSource.java b/reactive/src/test/java/io/reflectoring/reactive/batch/TestMessageSource.java similarity index 83% rename from reactive/src/test/java/io/reflectoring/TestMessageSource.java rename to reactive/src/test/java/io/reflectoring/reactive/batch/TestMessageSource.java index 5ea417b..f29a41a 100644 --- a/reactive/src/test/java/io/reflectoring/TestMessageSource.java +++ b/reactive/src/test/java/io/reflectoring/reactive/batch/TestMessageSource.java @@ -1,13 +1,13 @@ -package io.reflectoring; +package io.reflectoring.reactive.batch; -import io.reactivex.Flowable; +import io.reactivex.rxjava3.core.Flowable; import io.reflectoring.reactive.batch.Message; import io.reflectoring.reactive.batch.MessageBatch; import io.reflectoring.reactive.batch.MessageSource; import java.util.ArrayList; import java.util.List; -public class TestMessageSource implements MessageSource { +class TestMessageSource implements MessageSource { private final int batches; @@ -19,7 +19,7 @@ public class TestMessageSource implements MessageSource { * @param batches the number of message batches to produce. * @param batchSize the number of messages per batch. */ - public TestMessageSource(int batches, int batchSize) { + TestMessageSource(int batches, int batchSize) { this.batches = batches; this.batchSize = batchSize; } From 1437ac44291bacce602481efb775ae76324d3652 Mon Sep 17 00:00:00 2001 From: thombergs Date: Mon, 3 Feb 2020 06:56:10 +1100 Subject: [PATCH 09/10] added warning do code that isn't working --- .../io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java | 1 + .../io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java | 1 + .../io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java | 1 + 3 files changed, 3 insertions(+) diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java index f40fd01..92d430f 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV1.java @@ -33,6 +33,7 @@ public class ReactiveBatchProcessorV1 { } public void start() { + // WARNING: this code doesn't work as expected messageSource.getMessageBatches() .subscribeOn(Schedulers.from(Executors.newSingleThreadExecutor())) .doOnNext(batch -> logger.log(batch.toString())) diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java index f4c7633..3711864 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV2.java @@ -33,6 +33,7 @@ public class ReactiveBatchProcessorV2 { } public void start() { + // WARNING: this code doesn't work as expected messageSource.getMessageBatches() .subscribeOn(Schedulers.from(Executors.newSingleThreadExecutor())) .doOnNext(batch -> logger.log(batch.toString())) diff --git a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java index 2a2d312..fd02030 100644 --- a/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java +++ b/reactive/src/main/java/io/reflectoring/reactive/batch/ReactiveBatchProcessorV3.java @@ -33,6 +33,7 @@ public class ReactiveBatchProcessorV3 { } public void start() { + // WARNING: this code doesn't work as expected Scheduler scheduler = threadPoolScheduler(threads, threadPoolQueueSize); messageSource.getMessageBatches() From 0be1335d249994a5764d264973eed48c08923359 Mon Sep 17 00:00:00 2001 From: thombergs Date: Thu, 6 Feb 2020 06:45:21 +1100 Subject: [PATCH 10/10] add EXPOSE --- aws/aws-hello-world/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws/aws-hello-world/Dockerfile b/aws/aws-hello-world/Dockerfile index 07400c4..5aa3049 100644 --- a/aws/aws-hello-world/Dockerfile +++ b/aws/aws-hello-world/Dockerfile @@ -1,4 +1,5 @@ FROM openjdk:8-jdk-alpine ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar -ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file +ENTRYPOINT ["java","-jar","/app.jar"] +EXPOSE 8080 \ No newline at end of file