Джоли и Spring Boot аннотации - как это можно сделать? - PullRequest
1 голос
/ 11 июня 2019

В настоящее время я работаю над созданием базовой поддержки Jolie в Spring Boot.Jolie - это микросервисный язык, который на самом деле основан на Java, но имеет совершенно другой синтаксис ( пример ).Благодаря классу JavaService , который поставляется с Jolie, можно брать функциональные возможности класса / метода из Java и его библиотек и встраивать их в Jolie.Я хотел бы знать, как этого можно добиться для аннотаций и функций, которые реализуются через них.Можно ли это сделать с помощью JavaService?Или я должен написать свой собственный анализ аннотации для Джоли?

Простой пример поведения, которого я хотел бы достичь, - это @SpringBootApplication, который запускает "Hello world" @RestController, например, здесь (пункты 2.3 и 2.4).В идеале аналогичная программа в Jolie должна выглядеть примерно так:

interface SpringAppInterface {
    OneWay:
      run(string)
}

outputPort SpringApplication {
    Interfaces: SpringAppInterface
}

embedded {
    Java:
      "joliex.spring-boot.SpringApplicationService" in SpringApplication
}

@SpringBootApplication
main {
    run@SpringApplication(args)
}

, где SpringApplicationService расширяет класс JavaService и встраивается в Jolie.А теперь @RestController:

inputPort SpringTestService {
    ...
}

@RestController
main {
    @RequestMapping("/hello")
    hello(void)(response) {
        response = "hello world"
    }
}

Это идеальный способ, и он хорошо демонстрирует поведение, которого я хочу достичь.И чтобы лучше показать реальное использование класса JavaService - здесь - его реализация стандартного класса Java Math, а здесь - его встраивание в Jolie.

С другой стороны: Интересно, возможно ли выполнить всю логику Spring Boot на стороне JavaService, поэтому, например, у меня уже есть JavaService с аннотацией @SpringBootApplication, аннотацией JavaService @RestController и т. Д.


Изменить: Как я уже сказал, я хочу создать поддержку Jolie в Spring Boot, поэтому в итоге разработчик Jolie сможет включить, например, «spring-boot.iol», и сможет создавать программы Jolie на основе Spring Boot.«spring-boot.iol», я полагаю, будет похож на все существующие файлы включения, такие как «console.iol», «math.iol» и т. д., и будет включать JavaService - назовем его «SpringBootService».Теперь этот SpringBootService будет использовать функциональные возможности библиотек Spring Boot, чтобы Джоли могла их использовать.Таким образом, при включении некоторых файлов * .iol, программа Jolie действительно реализует функциональные возможности Spring Boot и запускает приложения Spring Boot.enter image description here Это, конечно, только моя концепция - как я думаю, что эта задача может быть выполнена, но опять же - есть проблема с аннотациями Spring Boot.

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вам потребуется запустить интерпретатор Jolie из Java внутри вашего приложения Spring Boot. См. Например, http://fmontesi.github.io/2015/01/30/running-jolie-inside-of-java.html

Объявите порт локальной памяти в вашей службе Jolie: https://jolielang.gitbook.io/docs/locations/local

Затем вы можете получить доступ к операциям, отображаемым на локальном входном порте, вызвав interpreter.commCore().getLocalCommChannel(), который вернет вам объект канала связи, который вы можете использовать для отправки и получения сообщений интерпретатору Джоли.

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

Value v = Value.create();
v.setFirstChild( "x", 5 );
CommMessage request = CommMessage.createRequest( "yourOperationName", "/", v );
LocalCommChannel c = interpreter.commCore().getLocalCommChannel();
try {
    c.send( request );
    CommMessage response = c.recvResponseFor( request ).get();
    if ( response.isFault() ) {
        throw response.fault();
    }
    return response.value();
} catch( ExecutionException | InterruptedException | IOException e ) {
    throw new FaultException( Constants.IO_EXCEPTION_FAULT_NAME, e );
}

Этот API на самом деле до сих пор мало используется за пределами внутренних служб Interpreter и Java для Jolie, поэтому всегда приветствуются комментарии о том, как сделать его более удобным.

PS: Какова ваша мотивация для этого? Если ваша цель - создать микросервис с Jolie, не проще ли добавить необходимые вам функции в виде библиотеки Jolie вместо «добавления Jolie в Spring Boot»?

1 голос
/ 19 июня 2019

Джоли и Спринг по-разному предоставляют доступ к методам Java.

Поскольку вы рассматриваете Spring, вы сосредоточены на конкретном случае: HTTP.

Чтобы получить аналогичный результат с Джоли, вы можете следить за тем, что сделано в [1], где есть подробности по отображению URL-адресов HTTP в операции Джоли.

В вашем случае, когда у вас есть путь / привет, который совпадает с именем метода Java, Джоли автоматически преобразует http-запрос в запрос к операции, называемой "привет".

Тогда вам нужно:

  • пусть ваш класс Java расширяет класс JavaService;
  • скомпилируйте и внедрите скомпилированный класс Java в выходной порт, например, myJavaService, интерфейс которого предоставляет операцию hello;
  • используйте ключевое слово Aggregates [2], чтобы позволить inputPort автоматически перенаправлять вызов для операции hello на outputPort myJavaService, который может удовлетворить один такой запрос.

Для большей ясности я попытался нарисовать схему ниже

        ┌───────────────────────┐                      
        │ Jolie                 │                      
        │ Service               │                      
        │                       │                      
────────┼▶ inputPort (http)     │                      
        │   - /hello ──────┐    │                      
        │┌── - hello ◀─────┘    │                      
        ││  - aggregates        │                      
        │└──▶- myJavaSrv──────┐ │                      
        │┌────────────────────┘ │   ┌─────────────────┐
        ││ outputPort myJavaSvr │   │                 │
        │└─▶- hello ────────┐   │   │   Java Service  │
        │                   └───┼───┼▶- hello         │
        │                       │   │                 │
        │                       │   └─────────────────┘
        └───────────────────────┘                      

Если вы хотите изменить способ предоставления этой операции своим пользователям (например, с помощью других носителей, кроме сокетов или других протоколов, например, jsonrpc, xmlrpc, soap и т. Д.), Вам просто нужно изменить настройку в inputPort. С другой стороны, если вы хотите изменить способ реализации операции hello (другой службой Java, службой Jolie, службой Javascript и т. Д.), Вам просто нужно изменить место, на которое указывает outputPort (встроенный сервис, внешний и т. д.).

Наоборот, Spring предоставляет ваши методы только через HTTP, а маршруты аннотируются (и разбрасываются) в вашем Java-коде.

                                                    

        ┌────────────────┐       ┌─────────────────┐
        │                │       │  Java Class +   │
        │                │       │  Spring         │
   ─────┼────────────────┼───────▶  Annotations    │
        │     Spring     │       │                 │
        │   Bootstrap    │       │ @\hello         │
        │                │       │  - hello        │
        └────────────────┘       └─────────────────┘

[1] Технологическое веб-программирование с Джоли. Фабрицио Монтези. (2016). Sci. Вычи. Program., 130, 69–96. DOI: https://doi.org/10.1016/j.scico.2016.05.002

[2] https://jolielang.gitbook.io/docs/architectural-composition/aggregation

...