Gestione della registrazione in assenza di accesso a Internet

-1

Sto sviluppando un'applicazione che gestisce le vendite per più client, quando il cliente vende un determinato articolo, tali informazioni devono essere inviate all'amministratore. Il conteggio di ogni articolo venduto e il nome dell'oggetto.

L'ho fatto impostando un semplice server online e inviando richieste POST a quel server con i dati appropriati, invio il nome dell'elemento e la modifica in vendita dall'ultimo aggiornamento. Il problema che sto affrontando è se la richiesta non riesce per qualsiasi motivo (il server è inattivo, o Internet non è disponibile, ecc.) Qual è l'approccio migliore a tale problema?

Quello che ho fatto è che ho archiviato la modifica localmente sul computer del cliente. Nella mia attuale implementazione, ho impostato un valore nel registro con il nome dell'elemento alla modifica. Provo ad inviare quella modifica al server e se quella richiesta ha esito positivo, rimuovo quel valore dal registro. Funziona, ma informa il server quando il client vende un altro dello stesso articolo.

Ad esempio, il cliente ha venduto tre degli articoli A e due dell'articolo B, la richiesta è stata inviata correttamente, quindi il server è aggiornato. In seguito, non è stato effettuato l'accesso a Internet e il cliente ha venduto altri due articoli dell'articolo B. Poiché la richiesta non è riuscita, il client ha lasciato "Item B: 2" nel suo registro. Quando Internet ritorna, il server non sarà informato di quelle due vendite a meno che se il cliente venda un altro Articolo B. Questo è estremamente indesiderabile, ma non ho idea di come ripararlo.

Per dirla chiaramente: voglio registrare le vendite sul server, e se Internet non è accessibile, voglio memorizzare la registrazione offline finché Internet non è tornato, a quel punto il i registri archiviati devono essere inviati. Come posso farlo?

    
posta Megadardery 27.08.2018 - 22:40
fonte

2 risposte

0

Una coda

Questo è effettivamente ciò che hai già provato ad implementare, ed è la soluzione corretta. L'inizio di base è:

  • Prova a inviare l'aggiornamento.
    • Se riesce, fine del lavoro.
    • Se fallisce, archivia l'aggiornamento localmente, quindi puoi riprovare più tardi.

Nessun argomento lì, è esattamente come dovresti gestirlo.

Un trigger

Un trigger è un'azione che fa un lavoro da eseguire. Esistono molti possibili trigger:

    Pulsante
  • : si attiva ogni volta che si fa clic su
  • Timer - si attiva quando è pianificato
  • Condizionale - si attiva se vengono soddisfatti determinati criteri
    • È molto importante rendersi conto qui che questo è un trigger a due fasi. Il trigger condizionale è in grado di avviare il lavoro (o meno), ma è comunque necessario un secondo trigger che sia in grado di controllare le condizioni del trigger.

This works, but only informs the server when the client sells another of the same item.

Quello che hai qui è un trigger condizionale in due fasi.

  1. Quando l'utente vende l'articolo A , controlla se ci sono altri aggiornamenti per l'articolo A.
  2. Quando ci sono altri aggiornamenti per l'articolo A nella coda , inviali.

Non c'è niente di sbagliato con il secondo trigger. Ma come puoi vedere, il problema è nel primo trigger. Non invierai mai un aggiornamento a meno che il trigger non venga attivato.

La soluzione più semplice (ma non necessariamente la migliore) è un pulsante.

  • Ogni volta che una pagina / finestra viene caricata, controlla se ci sono aggiornamenti nella coda locale (indipendentemente dall'elemento).
  • Se ci sono aggiornamenti in coda, mostra il pulsante "Sincronizza".
  • Quando il pulsante "Sincronizza" viene cliccato dall'utente, gli aggiornamenti vengono inviati al server (se fallisce ancora, gli aggiornamenti rimangono in coda e il ciclo si ripete).

Una soluzione apparentemente migliore è un trigger temporizzato. Tuttavia, il rilevamento del timer è un tipo di algoritmo "sempre attivo". A seconda che tu stia realizzando un'applicazione web o locale, qui le cose possono essere molto diverse. Solo per darti un assaggio di possibilità:

  • Un'applicazione WinForms / WPF può eseguire un timer in background fino a quando l'applicazione stessa è aperta. Questo può verosimilmente valere anche per le applicazioni Web SPA.
  • In alternativa, è possibile eseguire un'applicazione di background separata che rimane aperta quando l'app Winforms / WPF viene chiusa. Tuttavia, è moralmente discutibile farlo senza il consenso esplicito dell'utente.
  • Un'applicazione Web non può eseguire un timer in modo affidabile a causa di carichi di pagina ripetuti. Tuttavia, è possibile eseguire semplicemente un controllo ogni volta che viene caricata una pagina. Questo dipende molto dalla frequenza con cui ci si aspetta che l'utente cambi pagina.
  • Puoi anche eseguire un timer durante la vita di una singola pagina web, ma è significativo solo se non ti aspetti che l'utente cambi pagina tutte le volte. Inoltre, tieni presente che se l'utente ha più pagine aperte, ci saranno più timer, la concorrenza potrebbe essere un problema qui.
  • Se stai eseguendo l'applicazione su un server su cui hai il controllo, potresti anche avere un servizio Windows separato che è responsabile per l'invio degli aggiornamenti (e l'accodamento in caso di errori) e che l'applicazione invii sempre al servizio invece di Internet.

Ci sono molte soluzioni qui. Non posso scegliere quello giusto per te, che dipende da molti fattori come la complessità del codice, la robustezza, la certezza che gli aggiornamenti vengano inviati in modo tempestivo, ...

    
risposta data 28.08.2018 - 09:56
fonte
0

Non sono sicuro che si tratti di un'app desktop o di un'app Web, ma se si tratta di un'applicazione desktop, il database leggero come sqlite o il servizio di memorizzazione nella cache possono essere d'aiuto. oppure puoi derivare il tuo metodo (json, csv) ecc. assicurandoti sicurezza e offuscamento.

Analogamente, per l'app web puoi utilizzare la localizzazione o qualcosa del genere se i tuoi dati non sono troppo grandi.

    
risposta data 28.08.2018 - 09:39
fonte

Leggi altre domande sui tag