Task próbuje korzystać ze zdispose'owanej sesji nhibernatowej.

Odpowiedz Nowy wątek
2017-02-15 20:05
0

Cześć,

poniżej na diagramie przedstawiłem problem z którym się obecnie zmagam.

screenshot-20170215195859.png

Ma ktoś z Was pomysł, jak sobie z czymś takim poradzić? Oczywiście zmiana cyklu życia sesji nie wchodzi w grę.

Pozostało 580 znaków

2017-02-15 20:19
1

Łał, nie wiedziałem, że się da programować rysując kwadraty i strzałki. Ja ciągle muszę pisać kod. :(

Niemniej jednak - gdzie jest otwierana sesja i po co tam w ogóle ten task?

edytowany 1x, ostatnio: somekind, 2017-02-15 20:21

Pozostało 580 znaków

2017-02-15 21:07
0

Najnowsza wersja C# pozwala na programowanie strzałkami i kwadratami, nie wiedziałeś? :)

Sesja jest otwierana w wątku głównym, a gdzie dokładnie to imo nie ma znaczenia. W tasku jest generowany pdf. Trwa to czasami bardzo długo, stąd ten task. Po wygenerowaniu pdfa aktualizuje wpis w bazie i aktywuje się użytkownikowi możliwość pobrania pliku na stronie. Tak to w wieelkim uproszczeniu wygląda.

edytowany 1x, ostatnio: Inclouds, 2017-02-15 21:08

Pozostało 580 znaków

2017-02-15 22:20
2

Skoro wiesz, że miejsce otwarcia sesji jest bez znaczenia, to po co w ogóle zadajesz pytanie na forum? :D

U Ciebie sesja jest zapewne otwierana wraz z akcją kontrolera, więc kontener ją zamyka wraz z końcem akcji. Kod w tasku ciągle się wykonuje, a potem próbuje operować na zamkniętej sesji.
Po prostu sesję musisz otwierać i zamykać w tasku, albo czekać na jego zakończenie wewnątrz akcji kontrolera.

Pozostało 580 znaków

2017-02-15 22:42
0

Patrzyłeś chociaż na ten diagram? Przecież ja dokładnie wiem co się dzieje, ale nie wiem jak to poprawić. Otworzenie sesji w tasku nic mi nie da, bo obiekty, które w tym delegacie coś robią mają referencję do sesji utworzonej w wątku głównym.

Pokaż pozostałe 4 komentarze
A z tezą, że taski nie mają sensu w apce webowej jednak się nie zgodzę. Przecież możesz je wykorzystać również do zrównoleglenia operacji. Gdzie tu ich mniejsza użyteczność niż w apce desktopowej? - Inclouds 2017-02-15 23:26
Ok, najpierw nie ogarnąłem, że ten task jest po to, żeby użytkownik nie czekał 5 minut aż skończy się request żeby przejść na inną stronę. Ale dalej blokowanie wątku aplikacji webowej na kilka minut średnio mi się podoba. Tak jak pisał @mstl to powinno być zakolejkowane, a następnie przetworzone gdzieś na zewnątrz aplikacji webowej(np. w chmurze). - some_ONE 2017-02-15 23:39
No nie ukrywam, że to rozwiązanie ma swoje minusy, ale po 1. takich plików jest mało, z reguły generują się dużo szybciej(ok 15-30 sekund) 2. ruch na stronie jest niewielki(1000 osób dziennie). Rozwiązanie z chmurą nie przejdzie. - Inclouds 2017-02-15 23:50
Mówiąc o kolejce macie na myśli kolejkę sql'ową? - Inclouds 2017-02-15 23:54
Na temat wątku dyskutujemy w postach, a nie komentarzach. - somekind 2017-02-16 00:07

Pozostało 580 znaków

2017-02-15 23:32
2
Inclouds napisał(a):

Taką mamy infrastrukturę w projekcie, ja jej nie tworzyłem. Natomiast z moim niewielkim doświadczeniem(więc może jestem tutaj krótkowzroczny) nie widzę innego sposobu wygenerowania pdfa, które może trwać nawet kilka minut, tak aby użytkownik mógł w tym czasie poruszać się po stronie. Gdyby pdf był generowany synchronicznie(bez taska/thread workera), to o ile się nie mylę, musiałby odczekać aż plik się wygeneruje. Inaczej przejście w inne miejsce byłoby równoznaczne z przerwaniem requesta, a generowanie szlak by trafił.

Wygenerowanie pliku powinno zostać zakolejkowane, a następnie odpalone w tle przez jakiegoś backgroud workera (wiem, nomen omen). Backgroud worker powinien mieć swoją sesję i znać kontekst (czyli wiedzieć co i dla kogo).
Użytkownik nie musi przecież od razu dostać pliku (sam zresztą pisałeś, że to trwa) - może więc wiedzieć np. jakąś listę plików wraz z danym statusem (oczekuje na wygenerowanie, generowanie, do pobrania itp.). Później może odpalać się jakieś zaplanowane zadanie usuwające pliki starsze niż zadany okres czasu.

edytowany 5x, ostatnio: mstl, 2017-02-15 23:39

Pozostało 580 znaków

2017-02-15 23:44
0
mstl napisał(a):

Wygenerowanie pliku powinno zostać zakolejkowane, a następnie odpalone w tle przez jakiegoś backgroud workera (wiem, nomen omen).
Backgroud worker powinien mieć swoją sesję i znać kontekst (czyli co i dla kogo).
Użytkownik nie musi przecież od razu dostać pliku (sam zresztą pisałeś - że to trwa) - może wiedzieć np. jakąś listę plików wraz z danym statusem (oczekuje na wygenerowanie, generowanie, do pobrania itp.). Później może odpalać się jakieś zaplanowane zadanie usuwające pliki starsze niż zadany okres czasu.

No prawie tak to działa. Wrzuciłem na początku uproszczony diagram, żeby już nie wchodzić w szczegóły, a skupić się na istocie problemu.

edytowany 2x, ostatnio: Inclouds, 2017-02-15 23:45

Pozostało 580 znaków

2017-02-15 23:55
1

Inclouds napisał(a):
No prawie tak to działa. Wrzuciłem na początku uproszczony diagram, żeby już nie wchodzić w szczegóły, a skupić się na istocie problemu.

No widocznie tak to nie działa, skoro nie działa ;)
Co masz takiego w tej sesji, że nie możesz tego przesłać jako parametr/kontekst do taska?

