Напишите комиссионный сервер на scala, используя scrooge и клиент на python или ruby.

Я хочу написать реализацию службы бережливости на Scala (используя Scrooge), но без использования Finagle, так как я не мог написать клиент ruby/python для серверов Finagle. Проблема в том, что со Скруджем служба, похоже, не реализует класс «Процессор».

Предположим, у меня есть такое определение бережливости:

service TestService {
   void testFunction(1: string message);
}

и я сгенерировал файлы scala с помощью scrooge, когда попытался использовать стандартную реализацию thrift для scala с этим для запуска сервера:

val st = new TServerSocket(9999)
val processor = new TestService.Processor(new TestServiceImpl)
val arg = new TThreadPoolServer.Args(st)
arg.processor(processor) 
val server = new TThreadPoolServer(arg)
server.serve()

Сгенерированный объект TestService, похоже, не имеет внутреннего класса Processor. Есть идеи, как это сделать без Finagle? или как другое решение, как написать клиент python или ruby ​​для серверов бережливости finagle?


person Ahmed Soliman Farghal    schedule 18.07.2012    source источник


Ответы (3)


Судя по проекту, с которым вы связаны, видно, что у вас несоответствие транспорта между клиентом и сервером.

Ваш клиент Python использует буферизованный транспорт:

transport = TTransport.TBufferedTransport(transport)

Но ваш сервер scala использует фреймовый транспорт:

.codec(ThriftServerFramedCodec())

Если вы измените клиент python для использования фреймового транспорта, ваша проблема должна исчезнуть:

transport = TTransport.TFramedTransport(transport)
person Walter Blaurock    schedule 19.07.2012

Вы должны использовать реализацию finagle бережливости со Скруджем. Обратите внимание, что все они совместимы с проводами и IDL, поэтому вы можете использовать любые реализации, которые хотите, при условии, что вы используете IDL совместно.

Вы можете написать клиентов на Ruby или Python для службы бережливости finagle: она использует один и тот же протокол.

person marius a. eriksen    schedule 18.07.2012
comment
Это не работает, у меня есть метод с именем freeze(), который возвращает Future[Unit], и клиент python просто зависает при попытке его вызвать. Обратите внимание, что я использую scala-bootstrapper - person Ahmed Soliman Farghal; 19.07.2012
comment
Что именно возвращает метод? Future.value? Можете ли вы вставить код? - person marius a. eriksen; 19.07.2012
comment
Это код def freeze(s: String): Future[Unit] = { println("Frozen:" + s); Future.Unit } - person Ahmed Soliman Farghal; 19.07.2012
comment
Как насчет настройки? Это должно отлично работать с ванильными сберегательными клиентами. Можете ли вы показать мне строку ServerBuilder? Был бы признателен за более полный пример - трудно сказать, что не так с тем, что у вас есть. - person marius a. eriksen; 19.07.2012
comment
Вот пример проекта ссылка, запустите сервер с помощью sbt run, клиент python client.py. - person Ahmed Soliman Farghal; 19.07.2012
comment
Мариус, ты хочешь сказать, что нет никакого способа/причины использовать scrooge, если ты не используешь опцию --finagle? т.е. что 17032602 в основном недопустимый вопрос? - person Robert Fleming; 21.02.2014

Моя проблема была решена с использованием одного и того же транспорта как в python, так и в scala.

в моем клиенте Python.

transport = TTransport.TFramedTransport(transport)

Вы можете найти работающий образец по ссылке.

person Ahmed Soliman Farghal    schedule 19.07.2012