Problem z konfiguracją frameworka Weld

Problem z konfiguracją frameworka Weld
R2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:14
0

Witam.
Próbuje napisać prostą aplikację w frameworku Weld z wykorzystaniem Mavena. Do pom.xml dodałem najnowszą bibliotekę 3.0.1.Final, plik bean.xml jest opatrzony podstawowymi znacznikami. Aplikacja składa się z kilku komponentów wzajemnie od siebie zależnych i klasy z metodą main, która je wykorzystuje (Obiekty, które mają być wstrzyknięte oznaczone są adnotacją @Inject i są opatrzone konstruktorami). Na pierwszy rzut oka aplikacja działa, obiekty są inicjalizowane przez kontener, lecz w logach pojawia się następująca informacja:

Kopiuj
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.

**Dodatkowo to co zauważyłem to fakt, że czas wstrzykiwania jest strasznie długi. **
Czy ktoś może spotkał się z takim problemem? Na stackoverflow natrafiłem na artykuł: https://stackoverflow.com/questions/24705017/weld-not-initializing-properly.
Z tego co jest tam napisane w ostatnim komentarzu, teoretycznie powinno to działać...

Program główny ma postać:

Kopiuj
Weld theWeld = new Weld();
 WeldContainer theContainer = theWeld.initialize();
Component component = (Component)  theContainer.instance().select(Component.class).get();

Proszę o jakieś wskazówki.
Pozdrawiam

edytowany 4x, ostatnio: ralf2005
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie bardzo rozumiem w czym problem. Przecież to działa. Że nie ma tam JTA to akurat nie dziwota skoro odpalasz standalonową aplikacje z gołym Weldem. A że czas inicjalizacji kontenera jest długi, ot tak juz mają ze chwile startują.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
R2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:14
0

Właśnie tu chodzi głównie o czas pobierania beana. Czas startu jest całkiem niewielki 20ms (Czas pobrania beana - miliona elementów za pomocą metody weld.select(Component.class).get() to już 700ms, gdzie w Springu było to 60ms).

Dlatego uważam, że coś może być jeszcze na rzeczy z konfiguracją.

edytowany 2x, ostatnio: ralf2005
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

A jak wyglądaja te klasy które wstrzykujesz? Bo jeśli to są POJO to bardzo mozliwe że Weld traktuje je jako Beany EJB a nie jako Beany CDI, co dodaje pewien narzut na operacje z nimi związane. Zobacz co się stanie jeśli dorzucisz do tych klas adnotacje @ApplicationScoped albo @Named.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
R2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:14
0

Rzeczywiście to chyba najbardziej prawdopodobny scenariusz. Sprawdzę to po południu, jak tylko będę miał dostęp do kodu.

jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
0

Czas pobrania beana - miliona elementów za pomocą metody weld.select(Component.class).get() to już 700ms

Możesz doprecyzować, o co chodzi z tym milionem? Czy czas pobierania kolejnych beanów jest krótszy?

Edit: mierzyłeś czas łącznie z wywołaniem instance() czy osobno?


Przeważnie ignoruję niezarejestrowanych użytkowników.
edytowany 1x, ostatnio: jarekczek
R2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:14
0
  1. Chciałem sprawdzić ile czasu zajmie pobranie milion razy jednego beana z kontenera (Mierzony jest czas jedynie wywołania metody pobierającej komponent). Jeżeli potem odwołuje się do innych beanów, to problem jest ten sam (Długi czas otrzymania konkretnego obiektu).

  2. Chodzi o wywołanie **container.instance().select(Component.class).get() **? Jeżeli tak, to próbowałem także pobierać komponent w ten sposób i efekt jest ten sam.

edytowany 1x, ostatnio: ralf2005
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
1

Spring ma zdaje się domyślny scope singleton. Weld może ma prototype. I to by wyjaśniało. Zadeklaruj jawnie scope (singleton albo application) i wtedy porównaj. Czyli rada Shaloma.

700 ms dzielone na milion, to jakiś trudny w ogóle do wyliczenia czas. 0,7 mikrosekundy. Trochę nie rozumiem, jak wykryłeś, że to stanowi problem w aplikacji. Czas obsługi żądania http jest rzędu milisekund, jak te pojedyncze mikrosekundy mają zaburzyć działanie aplikacji?


Przeważnie ignoruję niezarejestrowanych użytkowników.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
ralf2005 napisał(a):
  1. Chciałem sprawdzić ile czasu zajmie pobranie milion razy jednego beana z kontenera (Mierzony jest czas jedynie wywołania metody pobierającej komponent). Jeżeli potem odwołuje się do innych beanów, to problem jest ten sam (Długi czas otrzymania konkretnego obiektu).

Jak będziesz chciał każdy obiekt w aplikacji robić jako bean to rzeczywiście może być problem.
Ale może warto robić beanami tylko te najważniejsze, fasady?

R2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:14
0
  1. Dokładnie Spring działa na Singletonach. Próbowałem oznaczać wstrzykiwane beany adnotacją @Singleton, ale nic to nie zmieniło. Mogę to zrobić w jakiś inny sposób?

  2. Chciałem zrobić zestawienie frameworków wykorzystujących DI i każde różnice w czasie będą dla mnie ciekawe. Zastanawia mnie tylko, że Spring, Guice i PicoContainer mieści się w czasie 50-100, a Weld nagle zwrócił wartość z przedziału 700-900. Spróbuje się zastosować do Waszych rad i wieczorem dam odpowiedź, czy coś się zmieniło.

