예제 #1
0
        /// <summary>
        /// removed since v0.5
        /// </summary>
        /// <param name="cmd"></param>
        /// <param name="messageDelegate"></param>
        public void Send(HMessage message, Action <HMessage> messageDelegate)
        {
            if (this.connectionStatus != ConnectionStatus.CONNECTED)
            {
                notifyResultError(message.GetMsgid(), ResultStatus.NOT_CONNECTED, "Not connected.", messageDelegate);
                return;
            }
            if (message == null)
            {
                notifyResultError(null, ResultStatus.MISSING_ATTR, "Provided message is null.", messageDelegate);
                return;
            }
            if (message.GetActor() == null)
            {
                notifyResultError(message.GetMsgid(), ResultStatus.MISSING_ATTR, "Actor is missing.", messageDelegate);
                return;
            }
            message.SetSent(DateTime.UtcNow);
            message.SetPublisher(transportOptions.FullUrn);
            if (message.GetTimeout() > 0)
            {
                // hAPI will do correlation. If no answer within the
                // timeout, a timeout error will be sent.
                if (messageDelegate != null)
                {
                    message.SetMsgid(Guid.NewGuid().ToString());
                    messageDelegates.Add(message.GetMsgid(), messageDelegate);

                    ThreadPoolTimer timeOutTimer = ThreadPoolTimer.CreateTimer((obj) =>
                    {
                        notifyResultError(message.GetMsgid(), ResultStatus.EXEC_TIMEOUT, "The response of message is time out.", null);
                    }, new TimeSpan(0, 0, 0, 0, message.GetTimeout()));

                    timerOutDictionary.Add(message.GetMsgid(), timeOutTimer);
                }
                else
                {
                    //when there is no callback, timeout has no sense. delete timeout.
                    message.SetTimeout(0);
                }
            }
            transportManager.SendObject(message);
        }