Как установить тайм-аут соединения при использовании клиента веб-сервисов JAXRPC-RI?

Вы можете создать DynamicObject, который перенаправляет полученные вызовы в список целей в стиле цепочки ответственности (обратите внимание, что полиморфная диспетчеризация также работает так - от самого производного класса и выше):

public class Composition : DynamicObject {
  private List<object> targets = new List<object>();

  public Composition(params object[] targets) {
    AddTargets(targets);
  }

  protected void AddTargets(IEnumerable<object> targets) {
    this.targets.AddRange(targets);
  }

  public override bool TryInvokeMember(
        InvokeMemberBinder binder, object[] args, out object result) {
    foreach (var target in targets) {
      var methods = target.GetType().GetMethods();
      var targetMethod = methods.FirstOrDefault(m => 
        m.Name == binder.Name && ParametersMatch(m, args));
      if (targetMethod != null) {
        result = targetMethod.Invoke(target, args);
        return true;
      }
    }
    return base.TryInvokeMember(binder, args, out result);
  }

  private bool ParametersMatch(MethodInfo method, object[] args) {
    var typesAreTheSame = method.GetParameters().Zip(
      args, 
      (param, arg) => param.GetType() == arg.GetType());
    return typesAreTheSame.Count() == args.Length && 
            typesAreTheSame.All(_=>_);
  }

}

Обратите внимание, что вы также хотите реализовать делегирование для свойств (TryGetMember и TrySetMember), индексаторов (TryGetIndex и TrySetIndex) и операторов (TryBinaryOperation и TryUnaryOperation).

Затем, учитывая набор классов:

class MyClass {
  public void MyClassMethod() {
    Console.WriteLine("MyClass::Method");
  }
}

class MyOtherClass {
  public void MyOtherClassMethod() {
    Console.WriteLine("MyOtherClass::Method");
  }
}

Вы можете «смешать» их все вместе:

dynamic blend = new Composition(new MyClass(), new MyOtherClass());
blend.MyClassMethod();
blend.MyOtherClassMethod();

Вы также можете расширить динамический объект, чтобы использовать атрибуты классов или другие виды аннотаций для поиска миксинов. Например, учитывая этот интерфейс аннотации:

public interface Uses<M> where M : new() { }

Вы можете иметь это DynamicObject:

public class MixinComposition : Composition {

  public MixinComposition(object target) : 
    base(target) { 
    AddTargets(ResolveMixins(target.GetType()));
  }

  private IEnumerable<object> ResolveMixins(Type mainType) {
    return ResolveMixinTypes(mainType).
      Select(m => InstantiateMixin(m));
  }

  private IEnumerable<Type> ResolveMixinTypes(Type mainType) {
    return mainType.GetInterfaces().
      Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(Uses<>)).
      Select(u => u.GetGenericArguments()[0]);
  }

  private object InstantiateMixin(Type type) {
    return Activator.CreateInstance(type);
  }

}

И создавать свои «смеси», например:

class MyMixin {
  public void MyMixinMethod() {
    Console.WriteLine("MyMixin::Method");
  }
}

class MyClass : Uses<MyMixin> {
  public void MyClassMethod() {
    Console.WriteLine("MyClass::Method");
  }
}

...

dynamic blend = new MixinComposition(new MyClass());
blend.MyClassMethod();
blend.MyMixinMethod();
8
задан tshepang 10 March 2014 в 22:21
поделиться

2 ответа

Я просто собираюсь попытаться пожать награду, так что не стреляйте в меня, если я полностью на ложном пути :) Если ваше приложение «сидит там навсегда, ожидая ответа», то вы можете выполнить запрос в отдельный поток, и после создания вашего requestThread вы можете просто сказать requestThread.join (max_time_to_wait); следующий вызов проверит, жив ли requestThread, и если он this, то попытайтесь убить Это.

0
ответ дан 5 December 2019 в 21:21
поделиться

Возможно, вам повезет с настройкой таких свойств, как sun.net.client.defaultConnectTimeout или ] sun.net.client.defaultReadTimeout , хотя тогда это приведет к общесистемному таймауту.

В коде значения свойств устанавливаются с помощью строк:

System.setProperty("sun.net.client.defaultConnectTimeout", "1000");
System.setProperty("sun.net.client.defaultReadTimeout", "1000");

Для быстрого теста может быть проще установить переменную окружения JAVA_OPTS или используйте командную строку:

java -Dsun.net.client.defaultConnectTimeout="1000" ...
4
ответ дан 5 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

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