Вызов метода с помощью отражения об одноэлементном объекте

В методе

producer.send(ProducerRecord<K,V> record, new Callback() {
                   public void onCompletion(RecordMetadata metadata, Exception e) {...}
  });

обратный вызов вызывается после подтверждения отправки. Обратный вызов выполняется в фоновом потоке ввода-вывода, поэтому он должен быть быстрым (не блокировать его)

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

Send возвращает RecordMetadata, которая указывает раздел, куда отправляется запись, назначенное ей смещение и метку времени.

Это асинхронный подход, в то время как вы можете сделать то же самое, используя синхронный способ:

producer.send(record).get();

5
задан Crippeoblade 15 October 2008 в 12:11
поделиться

2 ответа

Непротестированный, но должен работать...

string methodName = "DoSomething"; // e.g. read from XML
MethodInfo method = typeof(Singleton).GetMethod(methodName);
FieldInfo field = typeof(Singleton).GetField("instance",
    BindingFlags.Static | BindingFlags.Public);
object instance = field.GetValue(null);
method.Invoke(instance, Type.EmptyTypes);
11
ответ дан 18 December 2019 в 12:03
поделиться

Отличная работа. Спасибо.

Вот тот же подход с небольшими изменениями для случаев, когда нельзя иметь ссылку на удаленную сборку. Нам просто нужно знать базовые вещи, такие как полное имя класса (т.е. namespace.classname и путь к удаленной сборке).

static void Main(string[] args)
    {
        Assembly asm = null;
        string assemblyPath = @"C:\works\...\StaticMembers.dll" 
        string classFullname = "StaticMembers.MySingleton";
        string doSomethingMethodName = "DoSomething";
        string doSomethingElseMethodName = "DoSomethingElse";

        asm = Assembly.LoadFrom(assemblyPath);
        if (asm == null)
           throw new FileNotFoundException();


        Type[] types = asm.GetTypes();
        Type theSingletonType = null;
        foreach(Type ty in types)
        {
            if (ty.FullName.Equals(classFullname))
            {
                theSingletonType = ty;
                break;
            }
        }
        if (theSingletonType == null)
        {
            Console.WriteLine("Type was not found!");
            return;
        }
        MethodInfo doSomethingMethodInfo = 
                    theSingletonType.GetMethod(doSomethingMethodName );


        FieldInfo field = theSingletonType.GetField("instance", 
                           BindingFlags.Static | BindingFlags.Public);

        object instance = field.GetValue(null);

        string msg = (string)doSomethingMethodInfo.Invoke(instance, Type.EmptyTypes);

        Console.WriteLine(msg);

        MethodInfo somethingElse  = theSingletonType.GetMethod(
                                       doSomethingElseMethodName );
        msg = (string)doSomethingElse.Invoke(instance, Type.EmptyTypes);
        Console.WriteLine(msg);}
4
ответ дан 18 December 2019 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: