#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 Эти ошибки возникали только при определенных условиях загрузки. Конфигурация кластера предотвращает любую возможную проблему сбоя