Shalom
2017-10-10 22:42

Dzisiaj mały rant na "magię" a w sumie może bardziej na jakiś taki cargo cult i bezmyślne używanie rzeczy, ktorych się nie rozumie.

Jestem juz przyzwyczajony że co jakiś czas ktoś z temu prosi mnie o pomoc w zdebugowaniu jakiegoś problemu z serii przeciez to niemożliwe, java się zepsuła!!11.
Tak też było i dziś. Jedna osoba stawiała sobie środowisko do pracy nad jakimś nowym modułem i potrzebowała setup trochę mniej typowy niż u innych. Sam projekt generalnie jest upchany do granic możliwości rozwiązaniami z serii hype driven development i @jarekr000000 dostałby pewnie zawału ;) Niestety jest to jednocześnie tak zrobione, że rekord postawienia tego lokalnie u developera wynosi jakieś 2 dni... Sugerowałem nawet, żeby następnym razem ktos po prostu zrobił VMkę z gotowym środowiskiem, no ale nie mam "mocy sprawczej" więc bawią się dalej :D

Wracając do tematu, odbywała się dziś (tzn już pewnie od wczoraj jak nie dłużej) próba kolejnego setupu i pojawił się problem nie do przejścia -> w trakcie startu aplikacji leci wyjątek z JMSa że nie da się połącyć do jakiejśtam kolejki o podanym URLu. Niby nic wiekiego, niemniej to jest aplikacja z pluginami i nie do końca wiadomo kto i gdzie te JMSa próbuje postawić i skąd bierze adres. Adres pewnie z propertisów, ale tych jak sie dorzuci pluginy jest trochę, no ale nic, grepujemy sobie po nich i nie ma tego adresu który szukamy. Po drodze wyszło jeszcze trochę potencjalnych baboli w konfiguracji więc poprawiamy, no ale czas wrócić do tego JMSa. Pomyślałem nawet, że może gdzieś ktoś na lewo coś dorzuca do jara, więc rozpakowałem i sprawdziłem tam no i nadal nic.

Przy okazji miałem pokaz "permutation driven development", bo zanim zostałem wezwany do pomocy to już pewne desperackie próby zostały podjętę. Pliki properties były powrzucane w każde możliwe miejsce w strukturze projektu i musiałem poświęcić kilka minut na wyjaśnienie, że nie ma sensu, bo tylko te z src/main/resources będą brane pod uwagę. Musiałem też co jakiś czas stopować genialne pomysły z serii zmieńmy tutaj to property i przebudujmy projekt!, kiedy ewidentnie widać że nijak nie ma to związku z naszym problemem.

No więc czas jednak użyć debugera i zobaczyć co tam się generalnie dzieje. A tu niestety kłody pod nogi. Ten JMS to oczywiście startuje oczywiście z jakiegoś Springowego beana, na podstawie 7 krotnie powstrzykiwanych obiektów a na koniec wstrzykniętych properties. Istniała też szansa że może ta wartość jest gdzieś "w kodzie" ustawiana setterem - no to można by się breakować tam. A tu niestety Lombok :D Dobrze że IntelliJ dekompiluje klasy w locie i pozwala postawić breakpointy w tym zdekompilowanym bajtkodzie, który już ma te dodane lombokiem konstruktory i metody. Debuger potwierdza że faktycznie property jest ewidentnie z jakiegoś wstrzyknięcia, więc wskakujemy sobie w property resolver i patrzymy co za propertisy Spring sobie znalazł. Jest ich tam trochę, ale po chwili trafiamy na "winnego". Jest on o tyle dziwny, że to nie jest plik z classpath, tylko... URL! Moja pierwsza myśl jest taka, że ktoś sprytnie zrobił sobie property które przechowuje URLa do innych property i się to tak sprytnie rekurencyjnie ładuje. Powtarzamy więc sesje grepowania, szukając teraz już nie naszego JMSowego endpointa (tego który nie działał na samym początku), tylko szukając URLa do tych lewych propertisów i znów nic. Nauczony doświadczeniem sprawdziłem na wszelki wypadek czy springowy property resolver gdzieś tego nie widzi wśród załadowych propertisów, ale też nie!

Przyszło mi wtedy do głowy, że cudów tutaj nie ma, skoro nie ma tego w kodzie ani w properties ani w jarze, to jedyna możliwość, która pozostaje, to oczywiście parametry wywołania programu, które oczywiście też są automatycznie obsługiwane przez Spinga. Otwieram "run configuration" i widzę tam już znajomy URL do rypniętych properties... Myśle że moja mina to było klasyczne szok, niedowierzanie i tysiące pytań bez odpowiedzi. Pytam więc grzecznie WTF?! Jak się okazuje parametry zostały dodane zupełnie bezmyślnie bo tak było w developer's guidzie i bez jakiejś refleksji nad tym do czego one służą i czy nie należy ich jakoś zmodyfikować. Usuwamy parametr, wszystko startuje od kopa. Kurtyna.

#dailywtf #magic #ihavenoideawhatimdoing #java

Koziołek

@karolinaa: właśnie pracuję nad taką standaryzacją w nowej firmie. Docelowo ma to wyglądać tak, że bazę danych wraz z JMSem odpalamy w kontenerach, a główna apka chodzi na hoście. Rzecz w tym, że nikt nie wiem jak prawidłowo skonfigurować apkę. Nawet najdłużej pracujący w projekcie nie wiedzą jak to zrobić...

vpiotr

@Shalom: witaj w swiecie korpo-flag. Ja takie bzdety robie na codzien.