Zobacz pozostałe 4 komentarze
jarekr000000
Przepraszam, jeśli to Cię zasmuci, ale strzelam, że wartość tego benchmarku to 0, albo nawet ujemna :-(. Czy o ogóle wiesz jak robić wiarygodne benchmarki? zwłaszcza w Javie? Czy w ogóle szybkość instancjonowania beanów ma jakiś istotny wpływ na aplikację którą robisz? Bo jeśli ma - to rób zamiast WELDA, Spring czy Guice - new PoProstuMojaKlasa() - i bedzie i szybko i ładnie :-) Btw. ja tak robię, ale wcale nie z powodu szybkości.
SP
@Shalom: zależy który Singleton, bo jest javax.ejb.Singleton oraz javax.inject.Singleton
Shalom
Niestety nie zależy bo javax.inject.Singleton nie należy do specyfikacji CDI więc jego zachowanie to jest generalnie random()
SP
Hmm rzeczywiście. Kto by pomyślał :)
SP
@Shalom: to jest raczej tak, ze CDI wystawia mechanizm tworzenia scope-ów, i tak- ma pewne scopy wbudowane, ale można też tworzyć nowe. Na przykład @ViewScoped z JSF należy do specyfikacji JSF ale jest zbudowany na CDI.
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
2

Czemu było ukrywać, że robisz benchmarki :)

Wg mnie mierząc milion pobrań tego samego obiektu powinieneś to rozbić na czas pierwszego pobrania i czasy kolejnych.


Przeważnie ignoruję niezarejestrowanych użytkowników.
edytowany 2x, ostatnio: jarekczek
R2
Ok, w sumie dobra rada.
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
0

Jak już robisz benchmarki, to fajnie. Podziel się wynikami. Ale sensowny benchmark to taki, w którym masz tysiące beanów zależnych od siebie. Na to zapuszczasz frameworka i mierzysz. Raczej inicjalizację + pojedyncze pobrania, nie miliony. Nie ma obaw, to będzie trwało długo, nie trzeba zwielokratniać. Osobno w 2 kategoriach: setter i constructor injection.


Przeważnie ignoruję niezarejestrowanych użytkowników.
R2
No tak, aplikację będą sukcesywnie rozwijane. Na dobry początek chciałem jedynie uruchomić aplikacje w każdym z frameworków. Dodatkowo będe wdzieczny za pomysły na dodatkowe testy :)
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Jak już robisz benchmarki w Javie, to mam nadzieję, że przejrzałeś obowiązkowe pozycje czyli np. to video:
https://vimeo.com/78900556 (były lepsze i nowsze wersje - ale nie mogłem na szybko znaleźć).

Nie pamiętam czy kiedyś widziałem nie zrypany benchmark w Javie. Łącznie z moimi :-( Różnice sa tylko takie, że czasami widać bzdurę po 5 sekundach, czasem po minucie, a czasem wychodzi dopiero po miesiącu. Na zrobienie niekórych benchmarków poświęciłem tygodnie... potem i tak znajdowałem błędy.
Największy problem to statystyka - czyli postawienie weryfikowalnej hipotezy, której dodatkowo obronienie lub obalenie ma jakiś sens biznesowy.

Ja strzelam u Ciebie, taką hipotezę: wybór frameworka DI (wśród tych kilku standardowych, znanych) ma nieistotny wpływ na szybkość działania twojej aplikacji. Tu założenie jest takie , ze nie piszesz czegoś chorego. Bo (tak jak niejako napomknąl @vpiotr) nawet jak piszesz w Spring czy innym badziewiu - normalnie jedynie pewna mała częśc twoich klas to beany.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 5x, ostatnio: jarekr000000
R2
Dzięki za video. Spróbuje je dzisiaj obejrzeć.
R2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:14
0

Witam. Niestety adnotacje @ApplicationScoped lub @named za wiele nie pomogły. Dalej czasy są większe niż 700ms, oraz jest wyświetlany na konsoli poniższy błąd:

Kopiuj
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.

Ktoś może ma jeszcze jakieś pomysły? Może to wina biblioteki? Niby weld.se wspiera CDI. Już w sumie skończyły mi się pomysły.

edytowany 1x, ostatnio: ralf2005
jarekczek
Jakbyś dał na githuba, to chętnie rzucę okiem.
R2
Tutaj w sumie żadnej magii nie ma. Jest program main i pare komponentów, które są wzajemnie wstrzykiwane za pomocą konstruktora. Program ogólnie działa, wszystkie obiekty są poprawnie wypełniane, ale martwi mnie ten strasznie długi czas dostępu. Przecież framework brandowany przez twórców jako "Super lekki" nie może mieć, aż takich różnic w porównaniu do innych frameworków DI...
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
1

Z moich testów przeprowadzonych na najnowszym WebLogicu wynika, że Weld pobiera 1000000 takich samych obiektów w około 100 ms. Na starym laptopie Intel Core I3. To by potwierdzało sugestię z tytułu "Problem z konfiguracją frameworka Weld", nie zaś z wydajnością tego frameworka.

Trudno badać konfigurację, albo metodę pomiaru, bez dostępu kodu źródłowego.


Przeważnie ignoruję niezarejestrowanych użytkowników.
R2
Nie podaje tutaj kodu, ponieważ korzystam z podstawowych metod i komponentów. Na początku stworzyłem komponent o trzech atrybutach, potem w metodzie main uruchomiłem kontener, a następnie pobrałem bean'a owej klasy komponentu (Wszystko za pomocą standardowych metod frameworka najnowszej biblioteki). Jeżeli potrzeba to mogę umieścić fragmenty kodu które zobrazują lepiej obecną sytuację.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)