Similar presentations:
CHW. Corba Http Wrapped
1.
CHWCorba Http Wrapped
2.
Что плохого в корбе• Её никто не знает: ни как писать, ни что там внутри
• Не работает с NAT – никаких вам докеров или, упаси боже, кубернетисов
• Есть проблемы с сетью (кол-во портов, людям на объекте не понятно что
происходит внутри)
• Никаких готовых решений для неё (вытекает из 1)
И как быть?
• Переписать все драйвера (и ядро, и консоль)
3.
Корба драйвер4.
Drivers Repository5.
Asp/AAM/Suprema …6.
chw7.
Что по коду• Клиенты (делегаторы/драйверы)
TApolloPanel panel = TApolloPanelHelper.narrow(ServiceRefHolder.driversRespository().findObject(id);
panel.connect()
• Нам нужны кастомные реализации любого интерфейса – прокси объекты
• Сериализация – Jackson
• Добавим по вебсерверу богу вебсерверов в даждом драйвере
• Http Drivers Repository + клиент
8.
proxypublic static void main(String[] args) {
Object object = Proxy.newProxyInstance(Main.class.getClassLoader(),
new Class[]{ Runnable.class, Function.class },
new MyInvocationHandler() );
Runnable asRunnable = (Runnable) object;
asRunnable.run();
Function asFunction = (Function) object;
Object callResult = asFunction.apply("$$$");
System.out.println(callResult);
Supplier asSupplier = (Supplier) object;
}
run called
name > apply
argument > $$$
123
Exception in thread "main" java.lang.ClassCastException: class
jdk.proxy1.$Proxy0 cannot be cast to class java.util.function.Supplier
(jdk.proxy1.$Proxy0 is in module jdk.proxy1 of loader 'app';
java.util.function.Supplier is in module java.base of loader 'bootstrap')
static class MyInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("run")) {
System.out.println("run called");
return null;
} else if (method.getDeclaringClass() == Function.class) {
System.out.println("name > " + method.getName());
System.out.println("argument > " + args[0]);
return 123;
}
throw new IllegalArgumentException();
}
}
at org.example.Main.main(Main.java:22)
9.
схема10.
Как то просто, почему 3 месяца сидел?1. Проблемы в сериализации:
• Сериализация с абстрактыми полями. - Планы
• Десериализация в анонимные классы. - Планы
• (Де)сериализация енамов: - Везде (планы)
o Сами енамы
o == (ядерный драйвер)
• (Де)сериализация ссылок на объекты. - Аполло
• Возвращаемые значения в аргументах Картотека
• Any - Планы
2. Стрелки не всегда идут сверху вниз.
11.
Дecериализация с абстрактыми полямиclass CardData extends IdentifyData {
public int cardNumber = “12334”;
}
objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator(),
ObjectMapper.DefaultTyping.EVERYTHING,
JsonTypeInfo.As.PROPERTY);
class UserInfo {
public IdentifyData data = new CardData(“12334”);
}
{
“_class”: “UserInfo”,
{
“data”: {
“data” : {
“_class”: CardInfo,
“cardNumber” = “12334”
“cardNumber” = “12334”
}
}
}
}
Можно использовать OneNio, не без приседаний и json-ов но это реально
12.
Десериализация в анонимные классыUserInfo info = new UserInfo() {
@Override
public ….
}
Создаём нормальные классы и используем их
13.
(Де)сериализация енамовpublic final class TypeRegistryObject
implements org.omg.CORBA.portable.IDLEntity, org.jacorb.idl.IdlEnum
{
private int value = -1;
public static final int _TYPE = 0;
public static final TypeRegistryObject TYPE = new TypeRegistryObject(_TYPE);
public static final int _GROUP = 1;
public static final TypeRegistryObject GROUP = new TypeRegistryObject(_GROUP);
public static final int _LINKTYPE = 2;
public static final TypeRegistryObject LINKTYPE = new TypeRegistryObject(_LINKTYPE);
public static final int _NONE = 3;
public static final TypeRegistryObject NONE = new TypeRegistryObject(_NONE);
public int value()
{
return value;
}
public static TypeRegistryObject from_int(int value)
{
switch (value) {
case _TYPE: return TYPE;
case _GROUP: return GROUP;
case _LINKTYPE: return LINKTYPE;
case _NONE: return NONE;
default: throw new org.omg.CORBA.BAD_PARAM();
}
}
• If object == TypeRegistryObject. LINKTYPE
14.
(Де)сериализация ссылок на обьектыAny
public TApolloAAMController getControllerRef()
• private final ORB orb;
CDROutputStream outputStream = new CDROutputStream(orb);
outputStream.write_any(any);
byte[] asBytes = outputStream.getBufferCopy();
Ссылки десериализуем по своему с флагами и урлами
• try (CDRInputStream cdrInputStream = new CDRInputStream(orb,
decoded)) {
return cdrInputStream.read_any();
}
Возвращаемые значения в аргументах
void getIssueAndUser(in string cardNumber,
out string issueName,
out string userName);
15.
Стрелки не всегда идут сверху вниз16.
Стрелки не всегда идут сверху вниз17.
А дальше что?• Сейчас есть версия с 7 (14) переделлаными драйверами полностью без корбы
• Доделываем драйверы
• Нормальный горячий резерв
• Один из основных показателей, но не целей как таковых – обновления лирикса
через helm чарты