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" 不是更容易吗?
我目前正致力于在 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 引导应用程序。
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" 不是更容易吗?