internal void addProducer( ProducerId id, MessageProducer producer ) { if(!this.closing.Value) { this.producers.Add( id, producer ); } }
public void AddProducer(MessageProducer producer) { if(!this.closing) { ProducerId id = producer.ProducerId; this.producers[id] = producer; this.connection.addProducer(id, producer); } }
internal void DoSend(ActiveMQDestination destination, ActiveMQMessage message, MessageProducer producer, MemoryUsage producerWindow, TimeSpan sendTimeout) { ActiveMQMessage msg = message; if(destination.IsTemporary && !connection.IsTempDestinationActive(destination as ActiveMQTempDestination)) { throw new InvalidDestinationException("Cannot publish to a deleted Destination: " + destination); } if(IsTransacted) { DoStartTransaction(); msg.TransactionId = TransactionContext.TransactionId; } msg.RedeliveryCounter = 0; msg.BrokerPath = null; if(this.connection.CopyMessageOnSend) { msg = (ActiveMQMessage)msg.Clone(); } msg.OnSend(); msg.ProducerId = msg.MessageId.ProducerId; if(sendTimeout.TotalMilliseconds <= 0 && !msg.ResponseRequired && !connection.AlwaysSyncSend && (!msg.Persistent || connection.AsyncSend || msg.TransactionId != null)) { this.connection.Oneway(msg); if(producerWindow != null) { // Since we defer lots of the marshaling till we hit the wire, this // might not provide and accurate size. We may change over to doing // more aggressive marshaling, to get more accurate sizes.. this is more // important once users start using producer window flow control. producerWindow.IncreaseUsage(msg.Size()); } } else { if(sendTimeout.TotalMilliseconds > 0) { this.connection.SyncRequest(msg, sendTimeout); } else { this.connection.SyncRequest(msg); } } }
public IMessageProducer CreateProducer(IDestination destination) { MessageProducer producer = null; try { ActiveMQDestination dest = null; if(destination != null) { dest = ActiveMQDestination.Transform(destination); } producer = new MessageProducer(this, GetNextProducerId(), dest, this.RequestTimeout); producer.ProducerTransformer = this.ProducerTransformer; this.AddProducer(producer); this.Connection.Oneway(producer.ProducerInfo); } catch(Exception) { if(producer != null) { this.RemoveProducer(producer.ProducerId); producer.Close(); } throw; } return producer; }
/// <summary> /// Handle incoming commands /// </summary> /// <param name="commandTransport">An ITransport</param> /// <param name="command">A Command</param> protected void OnCommand(ITransport commandTransport, Command command) { if (command.IsMessageDispatch) { WaitForTransportInterruptionProcessingToComplete(); DispatchMessage((MessageDispatch)command); } else if (command.IsKeepAliveInfo) { OnKeepAliveCommand(commandTransport, (KeepAliveInfo)command); } else if (command.IsWireFormatInfo) { this.brokerWireFormatInfo = (WireFormatInfo)command; } else if (command.IsBrokerInfo) { this.brokerInfo = (BrokerInfo)command; this.brokerInfoReceived.countDown(); } else if (command.IsShutdownInfo) { // Only terminate the connection if the transport we use is not fault // tolerant otherwise we let the transport deal with the broker closing // our connection and deal with IOException if it is sent to use. if (!closing.Value && !closed.Value && this.transport != null && !this.transport.IsFaultTolerant) { OnException(new NMSException("Broker closed this connection via Shutdown command.")); } } else if (command.IsProducerAck) { ProducerAck ack = (ProducerAck)command as ProducerAck; if (ack.ProducerId != null) { MessageProducer producer = producers[ack.ProducerId] as MessageProducer; if (producer != null) { if (Tracer.IsDebugEnabled) { Tracer.DebugFormat("Connection[{0}]: Received a new ProducerAck -> ", this.ConnectionId, ack); } producer.OnProducerAck(ack); } } } else if (command.IsConnectionError) { if (!closing.Value && !closed.Value) { ConnectionError connectionError = (ConnectionError)command; BrokerError brokerError = connectionError.Exception; string message = "Broker connection error."; string cause = ""; if (null != brokerError) { message = brokerError.Message; if (null != brokerError.Cause) { cause = brokerError.Cause.Message; } } Tracer.ErrorFormat("Connection[{0}]: ConnectionError: " + message + " : " + cause, this.ConnectionId); OnAsyncException(new NMSConnectionException(message, cause)); } } else { Tracer.ErrorFormat("Connection[{0}]: Unknown command: " + command, this.ConnectionId); } }
/// <summary> /// Handle incoming commands /// </summary> /// <param name="commandTransport">An ITransport</param> /// <param name="command">A Command</param> protected void OnCommand(ITransport commandTransport, Command command) { if (command.IsMessageDispatch) { WaitForTransportInterruptionProcessingToComplete(); DispatchMessage((MessageDispatch)command); } else if (command.IsKeepAliveInfo) { OnKeepAliveCommand(commandTransport, (KeepAliveInfo)command); } else if (command.IsWireFormatInfo) { this.brokerWireFormatInfo = (WireFormatInfo)command; } else if (command.IsBrokerInfo) { this.brokerInfo = (BrokerInfo)command; this.brokerInfoReceived.countDown(); } else if (command.IsShutdownInfo) { if (!closing.Value && !closed.Value) { OnException(new NMSException("Broker closed this connection.")); } } else if (command.IsProducerAck) { ProducerAck ack = (ProducerAck)command as ProducerAck; if (ack.ProducerId != null) { MessageProducer producer = producers[ack.ProducerId] as MessageProducer; if (producer != null) { if (Tracer.IsDebugEnabled) { Tracer.Debug("Connection: Received a new ProducerAck -> " + ack); } producer.OnProducerAck(ack); } } } else if (command.IsConnectionError) { if (!closing.Value && !closed.Value) { ConnectionError connectionError = (ConnectionError)command; BrokerError brokerError = connectionError.Exception; string message = "Broker connection error."; string cause = ""; if (null != brokerError) { message = brokerError.Message; if (null != brokerError.Cause) { cause = brokerError.Cause.Message; } } OnException(new NMSConnectionException(message, cause)); } } else { Tracer.Error("Unknown command: " + command); } }