Jolie 和 Spring 引导注释 - 如何做到?

Jolie and Spring Boot annotations - how can it be done?

我目前正致力于在 Spring Boot 中创建基本的 Jolie 支持。 Jolie 是一种微服务语言,在底层 - 基于 Java,但语法非常不同(example). Thanks to JavaService class,Jolie 自带,可以采用 class/method 来自 Java 及其库的功能,并将它们嵌入到 Jolie 中。我想知道如何通过它们实现的注释和功能也能达到同样的效果。可以用 Java 来完成吗服务也是?还是我必须自己为 Jolie 编写注释解析?

我想实现的一个简单的行为示例是 @SpringBootApplication,它 运行 是一个 "Hello world" @RestController,例如 here(第 2.3 点和2.4).理想情况下,朱莉的类似节目看起来像下面这样:

interface SpringAppInterface {
    OneWay:
      run(string)
}

outputPort SpringApplication {
    Interfaces: SpringAppInterface
}

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

@SpringBootApplication
main {
    run@SpringApplication(args)
}

其中 SpringApplicationService 扩展了 JavaService class 并嵌入到 Jolie 中。现在是 @RestController:

inputPort SpringTestService {
    ...
}

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

这是一种理想的方式,它很好地呈现了我想要实现的行为。并且为了更好地展示 JavaService class - here is its implementation of standard Java Math class and here - 它在 Jolie 中的嵌入。

旁注:我想知道是否有可能 运行 整个 Spring 引导逻辑在 Java 服务端,所以例如我会有一个 JavaService already annotated with @SpringBootApplication, JavaService annotated @RestController etc.


编辑:
正如我所说 - 我想在 Spring Boot 中创建 Jolie 支持,因此最终 Jolie 开发人员将能够包含,例如 "spring-boot.iol",并能够创建 Spring Boot基于 Jolie 的程序。 "spring-boot.iol" 我想它会类似于所有现有的包含文件,如 "console.iol"、"math.iol" 等,并且它会嵌入一个 Java 服务 - 让我们称它为 "SpringBootService".现在这个 SpringBootService 将从 Spring 引导库中获取功能,以允许 Jolie 使用它们。这样 - 包含一些 *.iol 文件 - Jolie 程序确实会实现 Spring 引导功能和 运行 Spring 引导应用程序。 这当然只是我的概念 - 我认为这个任务可能会如何完成,但话又说回来 - 存在 Spring 引导注释的问题。

Jolie 和 Spring 以不同的方式公开 Java 方法的可访问性。

由于您正在考虑 Spring,因此您正在关注一个特定的案例:HTTP。

要通过 Jolie 获得类似的结果,您可以按照 [1] 中的操作进行操作,其中详细介绍了将 HTTP URL 映射到 Jolie 操作中。

在你的例子中,你的路径 /hello 与 Java 方法的名称一致,Jolie 会自动将 http 请求转换为指向名为 "hello" 的操作的请求。

那么你需要做的是:

  • 让您的 Java class 扩展 Java 服务 class;
  • 编译并将编译后的 java class 嵌入到输出端口中,例如 myJavaService 其接口公开操作 hello;
  • 使用Aggregates[2]关键字让inputPort自动将操作hello的调用重定向到outputPortmyJavaService,可以满足这样一个要求

为了更清楚,我尝试在下面绘制架构

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

如果您想更改向用户公开该操作的方式(例如,通过套接字以外的其他媒体或其他协议,例如 jsonrpc、xmlrpc、soap 等),您只需更改设置输入端口。另一方面,如果您想修改 hello 操作的实现方式(通过另一个 Java 服务、通过 Jolie 服务、通过 Javascript 服务等),您只需需要修改 outputPort 指向的位置(嵌入式服务、外部服务等)。

相反,Spring 仅通过 HTTP 公开您的方法,并且在您的 java 代码中注释(和分散)路由。

                                                    

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

[1] Process-aware 与朱莉一起进行网络编程。法布里齐奥·蒙特西。 (2016)。科学。电脑。程序。, 130, 69–96. DOI:https://doi.org/10.1016/j.scico.2016.05.002

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

您将需要 运行 来自 Java 的 Jolie 解释器,在您的 Spring 启动应用程序中。例如,参见 http://fmontesi.github.io/2015/01/30/running-jolie-inside-of-java.html

在您的 Jolie 服务中声明本地内存输入端口:https://jolielang.gitbook.io/docs/locations/local

然后您可以通过调用 interpreter.commCore().getLocalCommChannel() 访问在本地输入端口上公开的操作,这将 return 您可以用来向 Jolie 解释器发送和接收消息的通信通道对象.

这里有一个简单粗暴的例子(你可能想更好地处理 future 和异常),我发送一个包含整数的值 "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:你这样做的动机是什么?如果你的 objective 是用 Jolie 做一个微服务,那么添加你需要的功能作为 Jolie 库而不是 "adding Jolie to Spring Boot" 不是更容易吗?