# 设置DIS通知策略(Java SDK)
#### 功能介绍
本接口用于为指定桶配置DIS通知策略。接口是幂等的，如果桶上已存在相同策略内容，则返回成功，status code返回值为200；否则status code返回值为201。
融合桶不支持设置DIS通知策略。
![](https://support.huaweicloud.com/sdk-java-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在Github上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-java-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。
#### 接口约束
- 您必须是拥有**Tenant Administrator** 权限，才能调用本接口。配置Tenant Administrator权限，需要使用**角色与策略授权** （旧版IAM，即IAM v3接口），授权操作请参考[使用IAM授权](https://support.huaweicloud.com/qs-iam/iam_01_0030.html)。
- 一个桶中最多同时配置10条DIS通知规则。
- 对于时延敏感（秒级）的业务，消息通知无法保证时延。
- 新创建的DIS通知将在5分钟之内生效。
- 一个桶的多条DIS通知规则不允许重复，即任意对象在发生任意事件时都不能同时匹配两条以上的DIS通知规则，重复规则会创建失败。
  ![](https://support.huaweicloud.com/sdk-java-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
  针对同一事件，如果配置了一条前后缀都为空的规则，则不允许再配置第二条规则。前后缀都为空表示对所有对象生效。
  例如：针对Put事件，已存在一条规则A，定义的前缀是"abcd"，后缀是".txt"。如果要创建另外一条针对Put事件的规则B，则规则B配置不同前后缀的结果如[表1]所示。
   表1规则B前后缀配置场景及结果 
  | 规则A前后缀配置                                                                                          | 规则B前后缀配置                                                                                           | 规则B创建结果 | 原因             |
  |:---|:---|:---|:---|
  | 前缀：abcd 后缀：.txt | 前缀：abcd 后缀：.txt   | 失败   | 前后缀相同         |
  | 前缀：abcd 后缀：.txt | 前缀：abcd 后缀：空    | 失败   | 前缀相同，后缀B包含A     |
  | 前缀：abcd 后缀：.txt | 前缀：ab 后缀：xt         | 失败    | 前缀B包含A，后缀B包含A |
  | 前缀：abcd 后缀：.txt | 前缀：abef 后缀：.txt | 成功  | 前缀不同，后缀相同    |
  | 前缀：abcd 后缀：.txt | 前缀：abcd 后缀：.mp4   | 成功   | 前缀相同，后缀不同       |
     
  

- OBS支持的region以及region与endPoint的对应关系，详细信息请参见[地区与终端节点](https://developer.huaweicloud.com/endpoint?OBS)。
 
#### 方法定义
obsClient.setBucketDisPolicy(SetBucketDisPolicyRequest request)
#### 请求参数说明
表2请求参数列表 
| **参数名称** | **参数类型**                                               | **是否必选** | **描述**                                                                                                                                 |
|:---|:---|:---|:---|
| request      | [表3 SetBucketDisPolicyRequest] | 必选             | **参数解释** **：** 设置DIS通知策略请求参数，详见[表3 SetBucketDisPolicyRequest]。 |
   
 表3SetBucketDisPolicyRequest 
| **参数名称**     | **参数类型** | **是否必选**                                                    | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|:---|
| bucketName | String     | 必选   | **参数解释** **：** 桶名。 **约束限制：** - 桶的名字需全局唯一，不能与已有的任何桶名称重复，包括其他用户创建的桶。  - 桶命名规则如下： - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。  - 禁止使用IP地址。  - 禁止以"-"或"."开头及结尾。  - 禁止两个"."相邻（如："my..bucket"）。  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。    - 同一用户在同一个区域多次创建同名桶不会报错，创建的桶属性以第一次请求为准。   **默认取值：** 无 |
| disPolicyConfiguration                                                | [表4 DisPolicyConfiguration]        | 必选 | **参数解释** **：** DIS通知规则，详见[表4 DisPolicyConfiguration]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   
 表4DisPolicyConfiguration 
| **参数名称** | **参数类型**                                                    | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|:---|
| rules     | List\<[表5 DisPolicyRule]\> | 必选       | **参数解释：** DIS通知规则列表，详见[表5 DisPolicyRule]。 **约束限制：** 同一个桶下的不同策略前缀不能重复和起始包含，委托建议使用同一个。 **取值范围：** 数组大小的取值范围为\[1, 10\]。 **默认取值：** 不涉及 |
   
 表5DisPolicyRule 
| **参数名称** | **参数类型**       | **是否必选**       | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| id        | String          | 必选 | **参数解释** **：** 规则ID。当前桶上配置的DIS策略规则的唯一标识。 **约束限制：** 必须由以下字符组成"a-z"、"A-Z"、"0-9"、"-"、"_" **取值范围：** 长度最长为256的字符串。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| stream    | String        | 必选 | **参数解释：** DIS服务通道名称。 **约束限制：** 需要先在DIS服务创建此通道。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| project  | String        | 必选   | **参数解释：** DIS服务通道所属的项目ID。 **取值范围：** 不涉及 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| events     | List\<String\> | 必选                 | **参数解释** **：** OBS事件列表。 **取值范围：** 有效值：长度\[0, 1023\]，值允许为任意字符，支持如下事件类型： - ObjectCreated:\* （所有上传操作）  - ObjectCreated:Put （上传对象）  - ObjectCreated:Post （使用浏览器上传对象）  - ObjectCreated:Copy （拷贝对象）  - ObjectCreated:CompleteMultipartUpload （合并段）  - ObjectRemoved:\* （所有删除操作）  - ObjectRemoved:Delete （指定对象版本号删除对象）  - ObjectRemoved:DeleteMarkerCreated （不指定对象版本号删除对象）   **默认取值：** 无 |
| prefix  | String           | 可选              | **参数解释** **：** 对象名前缀，用于指定的对象名关键字，根据定义的前缀，输入需要过滤的对象的关键字信息，字符越长匹配精度越高。 **约束限制：** prefix和suffix加起来长度最大为1024个字符。 **取值范围：** 长度最长为1024的字符串。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| suffix   | String        | 可选              | **参数解释** **：** 对象名后缀。用于指定的对象名关键字，根据定义的后缀，输入需要过滤的对象的关键字信息，字符越长匹配精度越高。 **约束限制：** prefix和suffix加起来长度最大为1024个字符。 **取值范围：** 长度最长为1024的字符串。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| agency    | String         | 必选              | **参数解释** **：** IAM委托名。 **约束限制：** 被委托方必须包含OBS服务，赋予的权限必须是DIS服务的DIS Administrator或DIS User。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
#### 返回结果说明
表6返回结果HeaderResponse(SDK公共响应结果)各项属性说明 
| **参数名称** | **参数类型**             | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|:---|
| statusCode  | int                         | **参数解释：** HTTP状态码。 **取值范围：** 状态码是一组从2xx（成功）到4xx或5xx（错误）的数字代码，状态码表示了请求响应的状态。 完整的状态码列表请参见[状态码](https://support.huaweicloud.com/api-obs/obs_04_0114.html)。 **默认取值：** 无 |
| responseHeaders               | Map\<String, Object\> | **参数解释：** HTTP响应消息头列表，由多个元组构成。元组中String代表响应消息头的名称，Object代表响应消息头的值。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   
#### 代码示例
本示例用于设置examplebucket桶的DIS策略。
```
import com.obs.services.ObsClient;
import com.obs.services.ObsConfiguration;
import com.obs.services.exception.ObsException;
import com.obs.services.model.dis.DisPolicyConfiguration;
import com.obs.services.model.dis.DisPolicyRule;
import com.obs.services.model.dis.SetBucketDisPolicyRequest;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SetBucketDisPolicy {
    public static void main(String[] args) {
        // 您可以通过环境变量获取访问密钥AK/SK，也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。
        // 您可以登录访问管理控制台获取访问密钥AK/SK
        String ak = System.getenv("ACCESS_KEY_ID");
        String sk = System.getenv("SECRET_ACCESS_KEY_ID");
        // 【可选】如果使用临时AK/SK和SecurityToken访问OBS，同样建议您尽量避免使用硬编码，以降低信息泄露风险。
        // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken，也可以使用其他外部引入方式传入。
        String securityToken = System.getenv("SECURITY_TOKEN");
        // endpoint填写桶所在的endpoint, 此处以华北-北京四为例，其他地区请按实际情况填写。
        // 您可以通过环境变量获取endPoint，也可以使用其他外部引入方式传入。
        String endPoint = System.getenv("ENDPOINT");
        ObsConfiguration obsConfiguration = new ObsConfiguration();
        obsConfiguration.setEndPoint(endPoint);
        ObsClient obsClient = new ObsClient(ak, sk, securityToken, obsConfiguration);
        try {
            String exampleBucket = "examplebucket";
            String ruleId = "rule-001";
            // DIS服务通道名称
            String stream = "your_stream";
            // DIS服务通道所属的项目ID
            String projectId = "your_project_id";
            // IAM委托名，被委托方必须包含对OBS的访问权限，赋予的权限必须是DIS服务的DIS Administrator或DIS User
            String agency = "your_agency";
            // 触发事件类型
            List<String> events = Arrays.asList("ObjectCreated:*");
            // 对象名前缀。用于指定的对象名关键字，根据定义的前缀，输入需要过滤的对象的关键字信息，字符越长匹配精度越高
            String prefix = "test/";
            // 对象名后缀。用于指定的对象名关键字，根据定义的后缀，输入需要过滤的对象的关键字信息，字符越长匹配精度越高
            String suffix = ".zip";
            DisPolicyRule rule = new DisPolicyRule(ruleId, stream, projectId, events, agency);
            rule.setPrefix(prefix);
            rule.setSuffix(suffix);
            DisPolicyConfiguration config = new DisPolicyConfiguration(Collections.singletonList(rule));
            SetBucketDisPolicyRequest setRequest = new SetBucketDisPolicyRequest(exampleBucket, config);
            obsClient.setBucketDisPolicy(setRequest);
            System.out.println("SetBucketDisPolicy successfully");
        } catch (ObsException e) {
            System.out.println("SetBucketDisPolicy failed");
            // 请求失败,打印http状态码
            System.out.println("HTTP Code:" + e.getResponseCode());
            // 请求失败,打印服务端错误码
            System.out.println("Error Code:" + e.getErrorCode());
            // 请求失败,打印详细错误信息
            System.out.println("Error Message:" + e.getErrorMessage());
            // 请求失败,打印请求id
            System.out.println("Request ID:" + e.getErrorRequestId());
            System.out.println("Host ID:" + e.getErrorHostId());
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("SetBucketDisPolicy failed");
            // 其他异常信息打印
            e.printStackTrace();
        }
    }
}
```
#### 相关链接
- 更多示例代码，请参见[Github示例](https://github.com/huaweicloud/huaweicloud-sdk-java-obs/blob/master/app/src/test/java/samples_java/PFSBucketAndObjectOperationSample.java)。
- 设置DIS通知策略过程中返回的错误码含义、问题原因及处理措施可参考[OBS错误码](https://support.huaweicloud.com/api-obs/obs_04_0115.html#section1)。
 
