Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 远程端已关闭TJsonprotocol中的TTTransportException/EOF异常_C#_Facebook_Activemq_Thrift - Fatal编程技术网

C# 远程端已关闭TJsonprotocol中的TTTransportException/EOF异常

C# 远程端已关闭TJsonprotocol中的TTTransportException/EOF异常,c#,facebook,activemq,thrift,C#,Facebook,Activemq,Thrift,我正在尝试将Thrift与c#中的ActiveMQ集成。我的发布者和订阅者消息以正确的方式进行序列化和反序列化。但在最后一步,我得到了TJSONProtocol下的异常,如“Remote side has closed”。下面这一行显示了错误 ///<summary> /// Return and consume the next byte to be Read, either taking it from the /// data buffer if

我正在尝试将Thrift与c#中的ActiveMQ集成。我的发布者和订阅者消息以正确的方式进行序列化和反序列化。但在最后一步,我得到了TJSONProtocol下的异常,如“Remote side has closed”。下面这一行显示了错误

///<summary>
        /// Return and consume the next byte to be Read, either taking it from the
        /// data buffer if present or getting it from the transport otherwise.
        ///</summary>
        public byte Read()
        {
            if (hasData)
            {
                hasData = false;
            }
            else
            {                   
              proto.trans.ReadAll(data, 0, 1);
            }
            return data[0];
        }
ActiveMQTransport类

 public delegate void MessageReceivedEventHandler(string message, string correlationId);
public class ActiveMQTransport : TTransport
{
    private MemoryStream _inputStream;
    private MemoryStream _outputStream;
    private ActiveMQServerUtil _activeMq;

    private string _corelationId;

    /// <summary>
    /// constructor
    /// </summary>
    /// <param name="activeMq"></param>
    public ActiveMQTransport()
        : this(new MemoryStream(), new MemoryStream())
    {

    }

    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="inputStream"></param>
    /// <param name="outputstream"></param>
    /// <param name="activeMq"></param>
    public ActiveMQTransport(MemoryStream inputStream, MemoryStream outputstream)
    {
        _inputStream = inputStream;
        _outputStream = outputstream;
        _activeMq = ActiveMQServerUtil.GetActiveMQServerUtil();
        _activeMq.MessageReceived += new MessageReceivedEventHandler(_activeMq_MessageReceived);
    }


    public ActiveMQTransport Accept()
    {
        IMessage message = _activeMq.Receive();
        ITextMessage textMessage = message as ITextMessage;
        _activeMq_MessageReceived(textMessage.Text, textMessage.NMSCorrelationID);
        return this;
    }

    /// <summary>
    /// Read Message and write onto transport input stream
    /// </summary>
    /// <param name="message"></param>
    /// <param name="correlationId"></param>
    private void _activeMq_MessageReceived(string message, string correlationId)
    {

        byte[] opMessage = Encoding.UTF8.GetBytes(message);
        _corelationId = correlationId;
        //_inputStream = new MemoryStream();
        _inputStream.Write(opMessage, 0, message.Length);
        _inputStream.Position = 0;
        Console.WriteLine("CorelationId: {0}, Listner Message: {1}"
                          , correlationId, message);
    }

    public override bool IsOpen
    {
        get { return true; }
    }

    public override void Open()
    {

    }

    public override void Close()
    {

    }

    public override int Read(byte[] buf, int off, int len)
    {
        try
        {
            int i= _inputStream.Read(buf, off, len);
            return i;
        }
        catch(Exception ex)
        {
            return 0;
        }
    }

    public override void Write(byte[] buf, int off, int len)
    {
        _outputStream.Write(buf, off, len);
    }

    /// <summary>
    /// Flush result to ActiveMQ
    /// </summary>
    public override void Flush()
    {
        _activeMq.Send(Encoding.UTF8.GetString(_outputStream.ToArray()), this._corelationId);
        _outputStream = new MemoryStream();
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
        }
    }
}
以下是客户端自定义传输

 public class ThriftJmsTransport : TTransport
{
    public delegate void MessageReceivedEventHandler(string message);
    protected MemoryStream inputStream=new MemoryStream();
    protected MemoryStream outputStream=new MemoryStream();
    Listener listener = new Listener();
    public ThriftJmsTransport()
    {

    }

