Отправка сообщений буфера протокола Google между C # и Java

#java #c# #sockets #rabbitmq #protocol-buffers

#java #c# #сокеты #rabbitmq #протокол-буферы

Вопрос:

Я пытаюсь получить хороший образец программы для отправки сообщений буфера протокола Google на сервер Java и с него на клиент c #. Я использую RabbitMQ для этой цели, но обнаружил, что служба RabbitMQ не настолько надежна и через некоторое время выходит из строя. В качестве резервной копии я хочу использовать опцию сокета на случай, если RabbitMQ не работает. У меня есть такой код на Java

 ProtoBuffMessage.MessageProtBuff msgItem = clsBuilder.build();
ByteArrayOutputStream oStream = new ByteArrayOutputStream();
msgItem.writeTo(oStream);
...  
...
//Send it to RabbitMQ
m_clsChannel.basicPublish(m_clsAppSettings.getRabbitMqExchangeName(), m_clsAppSettings.getRabbitMqExchangeQueue(), null, oStream.toByteArray());
  

на стороне C # у меня есть такой код для получения и анализа данных

      using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.ExchangeDeclare(exchange: "direct_logs",
                                    type: "direct");
            var queueName = channel.QueueDeclare().QueueName;



            channel.QueueBind(queue: queueName,
                              exchange: "direct_logs",
                              routingKey: "amr");

            var consumer = new EventingBasicConsumer(channel);
                    consumer.Received  = (model, ea) =>
                    {
                        var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                            var routingKey = ea.RoutingKey;
                            Console.WriteLine(" [x] Received {0}':'{1}'",
                                              routingKey, message);


                            Messaging.MessageProtBuff.Builder builder = new Messaging.MessageProtBuff.Builder();
                            builder.MergeFrom(body);

                            Messaging.MessageProtBuff data = builder.Build();
                                Console.WriteLine(data.Comment);
                    }
         }
  

Это работает с RabbitMQ, если он работает правильно. Теперь я хочу знать, как мне использовать сокеты для отправки того же самого, получать его на клиенте C # и восстанавливать объект. Предпочтительно я хотел бы использовать тот же объект ByteArrayOutputStream oStream в коде Java. Преобразуя его в массив байтов, я могу отправить его через scocket и восстановить объект на другом конце.
Я адаптировал этот пример в своем коде:
http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

но в этом руководстве они отправляют строки. Я хочу отправить массив байтов. Как это сделать в конце java и как проанализировать то же самое в конце C #?

Комментарии:

1. «Служба RabbitMQ не настолько надежна и некоторое время выходит из строя» — вы поняли, почему?

2. @AlexeyGroshev Я не эксперт в RabbitMQ. Потребуется время, чтобы разобраться в этом, и это то, чего у нас сейчас нет. Похоже, это проблема с Erlang, возможно, проблемы с памятью, но мы не уверены. Если вы можете рассказать нам, как это расследовать, дайте нам знать.

3. > Похоже, проблема с Erlang, возможно, проблемы с памятью, но мы > не уверены, что проблем с памятью Erlang нет. Проблемы с памятью, связанные с RabbitMQ, часто связаны с неправильными конфигурациями / настройками. > Я обнаружил, что служба RabbitMQ не настолько надежна и иногда вылетает > в версии были исправлены две основные проблемы 3.6.4 : — github.com/rabbitmq/rabbitmq-management/issues/245 github.com/rabbitmq/rabbitmq-management/issues/185 Эти ошибки возникали только при определенных условиях загрузки. Конфигурация кластера предотвращает любую возможную проблему сбоя