
# Java函数开发概述
FunctionGraph目前支持以下Java运行环境。
- Java 8
- Java 11
- Java 17
- Java 21（仅支持"中东-利雅得"、"土耳其-伊斯坦布尔"区域）
#### Java函数接口定义
Java函数接口定义：*作用域* *返回参数* *函数名（* *函数参数，Context* *参数）*
- 作用域：提供给FunctionGraph调用的用户函数必须定义为public。
- 返回参数：用户定义，FunctionGraph负责转换为字符串，作为HTTP Response返回。对于返回参数对象类型，HTTP Response该类型的JSON字符串。
- 函数名：用户定义函数名称。
- 函数参数：用户定义参数，当前函数仅支持一个用户参数。对于复杂参数，建议定义为对象类型，以JSON字符串提供数据。FunctionGraph调用函数时，解析JSON为对象。
- Context：runtime提供函数执行上下文，其接口定义在[SDK接口]说明。
Java函数的函数执行入口参数格式为：**\[包名\].\[类名\].\[执行函数名\]** ，请参考[函数执行入口](https://support.huaweicloud.com/devg-functiongraph/functiongraph_devg_02_0002.html#functiongraph_devg_02_0002__fig13966152018300)进行配置或修改。
#### Java的initializer入口介绍
关于函数初始化入口Initializer的具体介绍请参考[函数初始化入口Initializer](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0532.html)。
Java的Initializer格式为：**\[包名\].\[类名\].\[执行函数名\]**
示例：创建函数时指定的initializer为com.huawei.Demo.my_initializer，那么FunctionGraph会去加载com.huawei包，Demo类中定义的my_initializer函数。
在函数工作流服务中使用Java实现initializer接口，需要定义一个java函数作为initializer入口，以下为initializer的简单示例。
```
public void my_initializer(Context context)
{
RuntimeLogger log = context.getLogger();
log.log(String.format("ak:%s", context.getAccessKey()));
}
```
- 函数名 my_initializer需要与实现initializer接口时的initializer字段相对应。
  
- context参数 context参数中包含一些函数的运行时信息，例如：request id、临时AccessKey、function meta等。
  
 
 #### SDK接口
FunctionGraph函数JavaSDK提供了Event事件接口、Context接口和日志记录接口，SDK下载地址见[Java SDK下载](https://function-community.obs.cn-north-1.myhuaweicloud.com/sdk/java/fss-java-sdk-2.0.5.zip)（校验文件：[fss-java-sdk-2.0.5.sha256](https://function-community.obs.cn-north-1.myhuaweicloud.com/sdk/java/fss-java-sdk-2.0.5.sha256)）。
- Event事件接口 Java SDK引入了触发器事件结构体定义，当前支持CTS、DMS、DIS、SMN、LTS、TIMER、APIG、Kafka。在需要使用触发器的场景下，编写相应代码更简便。
  1. **APIG触发器相关方法说明**
     - APIGTriggerEvent相关方法说明
       表1APIGTriggerEvent相关方法说明 
       | 方法名                        | 方法说明                                                                                               |
       |:---|:---|
       | isBase64Encoded()          | Event中的body是否是base64编码。                                                                            |
       | getHttpMethod()            | 获取HTTP请求方法。                                                                                        |
       | getPath()                  | 获取HTTP请求路径。                                                                                        |
       | getBody()                  | 获取HTTP请求body。                                                                                      |
       | getPathParameters()        | 获取所有路径参数。                                                                                          |
       | getRequestContext()        | 获取相关的APIG配置。（返回[APIGRequestContext对象]）                |
       | getHeaders()               | 获取HTTP请求头。                                                                                         |
       | getQueryStringParameters() | 获取查询参数。 **当前查询参数不支持取值为数组，如果查询参数的取值需要为数组，请自定义对应的触发器事件结构体。** |
       | getRawBody()               | 获取base64编码前的内容。                                                                                    |
       | getUserData()              | 获取APIG自定义认证中设置的userdata。                                                                           |
          
        表2APIGRequestContext相关方法说明 
       | 方法名            | 方法说明                 |
       |:---|:---|
       | getApiId()     | 获取API的ID。            |
       | getRequestId() | 获取此次API请求的requestId。 |
       | getStage()     | 获取发布环境名称。            |
       | getSourceIp()  | 获取APIG自定义认证信息中的源IP。  |
          
       
     
     - APIGTriggerResponse相关方法说明
       表3APIGTriggerResponse构造方法说明 
       | 方法名                                                                   | 方法说明                                                                  |
       |:---|:---|
       | 无参构造APIGTriggerResponse()                                             | 其中headers设置为null，statusCode设置为200，body设置为" "，isBase64Encoded设置为false。 |
       | 三个参数构造APIGTriggerResponse(statusCode, headers, body)                  | isBase64Encoded设置为false，其他均以输入为准。                                     |
       | 四个参数构造APIGTriggerResponse(statusCode, headers, isBase64Encoded, body) | 按照对应顺序设置值即可。                                                          |
          
       表4APIGTriggerResponse相关方法说明 
       | 方法名                                       | 方法说明                     |
       |:---|:---|
       | setBody(String body)                      | 设置消息体。                   |
       | setHeaders(Map\<String,String\> headers)  | 设置最终返回的HTTP响应头。          |
       | setStatusCode(int statusCode)             | 设置HTTP状态码。               |
       | setBase64Encoded(boolean isBase64Encoded) | 设置body是否经过base64编码。      |
       | setBase64EncodedBody(String body)         | 将输入进行base64编码，并设置到Body中。 |
       | addHeader(String key, String value)       | 增加一组HTTP header。         |
       | removeHeader(String key)                  | 从现有的header中移除指定header。   |
       | addHeaders(Map\<String,String\> headers)  | 增加多个header。              |
          
       ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
       APIGTriggerResponse有headers属性，可以通过setHeaders方法和带有headers参数的构造函数对齐进行初始化。
       
      
  
  2. **DIS触发器相关方法说明**
     表5DISTriggerEvent相关方法说明 
     | 方法名             | 方法说明                                                                  |
     |:---|:---|
     | getShardID()    | 获取分区ID。                                                               |
     | getMessage()    | 获取DIS消息体。（[DISMessage结构]） |
     | getTag()        | 获取函数版本。                                                               |
     | getStreamName() | 获取通道名称。                                                               |
        
      表6DISMessage相关方法说明 
     | 方法名                     | 方法说明                                                                |
     |:---|:---|
     | getNextPatitionCursor() | 获取下一个游标。                                                            |
     | getRecords()            | 获取消息记录。（[DISRecord结构]） |
     | getMillisBehindLatest() | 保留方法（目前返回0）。                                                        |
        
      表7DISRecord相关方法说明 
     | 方法名                 | 方法说明                         |
     |:---|:---|
     | getPartitionKey()   | 获取数据分区。                      |
     | getData()           | 获取数据。                        |
     | getRawData()        | data经过base64解码后的字符串，UTF-8编码。 |
     | getSequenceNumber() | 获取序列号（每个记录的唯一标识）。            |
        
     
  
  3. **DMS触发器相关方法说明**
     表8DMSTriggerEvent相关方法说明 
     | 方法名                  | 方法说明                                                                 |
     |:---|:---|
     | getQueueId()         | 获取队列ID。                                                              |
     | getRegion()          | 获取区域名称。                                                              |
     | getEventType()       | 获取事件类型。（返回"MessageCreated"）                                          |
     | getConsumerGroupId() | 获取消费组ID。                                                             |
     | getMessages()        | 获取DMS消息。（[DMSMessage结构]） |
        
      表9DMSMessage相关方法说明 
     | 方法名             | 方法说明         |
     |:---|:---|
     | getBody()       | 获取DMS消息体。    |
     | getAttributes() | 获取DMS消息属性集合。 |
        
     
  
  4. **SMN触发器相关方法说明**
     表10SMNTriggerEvent相关方法说明 
     | 方法名         | 方法说明                                                                |
     |:---|:---|
     | getRecord() | 获取消息记录集合。（[SMNRecord结构]） |
        
      表11SMNRecord相关方法说明 
     | 方法名                       | 方法说明                                                                |
     |:---|:---|
     | getEventVersion()         | 获取事件版本。（当前为1.0）                                                     |
     | getEventSubscriptionUrn() | 获取订阅URN。                                                            |
     | getEventSource()          | 获取事件源。                                                              |
     | getSmn()                  | 获取SMN事件消息体。（[SMNBody结构]） |
        
      表12SMNBody相关方法说明 
     | 方法名                    | 方法说明        |
     |:---|:---|
     | getTopicUrn()          | 获取SMN主题URN。 |
     | getTimeStamp()         | 获取消息时间戳。    |
     | getMessageAtrributes() | 获取消息属性集合。   |
     | getMessage()           | 获取消息体。      |
     | getType()              | 获取消息类型。     |
     | getMessageId()         | 获取消息ID。     |
     | getSubject()           | 获取消息主题。     |
        
     
  
  5. **定时触发器相关方法说明**
     表13TimerTriggerEvent相关方法说明 
     | 方法名              | 方法说明               |
     |:---|:---|
     | getVersion()     | 获取版本名称。（当前为"v1.0"） |
     | getTime()        | 获取当前时间。            |
     | getTriggerType() | 获取触发器类型。（"Timer"）  |
     | getTriggerName() | 获取触发器名称。           |
     | getUserEvent()   | 获取触发器附加信息。         |
        
     
  
  6. **LTS触发器相关方法说明**
     表14LTSTriggerEvent相关方法说明 
     | 方法名      | 方法说明                                                             |
     |:---|:---|
     | getLts() | 获取LTS消息。（[LTSBody结构]） |
        
      表15**LTSBody相关方法说明** 
     | 方法名          | 方法说明                      |
     |:---|:---|
     | getData()    | 获取LTS原始消息。                |
     | getRawData() | 获取经过base64解码后的消息，UTF-8编码。 |
        
     
  
  7. **CTS触发器相关方法说明**
     表16CTSTriggerEvent说明 
     | 方法名      | 方法说明             |
     |:---|:---|
     | getCTS() | 获取CTS消息体。（CTS结构） |
        
     表17CTS结构相关方法说明 
     | 方法名               | 方法说明                              |
     |:---|:---|
     | getTime()         | 获取事件产生时间。                         |
     | getUser()         | 获取触发该事件的用户信息（User 结构）。            |
     | getRequest()      | 获取事件请求内容。                         |
     | getResponse()     | 获取事件响应内容。                         |
     | getCode()         | 获取响应码。                            |
     | getServiceType()  | 获取事件触发的服务名称。                      |
     | getResourceType() | 获取事件触发的资源类型。                      |
     | getResourceName() | 获取事件触发的资源名称。                      |
     | getResourceId()   | 获取事件触发资源的唯一标识。                    |
     | getTraceName()    | 获取事件名称。                           |
     | getTraceType()    | 获取事件触发的方式。（如ConsoleAction：代表前台操作） |
     | getRecordTime()   | 获取CTS服务接收事件时间。                    |
     | getTraceId()      | 获取当前事件的唯一标识。                      |
     | getTraceStatus()  | 获取事件状态。                           |
        
     表18User方法说明 
     | 方法名         | 方法说明                  |
     |:---|:---|
     | getName()   | 获取用户名。（同一账号可以创建多个子用户） |
     | getId()     | 获取用户ID。               |
     | getDomain() | 获取账号信息。               |
        
     表19Domain方法说明 
     | 方法名       | 方法说明    |
     |:---|:---|
     | getName() | 获取账号名称。 |
     | getId()   | 获取账号ID。 |
        
     
  
  8. **Kafka触发器相关方法说明**
     表20**Kafka触发器相关方法说明** 
     | 方法名             | 方法说明     |
     |:---|:---|
     | getEventVersion | 获取事件版本。  |
     | getRegion       | 获取地区。    |
     | getEventTime    | 获取产生时间。  |
     | getTriggerType  | 获取触发器类型。 |
     | getInstanceId   | 获取实例ID。  |
     | getRecords      | 获取记录体。   |
        
     
  
  
  ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
  1. 例如使用APIG触发器时，只需要把入口函数（假如函数名为handler）的第一个参数按照如下方式设置：handler(APIGTriggerEvent event, Context context)。
  
  2. 关于所有TriggerEvent，上面提到的TriggerEvent方法均有与之对应的set方法，建议在本地调试时使用；DIS和LTS均有对应的getRawData()方法，但无与之相应的setRawData()方法。
    
- Context接口 Context接口提供函数获取函数执行上下文，例如，用户委托的AccessKey/SecretKey、当前请求ID、函数执行分配的内存空间、CPU数等。
  Context接口说明如[表21]所示。
   表21Context类上下文方法说明 
  | 方法名                                | 方法说明                                                                                                                                                     |
  |:---|:---|
  | getRequestID( )                    | 获取请求ID。                                                                                                                                                  |
  | getRemainingTimeInMilliSeconds ( ) | 获取函数剩余运行时间。                                                                                                                                              |
  | getAccessKey( )                    | 获取用户委托的AccessKey（有效期24小时），使用该方法需要为函数配置委托。 **当前函数工作流已停止维护Runtime SDK 中getAccessKey接口，您将无法使用getAccessKey获取临时AK。** |
  | getSecretKey( )                    | 获取用户委托的SecretKey（有效期24小时），使用该方法需要为函数配置委托。 **当前函数工作流已停止维护Runtime SDK 中getSecretKey接口，您将无法使用getSecretKey获取临时SK。** |
  | getSecurityAccessKey( )            | 获取用户委托的SecurityAccessKey（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                            |
  | getSecuritySecretKey( )            | 获取用户委托的SecuritySecretKey（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                            |
  | getSecurityToken( )                | 获取用户委托的SecurityToken（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                                |
  | getUserData(string key)            | 通过key获取用户通过环境变量传入的值。                                                                                                                                     |
  | getFunctionName( )                 | 获取函数名称。                                                                                                                                                  |
  | getRunningTimeInSeconds ( )        | 获取函数超时时间。                                                                                                                                                |
  | getVersion( )                      | 获取函数的版本。                                                                                                                                                 |
  | getMemorySize( )                   | 分配的内存。                                                                                                                                                   |
  | getCPUNumber( )                    | 获取函数占用的CPU资源。                                                                                                                                            |
  | getPackage( )                      | 获取函数组。                                                                                                                                                   |
  | getToken( )                        | 获取用户委托的token（有效期24小时），使用该方法需要为函数配置委托。                                                                                                                    |
  | getLogger( )                       | 获取context提供的logger方法（默认会输出时间、请求ID等信息）。                                                                                                                   |
  | getAlias()                         | 获取函数的别名                                                                                                                                                  |
     
  
- 日志接口 Java SDK日志接口日志说明如[表22]所示。
   表22日志接口说明表 
  | 方法名             | 方法说明                                |
  |:---|:---|
  | RuntimeLogger() | 记录用户输入日志。包含方法如下：log(String string)。 |
     
  
 
