Avatar billede Lasse Novice
25. juli 2017 - 18:05 Der er 5 kommentarer og
3 løsninger

Send emails fra asp.net mvc i seperat traad

Hej,

Jeg har en asp.net mvc applikation hvorfra jeg til tider sender emails til brugeren. Jeg sender f.eks. en email til brugeren, hvis han oensker et nyt kodeord.

Det tager tid at sende en email, noget der irreterer brugeren. Derfor taenker jeg paa at lave en loesning hvor alle emails bliver lagt ind I en tabel, og fra en seperat traad sender jeg usendte emails. Hvordan goer man dette smartest I asp.net mvc, uden at sende den samme email flere gange?

Jeg har kigget paa AddOnBeginRequestAsync og semaphore, men jeg er ikke sikker paa at det daekker mit behov. Findes der en smartere loesning?

Tak paa forhaand.
Avatar billede jakobdo Ekspert
25. juli 2017 - 18:11 #1
Kunne du ikke "bare" have en service kørende, som kigger i din tabel:

vælg alle "mails" hvor afsendt = 0
Når så din service finder en email og afsender den, så opdatere du til afsendt=1
Dermed sikrer du en email kun afsendes en gang.
Og du vil ikke påvirke brugerens oplevelse på din side.
Avatar billede Lasse Novice
25. juli 2017 - 18:32 #2
Det er en fremragende loesning, dog ikke til mit projekt.

Problemet er at jeg ikke har en seperat maskine til at have servicen paa, og min udbyder tilbyder ikke CRON jobs :-(
Avatar billede softspot Forsker
25. juli 2017 - 18:38 #3
Kan du ikke bruge en ekstern service til cron jobs delen? Eksempelvis: https://cron-job.org/en/
Avatar billede Lasse Novice
25. juli 2017 - 19:00 #4
Jo, det er helt sikker en god loesning :-)
Avatar billede arne_v Ekspert
25. juli 2017 - 19:14 #5
Designet med request gemmer emails i DB og permanent traad sender emails ud er ikke god. Permanente traade og ASP.NET er ikke en god kombination.

Request gemmer emails i DB og ekstern service/daemon/whatever sender emails ud er OK.

Request starter en traad som sender email er ikke helt fin i kanten (manuel haandtering af traade), men boer virke rimeligt godt.
Avatar billede Lasse Novice
25. juli 2017 - 19:26 #6
Med cron jobs, saa kan jeg risikere at et nyt cron job bliver eksekveret inden det tidligere cron job stopper. Cron jobbet kalder en asp.net side. Hvordan sikrer jeg mig I asp.net MVC at dette ikke sker? Skal man bruge semaphores, eller ???
Avatar billede softspot Forsker
25. juli 2017 - 19:31 #7
Hav en tilstand mere på dit flag, som du sætter når du starter din behandling af udsendelsen, så du kan samle op på efterladte udsendelser (som ikke er gjort færdige).
Avatar billede arne_v Ekspert
26. juli 2017 - 00:49 #8
Det er muligt at have 3 states: waiting, inprogress og done. Husk og goer koden concurrency sikker. Jeg vil tro at du bliver noedt til at haeve transaction isolation level.

Alternativt saa oeg intervallet mellem at jobbet koerer og lad jobbet vaere massivt multi-threaded (email afsendelse egner sig til dette).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester