2016-07-26 1 views
0

Je fais un simple système de messagerie pour un Windows Mobile en C#. L'application consiste à envoyer et recevoir des messages texte simples en utilisant une communication de service Web. La file d'attente des messages doit être persistante, évitant ainsi la perte de données en cas d'échec de la connexion avec le service Web ou de blocage de l'application. Je connais MSMQ, RabbitMQ, DotNetMQ, mais ils doivent être installés dans le périphérique et ce sont des périphériques très simples, je ne veux pas installer d'autres outils dans chacun des mobiles juste pour cette tâche simple.File simple de messages persistants en C# pour un seul processus

J'ai déjà implémenté la fonction pour écrire une file d'attente sérialisée XML avec les messages dans un fichier et je lis et écris tout le temps à partir de ce fichier.

J'apprécierais une meilleure idée pour résoudre ce problème. Merci

+0

Windows Mobile est obsolète depuis des années. Voulez-vous dire Windows Phone ou Windows 10 Mobile? Si oui, pourquoi ne pas simplement utiliser les notifications push? – EJoshuaS

+0

Windows Mobile 6.5! et oui ils sont vieux! ils sont utilisés pour un très petit nombre de tâches, comme cette application de messagerie. –

Répondre

0

Bien sûr, il est préférable d'utiliser SQLite. J'espère que cela vous aidera.

0

Je ne sais pas vraiment ce qui est disponible pour Windows Mobile mais vous pouvez essayer d'utiliser la file d'attente de base (normale ou simultanée, dépend de votre application) accompagnée de deux fichiers. Ecrivez tout ce qui est mis en file d'attente dans un fichier "Enqueue log" et écrivez tout ce qui est retiré dans un autre fichier "Dequeue log". Ces deux fichiers peuvent toujours vous fournir suffisamment d'informations pour restaurer votre file d'attente et vous n'avez pas besoin de réécrire entièrement/de sérialiser complètement votre file d'attente. Il doit être mis en œuvre à la main si. A propos de dequeue: par exemple, disons que j'ai une file d'attente avec 3 messages: "un", "deux", "trois". Maintenant, je veux envoyer le prochain (aussi le premier) message "un". J'ajoute la ligne "one - en commençant la suppression de la file d'attente" à mon "dequeue log", puis j'enlève "one" de mon objet file d'attente et l'envoie là où je veux l'envoyer. Quand il est envoyé, j'ajoute "- Fin de la suppression de la file d'attente" à mon "journal de file d'attente". Maintenant, j'ai une ligne "one - commencer le retrait de la file d'attente - fin de la suppression de la file d'attente" dans mon fichier journal.

Peu importe quand je plante, je serai toujours capable de restaurer l'état de l'objet file (au moins pour l'instant je ne vois aucune erreur de logique dans ce processus). Donc, à mon humble avis, ce n'est pas compliqué mais tout de même ... du code devrait être codé. Et ce serait quelques pages de code.

+0

De plus, ces deux fichiers doivent être nettoyés de temps en temps de manière "persistante". Par exemple, lorsque "Dequeue log" devient plus long que 1000 messages, créez un nouveau "Dequeue log 2" puis supprimez l'ancien. Idem pour "Enqueue log" en ce qui concerne les messages doivent être supprimés avant de pouvoir être supprimés. –

+0

je vous remercie pour la réponse, en fait je fais quelque chose de similaire à votre idée.Comme mes messages sont récupérés en XML par le service Web SOAP, je ne fais qu'ajouter les messages dans un fichier, de cette façon la file d'attente et getTheFirstElement est facile, la partie délicate est la dequeue. –

+0

@MariaSilvia a édité ma réponse juste au cas où je pense au processus de dequeue. Pour autant que je me souvienne c'est comment je l'ai fait (j'ai dû mettre en application persistant. Net MQ pour le système principal). –

0

MSMQ n'a pas besoin d'être installé est pris en charge nativement sur les périphériques Windows Mobile 6.5. BTW: il existe encore de nombreux fournisseurs dans la zone industrielle fournissant des appareils basés sur WM65, donc ce n'est pas encore périmé.

Le MSMQ Windows Mobile (CE) est persistant et simple à utiliser. Il est normalement utilisé pour la communication interprocessus sur le périphérique ou pour la communication avec le serveur client (ce qui nécessite l'installation de MSMQ sur le 'serveur'). Ainsi, le thread principal crée un MSMQ, un thread dans votre processus remplit le MSMQ et un autre peut "peek" et, après une transmission réussie, "débarrasser" les messages du même MSMQ. Voir here pour un exemple simple.

+0

J'ai essayé de créer la file d'attente de messages dans l'appareil sans l'installer et cela m'a donné une exception: "Message Queuing n'a pas été installé sur cet ordinateur." –

+0

Peut-être que vous avez essayé la mauvaise implémentation msmq? Voir l'exemple de code sur https://github.com/hjgode/rdmInject/blob/master/RDM_msg_queue/msgqueue.cs. C'est un code pour traiter les msgs postés par le code dll rdm_inject. BTW: il existe déjà de nombreuses implémentations MSMQ au démarrage de WM pour vous permettre de regarder les changements de périphériques PowerNotifications ou PlugNPlay etc. J'ai utilisé plusieurs de ces projets dans mes projets hébergés sur github (ie https://github.com/hjgode/logging_ce/blob /master/PowerMsgLog/PowerMsgQueue.cpp et thers dans ce dossier logging_ce) – josef