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

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ę.

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?

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.

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.

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.

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.

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.

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?

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.

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.

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ę.

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