2015-12-15 2 views
1

Я использую рубин 2.1.2 стресс-тест сервиса Java следующим образом:рубин: бережливость ошибка - ожидаемый протокол идентификатор -126, но получил 60

(begin thread) 
url = "http://service.ops.net/api" 
transport = Thrift::HTTPClientTransport.new(url) 
protocol = Thrift::CompactProtocol.new(transport) 
client = MyService::Client.new(protocol) 
transport.open() 

client.<somefunctioncall> 
(end thread) 

...

(join thread) 
(exit and begin next pass) 

Это вызвано сочетанием действительных и полуограниченных параметров. Это работает нормально, пока я вызываю только одну конечную точку. Если я нить из вызовов ударить> 1 конечную точку, в то время (IE вызвать две функции из разных потоков) я начинаю видя исключения, как так:

`read_message_begin': Ожидаемый идентификатор протокола -126, но получил 60 (Thrift :: ProtocolException)

Я не могу найти разумную ссылку, чтобы знать, что это говорит мне.

ответ

1

В сообщении говорится, что данные не могут быть десериализованы, потому что они выглядят поврежденными. Однако это не означает, что они действительно повреждены.

Скорее всего, причина в том, что клиент и сервер не используют тот же транспортный стек &.

Типичная ошибка для создания такой ситуации - использовать TFramedTransport на одном конце, а на другом конце нет. Транспортировка Thrift может добавлять (и ожидать) дополнительные данные к данным на проводе, и особенно TFramedTransport делает это, добавляя 4-байтовый заголовок, который содержит размер кадра.

Следует отметить, что некоторые типы серверов неявно ожидают, что клиент будет использовать TFramedTransport. Поэтому, если вы проверили оба конца и сравнили используемый протокол и транспортный стек, это может быть другой причиной.

+0

Сообщение отправлено несколько случайно. Таким образом, подразумевается, что данные коррумпируются несистематически? – ethrbunny

+0

Можем ли мы увидеть какой-нибудь настоящий код? – JensG

Смежные вопросы