Jolie和Spring Boot批注-如何完成?

时间:2019-06-11 17:41:47

标签: java spring-boot jolie

我目前正在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应用程序。 enter image description here 当然,那只是我的概念-我认为可以完成此任务的方式,但是再说一次-存在Spring Boot批注的问题。

2 个答案:

答案 0 :(得分:1)

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

由于您正在考虑使用Spring,因此将重点放在特定的情况下:HTTP。

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

在您的情况下,如果您的路径/ hello与Java方法的名称一致,则Jolie会自动将http请求转换为对“ hello”操作的请求。

然后您需要做的是:

  • 让您的Java类扩展JavaService类;
  • 编译并将编译后的java类嵌入到outputPort中,例如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中”是否更容易?