2017-07-07 3 views
0

J'écris un gestionnaire d'arrêt pour un programme qui utilise le serveur JSON-RPC intégré de Golang et j'ai rencontré une difficulté. Pourriez-vous m'aider avec? J'arrête d'accepter les connexions entrantes, arrête d'accepter les demandes entrantes pour les connexions existantes (envoyer une erreur, pour être vrai) mais j'ai un moment que je ne peux pas contrôler ou, au moins, je ne sais pas comment contrôler.Commande de serveur JSON-RPC de Golang à l'arrêt

La question est:

Comment puis-je garantir que les résultats de exisiting Les demandes de connexions existantes sont données aux clients de haut-JSON-RPC serveur de golang?

Je veux contrôler cette structure qui appelle les méthodes RPC, mais ce n'est pas dans mon code. Par exemple, j'ai une action RPC 'User.Get'. J'ai une fonction nommée 'Get' que je contrôle. Comment puis-je contrôler le code qui démarre cette fonction "Get"? Dois-je modifier le serveur RPC de Google ou y a-t-il un moyen plus efficace?

Peut-être, il y a une variable dans le serveur RPC qui contient le nombre de demandes actives en cours de traitement?

Je vois un NumCalls() et numCalls dans le methodType dans https://golang.org/src/net/rpc/server.go. Le problème est que ce champ n'est pas public ... En outre, le .../rpc/server.go utilise sync.Map qui ne compile pas. Ma version de Golang est trop vieille? :)

Il semble que pour l'instant le moyen le plus simple est de manipuler un compteur global de toutes les fonctions d'action RPC. :-) Si vous connaissez une meilleure solution, s'il vous plaît, dites-moi. Merci. :-)

Répondre

0

Dans net/rpc exemple Godoc, il montre juste comment utiliser les valeurs par défaut globales. Créez plutôt vos propres instances de serveur rpc et http.

import "net/rpc" 
import "net/http" 

rpcServer := rpc.NewServer() 
// rpc stuff 
httpServer := &http.Server{ 
    Handler: rpcServer, 
} 
// graceful shutdown stuff 

Pour une fermeture élégante, il y a quelques paquets. Je connais celui-ci.