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(); }
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; } }
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); } }