Вызовите MATLAB Functions Dynamically

Чтобы динамически вызвать функции на экземпляр MATLAB® Production Server™, вы используете основанного на отражении прокси создать запрос функции MATLAB. Имя функции и все вводы и выводы передаются как параметры методу, вызывающему запрос. Это означает, что вы не должны перекомпилировать свое приложение каждый раз, когда вы добавляете функцию в развернутый архив.

Динамически вызвать функцию MATLAB:

  1. Инстанцируйте экземпляра класса MWHttpClient.

  2. Создайте основанный на отражении объект прокси с помощью одного из методов createComponentProxy() клиентской связи.

  3. Вызовите функцию с помощью одного из методов invoke() основанного на отражении прокси.

Создайте прокси для динамического вызова

Основанный на отражении прокси реализует интерфейс MWInvokable и предоставляет методы, который позволяет вам непосредственно вызвать любую функцию MATLAB в развертываемом архиве. Как с основанным на интерфейсе прокси, основанный на отражении прокси создается из клиентского объекта связи. Класс MWHttpClient имеет два метода для создания основанного на отражении прокси:

  • MWInvokable createComponentProxy(URL archiveURL) создает прокси, который использует стандартные типы данных MATLAB.

  • MWInvokable createComponentProxy(URL archiveURL, MWMarshalingRules marshalingRules) создает прокси, который использует структуры.

Создать основанного на отражении прокси для вызова функций в архиве myMagic, размещенный на вашем локальном компьютере:

MWClient myClient = new MWHttpClient();

URL archiveURL = new URL("http://localhost:9910/myMagic");
MWInvokable myProxy =  myClient.createComponentProxy(archiveURL);

Вызовите функцию MATLAB динамически

Основанный на отражении прокси имеет три метода для вызова функций на сервере:

  • Object[] invoke(final String functionName, final int nargout, final Class<T> targetType, final Object... inputs) вызывает функцию, которая возвращает значения nargout.

  • <T> T invoke(final String functionName, final Class<T> targetType, final Object... inputs) вызывает функции, который возвращает одно значение.

  • invokeVoid(final String functionName, final Object... inputs) вызывает функцию, которая не возвращает значений.

Все методы сопоставляют с функцией MATLAB можно следующим образом:

  • Первый аргумент является именем функции

  • Средний набор аргументов, nargout и targetType, представляет возвращаемые значения функции

  • Последние аргументы являются входными параметрами функции

Возвратите несколько выходных параметров

Функция MATLAB myLimits возвращает два значения.

function [myMin,myMax] = myLimits(myRange)
 myMin = min(myRange);
 myMax = max(myRange);
end

Чтобы вызвать myLimits от клиента Java®, используйте метод invoke(), который берет количество возвращаемых аргументов:

double[] myRange = new double[]{2,5,7,100,0.5};
try
{
  Object[] myLimits = myProxy.invoke("myLimits",
                                     2,
                                     Object[].class, 
                                     myRange);
  double myMin = ((Double) myLimits[0]).doubleValue(); 
  double myMax = ((Double) myLimits[1]).doubleValue();
  System.out.printf("min: %f max: %f",myMin,myMax);
}
catch (Throwable e)
{
  e.printStackTrace();
}

Поскольку Java не может определить соответствующие типы для каждого из возвращенных значений, эта форма invoke всегда возвращает Object[] и всегда берет Object[].class в качестве целевого типа. Необходимо бросить возвращенные значения в соответствующие типы.

Возвратите один выходной параметр

Функция MATLAB addmatrix возвращает одно значение.

function a = addmatrix(a1, a2)
a = a1 + a2;

Чтобы вызвать addmatrix от клиента Java, используйте метод invoke(), который не берет количество возвращаемых аргументов:

double[][] a1={{1,2,3},{3,2,1}};
double[][] a2={{4,5,6},{6,5,4}};
try
{
  Double[][] result = myProxy.invoke("addmatrix", 
                                     Double[][].class, 
                                     a1, 
                                     a2);

  for(Double[] row : result)
  {
    for(double element : row)
    {
      System.out.print(element + " ");
    }
  }
} catch (Throwable e)
{
  e.printStackTrace();
}

Не возвратите выходные параметры

Функция MATLAB foo не делает возвращаемого значения.

function foo(a1)
min(a1);

Чтобы вызвать foo от клиента Java, используйте метод invokeVoid():

double[][] a={{1,2,3},{3,2,1}};
try
{
  myProxy.invokeVoid("foo", (Object)a);
}
catch (Throwable e)
{
  e.printStackTrace();
}

Упорядочьте структуры MATLAB

Если какая-либо функция MATLAB в развертываемом архиве использует структуры, необходимо предоставить правила маршалинга основанному на отражении прокси. Обеспечить маршалинг управляет к прокси:

  1. Реализуйте новый набор маршалинга правил путем расширения интерфейса MWDefaultMarshalingRules, чтобы использовать список упорядочиваемых классов.

  2. Создайте прокси с помощью метода createComponentProxy(URL archiveURL, MWMarshalingRules marshalingRules).

Развертываемый studentChecker архива включает функции, которые используют структуру MATLAB формы

S = 
name: 'Ed Plum'
score: 83
grade: 'B+'

Клиентский код Java представляет структуру MATLAB с классом под названием Student. Чтобы создать правило маршалинга для того, чтобы динамически вызвать функции в studentChecker, создайте класс под названием studentMarshaller.

class studentMarshaller extends MWDefaultMarshalingRules
{
  public List<Class> getStructTypes() {
    List structType = new ArrayList<Class>();
    structType.add(Student.class);
    return structType;
  }
}

Создайте прокси для studentChecker путем передачи studentMarshaller createComponentProxy().

URL archiveURL = new URL("http://localhost:9910/studentCheck");
myProxy =  myClient.createComponentProxy(archiveURL,
                                         new StudentMarshaller());

Для получения дополнительной информации об использовании структур MATLAB смотрите Маршала Структуры MATLAB (Структуры) на Java.