我目前正在Spring Boot中创建基本的Jolie支持。 Jolie是一种微服务语言,实际上是基于Java的,但是语法非常不同(example)。感谢Jolie随附的JavaService类,可以从Java及其库中获取类/方法功能,并将其嵌入到Jolie中。我想知道如何通过注释和功能实现相同的功能。也可以用JavaService完成吗?还是我必须为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类,并嵌入在Jolie中。现在是@RestController:
inputPort SpringTestService {
...
}
@RestController
main {
@RequestMapping("/hello")
hello(void)(response) {
response = "hello world"
}
}
这是一种理想的方式,它很好地表现了我想要实现的行为。为了更好地展示JavaService类的真实用法,here是标准Java Math类的实现,here是其嵌入在Jolie中的。
在旁注:我想知道是否有可能在JavaService端运行整个Spring Boot逻辑,例如,我有一个已经用@SpringBootApplication注释的JavaService,一个已经被@RestController注释的JavaService等。
编辑:
就像我说的那样-我想在Spring Boot中创建对Jolie的支持,因此最终Jolie开发人员将能够包括例如“ spring-boot.iol”,并能够创建基于Spring Boot的Jolie程序。我想“ spring-boot.iol”将类似于所有现有的包含文件,例如“ console.iol”,“ math.iol”等,并且它将嵌入JavaService-我们将其称为“ SpringBootService”。现在,此SpringBootService将从Spring Boot库中获取功能,以允许Jolie使用它们。这样,通过包含一些* .iol文件,一个Jolie程序确实可以实现Spring Boot功能并运行Spring Boot应用程序。
当然,那只是我的概念-我认为可以完成此任务的方式,但是再说一次-存在Spring Boot批注的问题。
答案 0 :(得分:1)
Jolie和Spring以不同的方式公开了对Java方法的可访问性。
由于您正在考虑使用Spring,因此将重点放在特定的情况下:HTTP。
要用Jolie归档类似的结果,您可以按照[1]中的操作进行操作,其中详细介绍了HTTP URL到Jolie操作的映射。
在您的情况下,如果您的路径/ hello与Java方法的名称一致,则Jolie会自动将http请求转换为对“ hello”操作的请求。
然后您需要做的是:
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]使用Jolie进行过程感知的Web编程。 Fabrizio Montesi。 (2016)。科学计算计划,130,69-96。 DOI:https://doi.org/10.1016/j.scico.2016.05.002
[2] https://jolielang.gitbook.io/docs/architectural-composition/aggregation
答案 1 :(得分:1)
您将必须在Spring Boot应用程序内部从Java运行Jolie解释器。例如,参见http://fmontesi.github.io/2015/01/30/running-jolie-inside-of-java.html
在您的Jolie服务中声明一个本地内存输入端口:https://jolielang.gitbook.io/docs/locations/local
然后您可以通过调用interpreter.commCore().getLocalCommChannel()
来实现本地输入端口上公开的操作,这将为您返回一个通信通道对象,您可以使用该对象来向Jolie解释器发送和接收消息。
这是一个快速而肮脏的示例(您可能希望更好地处理未来和异常),在该示例中,我发送了一个包含整数“ 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 );
}
实际上,在Jolie的Interpreter和Java服务的内部之外,仍然很少使用此API,因此始终欢迎对其友好进行评论。
PS:您这样做的动机是什么?如果您的目标是使用Jolie进行微服务,那么将所需的功能添加为Jolie库,而不是“将Jolie添加到Spring Boot中”是否更容易?