edytowany 1x, ostatnio: mstl, 2017-02-15 23:55

Pozostało 580 znaków

2017-02-16 00:15
0
Inclouds napisał(a):

Otworzenie sesji w tasku nic mi nie da, bo obiekty, które w tym delegacie coś robią mają referencję do sesji utworzonej w wątku głównym.

Ale nie mogą mieć, jeśli to ma działać wg Twojej architektury. To co się dzieje w tasku powinno być po prostu jednym unit of work od początku do końca, nie może działać na sesji zarządzanej per webrequest. Więc albo tak, albo tak jak napisał @mstl.

Pozostało 580 znaków

2017-02-16 01:13
0
mstl napisał(a):

Inclouds napisał(a):
No prawie tak to działa. Wrzuciłem na początku uproszczony diagram, żeby już nie wchodzić w szczegóły, a skupić się na istocie problemu.

No widocznie tak to nie działa, skoro nie działa ;)
Co masz takiego w tej sesji, że nie możesz tego przesłać jako parametr/kontekst do taska?

W obecnym kodzie tworzenie modelu do wygenerowania pdfa odbywa się przed taskiem w wątku głównym, task z sesji nie korzysta. Przeniosłem tworzenie modelu do taska i teraz próbuje sobie poradzić z tą sesją. I nie pytaj mnie czemu to zrobiłem - nie ma sensu wchodzić w szczegóły i tłumaczyć krok po kroku czemu, co i jak. A kolejka jest tworzona w ten sposób, że task (który oczywiście nie jest prostym taskiem, a opakowaną klasą wykonującą pięćset innych rzeczy), wpisuje w bazie operację i jej status. Jak sobie zaczniesz generować 5 pdfów to tyle będziesz miał rekordów operacji w bazie. I nie przebuduję tego na cokolwiek innego, bo po 1. mam za małe doświadczenie, po 2. jestem za nisko, po 3. stosunek korzyści do pracy jest mierny. Nigdzie nie pisałem, że generowanie plików w ogóle nie działa. Po staremu działa, ale jest z tym niewielki problem który należy w końcu rozwiązać. Chciałem go rozwiązać tworzeniem modelu w tasku, ale pojawił się problem z sesją, dlatego udałem się z nadzieją szukać pomocy na forum.

edytowany 4x, ostatnio: Inclouds, 2017-02-16 01:15

Pozostało 580 znaków

2017-02-16 18:42
0

Przekaż do taska wszystko co jest mu potrzebne do działania aby nie korzystał już z sesji requesta.
Np w akcji kontrolera dodaj rekordy w bazie, a do taska przekaż tylko potrzebne id, a task niech sam sobie utworzy nową sesję.


Przyjmuję zlecenia w C#, w tym projekty zaliczeniowe. Pisać na pw.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0