    public ThriftJmsTransport(MemoryStream inputStream, MemoryStream outputStream)
    {
        this.inputStream = inputStream;
        this.outputStream = outputStream;
    }

    public Stream OutputStream
    {
        get { return outputStream; }
    }

    public Stream InputStream
    {
        get { return inputStream; }
    }


    public override void Close()
    {
        if (inputStream != null)
        {
            inputStream.Close();
            inputStream = null;
        }
        if (outputStream != null)
        {
            outputStream.Close();
            outputStream = null;
        }
    }



    public override bool IsOpen
    {
        get { return true; }
    }

    public override void Open()
    {
       // listener.Initialize();
        listener.Intitializelistner();
       // Listener.MessageReceived += new MessageReceivedEventHandler(_activeMq_MessageReceived);
    }

    void _activeMq_MessageReceived(string message)
    {

        inputStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(message));
        Console.WriteLine(message);
        inputStream.Position = 0;
       // _signal.Set();
    }

    public override int Read(byte[] buf, int off, int len)
    {
        if (inputStream == null)
        {
            throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot read from null inputstream");
        }

        return inputStream.Read(buf, off, len);
    }

    public override void Write(byte[] buf, int off, int len)
    {
        if (!outputStream.CanWrite)
            outputStream = new MemoryStream();

        outputStream.Write(buf, off, len);
    }

    public override void Flush()
    {
        //if (outputStream == null)
        //{
        //    throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot flush null outputstream");
        //}
        if (outputStream != null)
        {
           // StreamReader reader = new StreamReader(outputStream);
            string text = System.Text.Encoding.Default.GetString(outputStream.ToArray());
            Send(text);
        }
    }

    public void Send(string message)
    {
        var publisher=new Publisher();
        publisher.SendMessage(message);
    }

    #region " IDisposable Support "
    private bool _IsDisposed;

    // IDisposable
    protected override void Dispose(bool disposing)
    {
        if (!_IsDisposed)
        {
            if (disposing)
            {
                if (InputStream != null)
                    InputStream.Dispose();
                if (OutputStream != null)
                    OutputStream.Dispose();
            }
        }
        _IsDisposed = true;
    }
    #endregion
}

在没有更多信息的情况下,几乎无法回答。那代码叫什么名字?我们可能有呼叫堆栈吗?您是否知道从调试器中执行代码实际上会产生副作用?数据是什么样子的?一个接一个的问题。我对thrift和activemq非常陌生,您是否有任何代码剪贴,可以在c#中将thrift与activemq集成?如果您有帮助,请查看,这里有一些示例可能会澄清问题。没有什么特别针对ActiveMQ的,但是针对其他MQ系统。我仍然可以要求(再次)调用堆栈吗?由于某种官方安全原因,我无法提供调用堆栈…感谢您的建议..如果您可以查看一下代码的话
 public class Listener 
{
    public const string DESTINATION = "Topic1to2";
    ActiveMQTransport activeMq = new ActiveMQTransport();
    public static Queue<IMessage> Processqueue = new Queue<IMessage>();

    public Listener()
    {

    }


    private void PutMessageinQueue(ITextMessage message)
    {
        if (!string.IsNullOrEmpty(message.Text))
        {
            Processqueue.Enqueue(message);
        }
    }

    private void consumer_Listener(IMessage message)
    {
        ITextMessage textMessage = message as ITextMessage;
        Console.WriteLine(textMessage.Text);
        if (!string.IsNullOrEmpty(textMessage.Text))
        {
            Processqueue.Enqueue(textMessage);
        }

    }

