public void Store(AMQPHeader message) { if (message.Code.Value == HeaderCodes.TRANSFER) { MessageResendTimer <AMQPHeader> timer = new MessageResendTimer <AMQPHeader>(message, _listener, this, false); Boolean added = false; if (!((AMQPTransfer)message).DeliveryId.HasValue) { Int32 packetID = _packetIDCounter; while (!added) { packetID = Interlocked.Increment(ref _packetIDCounter) % MAX_VALUE; try { _timersMap.Add(packetID, timer); added = true; } catch (ArgumentException) { //already exists } } AMQPTransfer countable = (AMQPTransfer)message; countable.DeliveryId = packetID; } else { _timersMap.Add((int)((AMQPTransfer)message).DeliveryId.Value, timer); } timer.Execute(_resendPeriod); } }
public static AMQPHeader getAMQP(IByteBuffer buf) { TLVAmqp list = TLVFactory.getTlv(buf); if (list.Code != AMQPType.LIST_0 && list.Code != AMQPType.LIST_8 && list.Code != AMQPType.LIST_32) { throw new MalformedMessageException("Received amqp-header with malformed arguments"); } AMQPHeader header = null; Byte byteCode = list.Constructor.getDescriptorCode().Value; HeaderCodes code = (HeaderCodes)byteCode; switch (code) { case HeaderCodes.ATTACH: header = new AMQPAttach(); break; case HeaderCodes.BEGIN: header = new AMQPBegin(); break; case HeaderCodes.CLOSE: header = new AMQPClose(); break; case HeaderCodes.DETACH: header = new AMQPDetach(); break; case HeaderCodes.DISPOSITION: header = new AMQPDisposition(); break; case HeaderCodes.END: header = new AMQPEnd(); break; case HeaderCodes.FLOW: header = new AMQPFlow(); break; case HeaderCodes.OPEN: header = new AMQPOpen(); break; case HeaderCodes.TRANSFER: header = new AMQPTransfer(); break; default: throw new MalformedMessageException("Received amqp-header with unrecognized performative"); } header.fillArguments((TLVList)list); return(header); }
public void ProcessAttach(String name, RoleCodes?role, Int64?handle) { if (role.HasValue) { //its reverse here if (role.Value == RoleCodes.RECEIVER) { Int64 realHandle = _usedOutgoingMappings[name]; //publish if (_usedOutgoingMappings.ContainsKey(name)) { for (int i = 0; i < pendingMessages.Count; i++) { AMQPTransfer currMessage = pendingMessages[i]; if (currMessage.Handle == realHandle) { pendingMessages.RemoveAt(i); i--; _timers.Store(currMessage); if (currMessage.Settled.Value) { _timers.Remove((Int32)currMessage.DeliveryId.Value); } _client.Send(currMessage); } } } } else { _usedIncomingMappings[name] = handle.Value; _usedMappings[handle.Value] = name; if (handle.Value >= _nextHandle) { _nextHandle = handle.Value + 1; } //subscribe _dbInterface.StoreTopic(name, QOS.AT_LEAST_ONCE); if (_listener != null) { _listener.MessageReceived(MessageType.SUBACK); } } } }
public void Publish(Topic topic, byte[] content, Boolean retain, Boolean dup) { AMQPTransfer transfer = new AMQPTransfer(); transfer.Channel = _channel; if (topic.Qos == QOS.AT_MOST_ONCE) { transfer.Settled = true; } else { transfer.Settled = false; } transfer.More = false; transfer.MessageFormat = new AMQPMessageFormat(0); MessageHeader messageHeader = new MessageHeader(); messageHeader.Durable = true; messageHeader.Priority = 3; messageHeader.Milliseconds = 1000; AMQPData data = new AMQPData(); data.Data = content; AMQPSection[] sections = new AMQPSection[1]; sections[0] = data; transfer.addSections(sections); if (_usedOutgoingMappings.ContainsKey(topic.Name)) { Int64 handle = _usedOutgoingMappings[topic.Name]; transfer.Handle = handle; _timers.Store(transfer); if (transfer.Settled.Value) { _timers.Remove((Int32)transfer.DeliveryId.Value); } _client.Send(transfer); } else { Int64 currentHandler = _nextHandle++; _usedOutgoingMappings[topic.Name] = currentHandler; _usedMappings[currentHandler] = topic.Name; transfer.Handle = currentHandler; pendingMessages.Add(transfer); AMQPAttach attach = new AMQPAttach(); attach.Channel = _channel; attach.Name = topic.Name; attach.Handle = currentHandler; attach.Role = RoleCodes.SENDER; attach.RcvSettleMode = ReceiveCodes.FIRST; attach.InitialDeliveryCount = 0L; AMQPSource source = new AMQPSource(); source.Address = topic.Name; source.Durable = TerminusDurability.NONE; source.Timeout = 0; source.Dynamic = false; attach.Source = source; _client.Send(attach); } }