我目前正在在Spring Boot中创建基本的Jolie支持。 Jolie是一种微服务语言,实际上是基于Java的,但是语法非常不同(example)。感谢Jolie随附的JavaService类,可以从Java及其库中获取类/方法功能,并将其嵌入到Jolie中。我想知道如何通过注释和功能实现相同的功能。可以用JavaService完成吗?还是我必须为Jolie编写自己的注释解析?
我想实现的行为的一个简单示例是@SpringBootApplication,它运行一个“ Hello world” @RestController,例如here(指向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类的真实用法,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批注的问题。
最佳答案
您将必须在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”,是否更加容易?