LINUX.ORG.RU

java: свой rpc с азартными играми и жрицами


0

0

Задача реализовать rpc причем вызов будет происходить из вебстраницы, пишется базовый класс, реализующий метод listCommands. Сей метод получает список методов предусмотренных для вызова из rpc.

Тут все тривиально. А вот при вызове из вебстраницы приходят данные не имеющие типа, а Class.getMethod требует списка аргументов, который никак не получить. Можно тупо перебирать все методы класса но тогда теряется полиморфизьм, или есть другой выход? Как вообще такое делают?

★★☆

public interface Command {
  Object invoke(Object[] data) throws Exception;
}

...

HashMap<String, Command> _commands;


...
String methodName = getMethodName(request);
Object[] data = parseRequestParams(request);
Command c = _commands.get(methodName);
if (c != null) {
  c.invoke(data);
} else {
  // handle error here
}

ЗЫ: Проще надо быть

Absurd ★★★
()
Ответ на: комментарий от wfrr

щас пока вот так но не будет ли все это будет проседать:

  public Object invoke(Command c) throws Exception{
    Class thisCl = this.getClass();
    Object[] args = c.getArgs();
    Class[] argCl = new Class[args.length];
    for(int i = 0; i < args.length; i++ ){
      argCl[i] = (args[i] != null)?args[i].getClass():null;
    }
    Method m = thisCl.getMethod(c.getMethod(), argCl);
    Object res = null;
    res = m.invoke(this, args);
    return res;
  }

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

>Ой вей, хотелось бы помучится.

Еще есть runtime аннотации начиная с Java 1.5. Их можно использовать для автоматической генерации мапа.

Absurd ★★★
()
Ответ на: комментарий от Absurd

Я их использую для документирования метода и маркировки методов для RPC:

public class ACHtester  extends  AbstractCommandHandler{

  @Cmd ("Это некий метод для чегото")
  public String getSomeValue(@CmdParam(desc="параметер", name="param") String param,
          @CmdParam(desc="юзер", name="user")  String user,
          @CmdParam(desc="хешмап", name="val")  HashMap<String, String> val){
    return "blah";
  }

}

с хешмапом проблема - из-за поиска только по имени теряется полиморфизм - придется передавать методу все аргументы даже если они не нужны.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

>из-за поиска только по имени теряется полиморфизм - придется передавать методу все аргументы даже если они не нужны.

Не понял. Что мешает передавать null по умолчанию?

Absurd ★★★
()
Ответ на: комментарий от Absurd

То что меня замучает икота, если те кому с этим работать будут на каждый пук передавать кучу null

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

>То что меня замучает икота, если те кому с этим работать будут на каждый пук передавать кучу null

Я не очень тебя понимаю. Что вообще мешает использовать SOAP, раздавая для динамической генерации стабов WSDL, как это делает Apache Axis?

Absurd ★★★
()
Ответ на: комментарий от Absurd

>Что вообще мешает использовать SOAP, раздавая для динамической генерации стабов WSDL, как это делает Apache Axis?

То что это будет мегаинтерпрайзно:
1) тормоза, JSON для жабаскриптов не требует разбора.
2) нужно изучать и внедрять кучу, нет. ТУЕВУ КУЧУ технологий, ради чего? я то могу изучить, но тем самым всех кто будет это поддерживать обреку на изучение. А соап ИМХО сверхперегруженная фигня.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

> тормоза, JSON для жабаскриптов не требует разбора.

Кстати, насчет тормозов, что дешевле разобрать XML или SXML, или один хрен?

anonymous
()
Ответ на: комментарий от wfrr

>нужно изучать и внедрять кучу, нет. ТУЕВУ КУЧУ технологий, ради чего? я то могу изучить, но тем самым всех кто будет это поддерживать обреку на изучение. А соап ИМХО сверхперегруженная фигня.

2 my mind не сложнее любого другого RPC. Взять какой-либо облегченный сервлет контейнер который можно заэмбедить в приложение в виде "соски сбоку", воткнуть в него Аксис-сервлет, задеплоить в аксис веб-сервис.

Absurd ★★★
()
Ответ на: комментарий от anonymous

а хто его знает, лучше тесты провести, будет весьма флеймообразующе