   public void Intitializelistner()
    {

        IConnectionFactory factory = new
           ConnectionFactory("activemq:tcp://localhost:61616/");
        //Create the connection 
        using (IConnection connection =
           factory.CreateConnection())
        {
           // connection.ClientId = "testing listener";
            connection.Start();

            //Create the Session 
            using (ISession session = connection.CreateSession())
            {
                //Create the Consumer 
                IMessageConsumer consumer = session.CreateConsumer(
                   new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic(
                   DESTINATION));
                consumer.Listener += new MessageListener(
                   consumer_Listener);
                Console.ReadLine();
            }
        }
    }

   //static void consumer_Listener1(IMessage message)
   //{
   //    Console.WriteLine("Receive: " +
   //       ((ITextMessage)message).Text);
   //}


}
public class Publisher : BaseClass
{
    public const string DESTINATION = "Topic2to1";
    public Publisher()
    {
    }



    public void SendMessage(string message)
    {

        IConnectionFactory factory = new ConnectionFactory("activemq:tcp://localhost:61616/");

        using (IConnection connection = factory.CreateConnection())
        {
            //Create the Session 
            using (ISession session = connection.CreateSession())
            {
                //Create the Producer for the topic/queue 
                IMessageProducer prod = session.CreateProducer(new ActiveMQTopic(DESTINATION));
                //Send Messages 
                //  int i = 0;
                //  while (!Console.KeyAvailable)
                {
                    ITextMessage msg = prod.CreateTextMessage();
                    msg.Text = message;
                    Console.WriteLine("Sending: " + msg.Text);
                    prod.Send(msg);
                    System.Threading.Thread.Sleep(250);
                    // i++;
                }
            }
        }
        Console.ReadLine();
    }

}
 public class ThriftJmsTransport : TTransport
{
    public delegate void MessageReceivedEventHandler(string message);
    protected MemoryStream inputStream=new MemoryStream();
    protected MemoryStream outputStream=new MemoryStream();
    Listener listener = new Listener();
    public ThriftJmsTransport()
    {

    }

    public ThriftJmsTransport(MemoryStream inputStream, MemoryStream outputStream)
    {
        this.inputStream = inputStream;
        this.outputStream = outputStream;
    }

    public Stream OutputStream
    {
        get { return outputStream; }
    }

    public Stream InputStream
    {
        get { return inputStream; }
    }


    public override void Close()
    {
        if (inputStream != null)
        {
            inputStream.Close();
            inputStream = null;
        }
        if (outputStream != null)
        {
            outputStream.Close();
            outputStream = null;
        }
    }



    public override bool IsOpen
    {
        get { return true; }
    }

    public override void Open()
    {
       // listener.Initialize();
        listener.Intitializelistner();
       // Listener.MessageReceived += new MessageReceivedEventHandler(_activeMq_MessageReceived);
    }

    void _activeMq_MessageReceived(string message)
    {

        inputStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(message));
        Console.WriteLine(message);
        inputStream.Position = 0;
       // _signal.Set();
    }

    public override int Read(byte[] buf, int off, int len)
    {
        if (inputStream == null)
        {
            throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot read from null inputstream");
        }

        return inputStream.Read(buf, off, len);
    }

    public override void Write(byte[] buf, int off, int len)
    {
        if (!outputStream.CanWrite)
            outputStream = new MemoryStream();

        outputStream.Write(buf, off, len);
    }

    public override void Flush()
    {
        //if (outputStream == null)
        //{
        //    throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot flush null outputstream");
        //}
        if (outputStream != null)
        {
           // StreamReader reader = new StreamReader(outputStream);
            string text = System.Text.Encoding.Default.GetString(outputStream.ToArray());
            Send(text);
        }
    }

    public void Send(string message)
    {
        var publisher=new Publisher();
        publisher.SendMessage(message);
    }

    #region " IDisposable Support "
    private bool _IsDisposed;

    // IDisposable
    protected override void Dispose(bool disposing)
    {
        if (!_IsDisposed)
        {
            if (disposing)
            {
                if (InputStream != null)
                    InputStream.Dispose();
                if (OutputStream != null)
                    OutputStream.Dispose();
            }
        }
        _IsDisposed = true;
    }
    #endregion
}