private static void StartShellLoop(string shellAddress, string ioPubAddress) { ShellRouterSocket.Bind(shellAddress); Log.Info($"Bound shell server to address {shellAddress}"); ShellPublisherSocket.Bind(ioPubAddress); Log.Info($"Bound IO pub to address {ioPubAddress}"); while (!StopEvent.Wait(0)) { var message = GetNextMessage(); Log.Info($"Received message {JsonSerializer.Serialize(message)}"); if (MessageHandlers.TryGetValue(message.Header.MessageType, out IShellMessageHandler handler)) { Log.Info($"Sending message to {message.Header.MessageType} handler"); handler.HandleMessage(message, ShellRouterSocket, ShellPublisherSocket); Log.Info("Message handling complete"); } else { Log.Error($"No message handler found for message type {message.Header.MessageType}"); } } }
private static Message GetNextMessage() { var message = new Message(); // There may be additional ZMQ identities attached; read until the delimiter <IDS|MSG>" // and store them in message.identifiers // http://ipython.org/ipython-doc/dev/development/messaging.html#the-wire-protocol var delimAsBytes = Encoding.ASCII.GetBytes(Constants.Delimiter); while (true) { var delim = ShellRouterSocket.ReceiveFrameBytes(); if (delim.SequenceEqual(delimAsBytes)) { break; } message.Identifiers.Add(delim); } // Getting Hmac message.HMac = ShellRouterSocket.ReceiveFrameString(); Log.Info(message.HMac); // Getting Header var header = ShellRouterSocket.ReceiveFrameString(); Log.Info(header); message.Header = JsonSerializer.Deserialize <Header>(header); // Getting parent header var parentHeader = ShellRouterSocket.ReceiveFrameString(); Log.Info(parentHeader); message.ParentHeader = JsonSerializer.Deserialize <Header>(parentHeader); // Getting metadata var metadata = ShellRouterSocket.ReceiveFrameString(); Log.Info(metadata); message.Metadata = JsonSerializer.Deserialize <Dictionary <string, object> >(metadata); // Getting content var content = ShellRouterSocket.ReceiveFrameString(); Log.Info(content); message.Content = content; return(message); }