wfrr ★★☆
() автор топика
Ответ на: комментарий от Absurd

>2 my mind не сложнее любого другого RPC

сложнее получается, чем самописное, наверняка богаче по возможностям, но зачем? Да и тормоза.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

Еще существует факт надежности. Если у тебя система будет разростаться и ее надо будет усложнять, возможно, возникнут пробемы. Нужно очень хорошо проектировать и тестировать. В реализациях SOAP это уже сделано за тебя.

Ian ★★
()
Ответ на: комментарий от Ian

Поэтому создадим себе проблемы сразу:
- с производительностью
- с поддержкой
- интеграцией всего этого халама

Боюсь что надежность будет излишне низка в итоге.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

Откуда ты высосал проблемы с поддержкой и интеграцией?

Поддерживать то что ты там понапишешь сам, возможно, будет сложнее, чем SOAP.

Проблем с интеграцией быть не должно.

Да и на счет производительности, у тебя там рефлексия в коде, неизвестно как оно себя покажет.

В общем, делай как хочется - время покажет. :)

Ian ★★
()
Ответ на: комментарий от Ian

>возможно

Тото и оно, тут простая система из одного класса, которую может осилить школьник за час. А там ентерпрайзина.

>Проблем с интеграцией быть не должно.


Так говорят _ВСЕ_ маркетологи.

>неизвестно как оно себя покажет.


Веб сервисы тоже на рефлексии сделаны, зато тут нету хмл с кучей немспейсов.

>Посмотри на xml-rpc.


Это городить тоже самое но с хмл, и в чем радость от этого убожества?

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

xmlrpc хорош тем, что стандартизирован и имеет море библиотек под любой язык

Pi ★★★★★
()
Ответ на: комментарий от wfrr

> Веб сервисы тоже на рефлексии сделаны...

Dynamic, таки да, а вот на счет static не уверен. Снегерировал классы и радуешься жизни. Посмотри на Axis.

Ian ★★
()
Ответ на: комментарий от wfrr

>Тото и оно, тут простая система из одного класса, которую может осилить школьник за час. А там ентерпрайзина.

Ага, только вот эта энтерпрайзина стандартная, с кучей документации, с кучей спецов на рынке по ней, с несколькими реализациями стандартов, из которых можно выбирать, с поддержкой из разных языков (вплоть до поделий мелкомягких, с которыми это наименее безболезненный способ интеграции) с поддержкой внутри IDE всего этого дела итд.

>Проблем с интеграцией быть не должно.

>Так говорят _ВСЕ_ маркетологи.

Так говорят еще и люди, которые на этом два года писали сервак на жабке, а клиентов и на java и на .net, и на питоне тоже умельцы скрипты прикручивали к сервисам сервака.

Nagwal ★★★★
()
Ответ на: комментарий от Ian

>> Веб сервисы тоже на рефлексии сделаны...

>Dynamic, таки да, а вот на счет static не уверен. Снегерировал классы и радуешься жизни. Посмотри на Axis.

И в static тоже. Достаточно поставить брейкпоинт на входе в веб-сервис и посмотреть стектрейс при приходе запроса. Там посередине Method.invoke() точно есть.

Absurd ★★★
()
Ответ на: комментарий от Nagwal

Прежде чем готовить места для метанаций стоит ознакомится с темой. Спецов, нет, документация никому нахрен не нужна. Вес энтерпрайз идет строем под хвост коту как только я сдам проект. Других языков нет. => нафиг

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

Ну так бы и сказал, что заказчик лох позорный, и за его бабло можно спокойно поклепать свой развеселый велосипед, раздуть сроки (и может даже бюджеты), а что он будет с этим делать потом - нии..т. Тогда святое дело;)) Так бы и сказал сразу;))

Nagwal ★★★★
()
Ответ на: комментарий от wfrr

>И чего это ты такой толстый, прямо таки энтерпрайзный жабатролль

Ну вот хочется мне энтерпрайзно жабопотроллить. По крайней мере интереснее че в толксах какую-нибудь телепередачу по быдлоящику или очередной эмо-высер обсуждать.

И вообще, ты отклонился от темы. Нах..я велосипед то если есть, несколько лет уж как, практически индустриальный стандарт?

Nagwal ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.