static void Main(string[] args)
        {
            IObserver <MQMessage> errorQueue = new OutboundMessageQueue("QM1", "DEV.DEAD.LETTER.QUEUE", host: "mqhost.local", port: 1414, channel: "DEV.APP.SVRCONN");

            IObservable <MQMessage> inbound  = new InboundMessageQueue("QM1", "DEV.QUEUE.1", host: "mqhost.local", port: 1414, channel: "DEV.APP.SVRCONN", errorQueue: errorQueue);
            IObserver <MQMessage>   outbound = new OutboundMessageQueue("QM1", "DEV.QUEUE.1", host: "mqhost.local", port: 1414, channel: "DEV.APP.SVRCONN");

            IObservable <string> stringObservable = new MQStringAdapterSubject(inbound);

            stringObservable.Subscribe(mqmessage => {
                log.Info($"Received message: {mqmessage}");
                // throw new Exception("Opsy");
            });

            while (true)
            {
                MQMessage message = new MQMessage();
                message.WriteString("hello");

                outbound.OnNext(message);
                Thread.Sleep(250);
            }

            Console.ReadLine();
        }
Exemple #2
0
 public void Invalidate(string reason)
 {
     if (IsInvalidated)
     {
         return;
     }
     Logger.ApplicationInstance.Warn("Connection invalidated: " + reason);
     IsInvalidated      = true;
     InvalidationReason = reason;
     Invalidated?.Invoke(this, new EventArgs());
     OutboundMessageQueue.Invalidate(reason);
 }
        public void Close()
        {
            try
            {
                idleTimer.Stop();
                idleTimer.Dispose();

                /* TODO: Update the request table so that any unsent messages will be sent next time the service runs.
                 * This may require adding an ID field to the Order class.
                 */
                while (OutboundMessageQueue.Count > 0)
                {
                    Message message = OutboundMessageQueue.Dequeue();

                    using (SqlConnection conn = new SqlConnection(ServiceMain.YamlSettings?.ServiceConfig?.ConnectionString))
                    {
                        foreach (Patient patientItem in message.Patients)
                        {
                            foreach (Order orderItem in patientItem.Orders)
                            {
                                using (SqlCommand command = conn.CreateCommand())
                                {
                                    command.CommandText = "UPDATE IMM_RequestOrders SET PendingSending = 1 WHERE ReqOrderID = @OrderID";
                                    command.Parameters.AddWithValue("@OrderID", orderItem.OrderID);
                                    command.ExecuteNonQuery();
                                }
                            }
                        }
                    }
                }
                ComPort.Close();
                AppendToLog($"Port closed: {ComPort.PortName}");
            }
            catch (Exception ex)
            {
                HandleEx(ex);
                throw;
            }
        }
Exemple #4
0
        public void PerformWriteCycle()
        {
            // Return if invalidated
            if (IsInvalidated)
            {
                return;
            }

            // Invalidate if exceeds our limitstele
            if (OutboundMessageQueue.QueueCount > Config.MaximumOutboundQueueSize)
            {
                Invalidate("Outbound queue size exceeded");
                return;
            }

            // Get all queued objects
            object message = OutboundMessageQueue.DequeueMessage();

            if (message == null && !_isPingResponseWriteDue && !_isPingRequestWriteDue)
            {
                return;
            }

            // Skip if already sending
            if (_isSending)
            {
                return;
            }
            lock (_isSendingLocker)
            {
                if (_isSending)
                {
                    return;
                }
                _isSending = true;
            }

            // Serialize message if present
            byte[] messageBuffer = null;
            byte[] intConversionBuffer;
            int    offset = 0;

            if (message != null)
            {
                using (MemoryStream strm = new MemoryStream())
                {
                    _formatter.Serialize(strm, message);
                    strm.Flush();
                    messageBuffer = strm.GetBuffer();
                }
            }

            // Send any outbound data
            byte[] outputBuffer = new byte[(messageBuffer == null ? 0 : messageBuffer.Length + 4) + (_isPingResponseWriteDue ? 8 : 0) + (_isPingRequestWriteDue ? 8 : 0)];
            if (_isPingResponseWriteDue)
            {
                intConversionBuffer = BitConverter.GetBytes(-2);
                Array.Copy(intConversionBuffer, 0, outputBuffer, offset, 4);
                offset += 4;
                intConversionBuffer = BitConverter.GetBytes(_lastPingRequestReceivedId);
                Array.Copy(intConversionBuffer, 0, outputBuffer, offset, 4);
                offset += 4;
                Logger.ApplicationInstance.Trace("Sending ping response with ID " + _lastPingRequestReceivedId);
                _isPingResponseWriteDue = false;
            }
            if (_isPingRequestWriteDue)
            {
                _expectedPingResponseId = _random.Next(Int32.MinValue, Int32.MaxValue);
                _pingRequestSendTime    = DateTime.UtcNow;
                _isAwaitingPingResponse = true;
                _isPingRequestWriteDue  = false;
                intConversionBuffer     = BitConverter.GetBytes(-1);
                Array.Copy(intConversionBuffer, 0, outputBuffer, offset, 4);
                offset += 4;
                intConversionBuffer = BitConverter.GetBytes(_expectedPingResponseId);
                Array.Copy(intConversionBuffer, 0, outputBuffer, offset, 4);
                offset += 4;
                Logger.ApplicationInstance.Trace("Sending ping request with ID " + _expectedPingResponseId);
                _isPingRequestWriteDue = false;
            }
            if (messageBuffer != null)
            {
                intConversionBuffer = BitConverter.GetBytes(messageBuffer.Length);
                Array.Copy(intConversionBuffer, 0, outputBuffer, offset, 4);
                offset += 4;
                Array.Copy(messageBuffer, 0, outputBuffer, offset, messageBuffer.Length);
            }
            if (_useSsl)
            {
                ((SslStream)_stream).BeginWrite(outputBuffer, 0, outputBuffer.Length, new AsyncCallback(SocketSendCallback), null);
            }
            else
            {
                ((NetworkStream)_stream).BeginWrite(outputBuffer, 0, outputBuffer.Length, new AsyncCallback(SocketSendCallback), null);
            }
        }