活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 出海产品促销专区 NEW 爆款云主机低至2折,高性价比,不限新老速来抢购!
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心
      文档中心

      事件总线

      事件总线

        • 产品动态
        • 产品简介
        • 产品定义
        • 功能特性
        • 产品优势
        • 基本概念
        • 典型应用场景
        • 主子账号和IAM权限管理
        • 服务内联委托管理
        • 计费说明
        • 计费概述
        • 计费项
        • 欠费说明
        • 计费样例
        • 计费FAQ
        • 快速入门
        • 开通事件总线EventBridge并委托授权
        • 天翼云官方事件源接入流程
        • 自定义事件接入流程
        • 用户指南
        • 事件
        • 事件概述
        • 发布事件
        • 事件总线
        • 事件总线概述
        • 事件源
        • 事件源概述
        • 天翼云官方事件源
        • 天翼云官方事件源概述
        • 对象存储官方事件源
        • 云日志服务官方事件源
        • 管理自定义事件源
        • 自定义事件源类型
        • 自定义应用事件源
        • 自定义分布式消息服务Kafka事件源
        • 自定义分布式消息服务MQTT事件源
        • 自定义分布式消息服务RabbitMQ事件源
        • 自定义分布式消息服务RocketMQ事件源
        • 事件规则
        • 事件规则概述
        • 事件目标
        • 事件目标概述
        • 目标服务类型
        • 函数计算事件目标
        • 分布式消息服务Kafka事件目标
        • 分布式消息服务RocketMQ事件目标
        • 分布式消息服务RabbitMQ事件目标
        • HTTP/HTTPS网络端点事件目标
        • 事件模式
        • 事件内容转换
        • 管理事件规则
        • 管理自定义事件总线
        • 事件流
        • 事件流概述
        • 事件源
        • 分布式消息服务Kafka事件源
        • 分布式消息服务MQTT事件源
        • 分布式消息服务RabbitMQ事件源
        • 分布式消息服务RocketMQ事件源
        • 事件目标
        • 路由到函数计算
        • 路由到分布式消息服务Kafka
        • 路由到分布式消息服务RabbitMQ
        • 路由到分布式消息服务RocketMQ
        • 事件内容转换
        • 使用函数计算作为Transform
        • 事件目标中的事件内容转换
        • 事件模式
        • 管理事件流
        • 网络管理
        • 访问端点
        • 开发参考
        • SDK概述
        • Cloudevents SDK参考
        • Java SDK
        • Go SDK
        • C++ SDK
        • 最佳实践
        • 基于事件流实现消息路由
        • 基于事件流实现Kafka消息路由
        • 基于事件流实现RocketMQ消息路由
        • 基于事件流实现RabbitMQ消息路由
        • 基于事件流实现消息路由至函数计算
        • 常见问题
        • 计费类
        • 事件总线EventBridge如何收费?
        • 我不想使用事件总线EventBridge了,我该如何操作?
        • 如果只创建自定义事件总线,但无事件投递,会收费吗?
        • 通用类
        • 是否支持将自定义事件发送到事件总线EventBridge中?
        • 如何过滤传输到事件目标的事件?
        • 通过SDK发送事件失败,是什么情况导致?
        • 自定义事件是否支持批量发送到事件总线EventBridge中?该如何封装?
        • 事件总线 EventBridge 有哪些价值和优势?
        • 如何将事件内容转换后传输到事件目标?
        • 事件目标未被触发,是什么情况导致?
        • 如何过滤最终传输到事件目标的事件?
        • 天翼云官方事件源与用户自定义事件源的区别是什么?
        • 相关协议
        • 公测产品服务协议
          无相关产品

          本页目录

          帮助中心事件总线开发参考Cloudevents SDK参考Java SDK
          Java SDK
          更新时间 2025-06-18 17:56:18
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2025-06-18 17:56:18
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接

          您可使用开源CloudEvents Java SDK发布事件。

           

          前提条件

          1.您已下载IntelliJ IDEA等Java研发IDE。

          2.在pom.xml中加入依赖。

          <dependency>
              <groupId>io.cloudevents</groupId>
              <artifactId>cloudevents-core</artifactId>
              <version>${cloudevents.version}</version>
          </dependency>
          <dependency>
              <groupId>io.cloudevents</groupId>
              <artifactId>cloudevents-http-vertx</artifactId>
              <version>${cloudevents.version}</version>
          </dependency>
          <dependency>
              <groupId>io.cloudevents</groupId>
              <artifactId>cloudevents-api</artifactId>
              <version>${cloudevents.version}</version>
          </dependency>
          <dependency>
              <groupId>io.cloudevents</groupId>
              <artifactId>cloudevents-json-jackson</artifactId>
              <version>${cloudevents.version}</version>
          </dependency>

          注:cloudevents.version使用最新里程碑版本2.0.0-milestone1。


          发布事件

          结构化示例代码如下:

          import java.net.URI;
          import java.util.UUID;
          
          import io.cloudevents.CloudEvent;
          import io.cloudevents.core.builder.CloudEventBuilder;
          import io.cloudevents.http.vertx.VertxMessageFactory;
          import io.cloudevents.jackson.JsonFormat;
          import io.vertx.core.Vertx;
          import io.vertx.core.http.HttpClient;
          import io.vertx.core.http.HttpClientRequest;
          
          public class SampleStructuredHTTPClient {
          
          // 填写天翼云账号的aksk,确保该账号已授权事件总线的发布权限
              private static String accessKeyId = System.getenv("CTYUN_ACCESS_KEY_ID");
              private static String accessKeySecret = System.getenv("CTYUN_ACCESS_KEY_SECRET");
              
              // 在事件总线控制台获取服务接入地址
              private static String endpoint = "https://" + System.getenv("CTYUN_EVENTBRIDGE_SERVICE_HOST") + "/api/v1/putEvents";
          
              public static void main(String[] args) throws Exception {
          
                 final Vertx vertx = Vertx.vertx();
                 final HttpClient httpClient = vertx.createHttpClient();
          
                 // 创建一个事件模板来设置基本的CloudEvent属性。
                 CloudEventBuilder eventTemplate = CloudEventBuilder.v1()
                       .withSource(URI.create("https://github.com/cloudevents/sdk-java/tree/master/examples/vertx"))
                       .withType("vertx.example");
          
                 // 创建HTTP请求。
                 final HttpClientRequest request = httpClient.postAbs(endpoint)
                       .handler(response -> {
                          System.out.println(response.statusMessage());
          
                       })
                       .exceptionHandler(System.err::println);
          
                 String id = UUID.randomUUID()
                       .toString();
                 String data = "{\"name\":\"Eventbridge\",\"number\":100}";
          
                 // 从模板中创建事件。
                 final CloudEvent event = eventTemplate.newBuilder()
                       .withId(id)
                       .withData("application/json", data.getBytes())
                       // 确保总线已经创建
                       .withExtension("ctyuneventbusname", "mybus")
                       .withSource(URI.create("https://github.com/cloudevents/sdk-java/tree/master/examples/vertx"))
                       .withType("vertx.example")
                       .withSubject("ceb:cos:huadong1:1234567:events")
                       .build();
          
                 request.putHeader("content-type", "application/cloudevents+json");
                 request.putHeader("authorization",
                       "ceb" + ":" + accessKeyId + ":" + SignatureHelper.getSignature(SignatureHelper.getStringToSign(request),
                             accessKeySecret) + "");
                 VertxMessageFactory.createWriter(request)
                       .writeStructured(event, new JsonFormat());
              }
          
          }

          二进制示例代码如下:

          import java.net.URI;
          import java.util.UUID;
          
          import io.cloudevents.CloudEvent;
          import io.cloudevents.core.builder.CloudEventBuilder;
          import io.cloudevents.http.vertx.VertxMessageFactory;
          import io.vertx.core.Vertx;
          import io.vertx.core.http.HttpClient;
          import io.vertx.core.http.HttpClientRequest;
          
          public class SampleBinaryHTTPClient{
          
              // 填写天翼云账号的aksk,确保该账号已授权事件总线的发布权限
              private static String accessKeyId = System.getenv("CTYUN_ACCESS_KEY_ID");
              private static String accessKeySecret = System.getenv("CTYUN_ACCESS_KEY_SECRET");
              
              // 在事件总线控制台获取服务接入地址
              private static String endpoint = "https://" + System.getenv("CTYUN_EVENTBRIDGE_SERVICE_HOST"); + "/api/v1/putEvents";
          
              public static void main(String[] args) throws Exception {
          
                 final Vertx vertx = Vertx.vertx();
                 final HttpClient httpClient = vertx.createHttpClient();
          
                 // 创建一个事件模板来设置基本的CloudEvent属性。
                 CloudEventBuilder eventTemplate = CloudEventBuilder.v1()
                       .withSource(URI.create("https://github.com/cloudevents/sdk-java/tree/master/examples/vertx"))
                       .withType("vertx.example");
          
                 // 创建HTTP请求。
                 final HttpClientRequest request = httpClient.postAbs(endpoint)
                       .handler(response -> {
                          System.out.println(response.toString());
                       })
                       .exceptionHandler(e -> {
                          System.out.println(e);
                       });
          
                 String id = UUID.randomUUID()
                       .toString();
                 String data = "{\"name\":\"Eventbridge\",\"number\":100}";
          
                 // 从模板中创建事件。
                 final CloudEvent event = eventTemplate.newBuilder()
                       .withId(id)
                       .withData("application/json", data.getBytes())
                       // 确保总线已经创建
                       .withExtension("ctyuneventbusname", "mybus")
                       .withSource(URI.create("https://github.com/cloudevents/sdk-java/tree/master/examples/vertx"))
                       .withType("vertx.example")
                       .withSubject("ceb:myapp:huadong1:1234567:events")
                       .build();
          
                 request.putHeader("content-type", "application/json");
                 request.putHeader("authorization",
                       "ceb" + ":" + accessKeyId + ":" + SignatureHelper.getSignature(SignatureHelper.getStringToSign(request),
                             accessKeySecret) + "");
                 VertxMessageFactory.createWriter(request)
                       .writeBinary(event);
              }
          }

          签名生成工具

          示例代码如下:

          import java.util.ArrayList;
          import java.util.Arrays;
          import java.util.Base64;
          import java.util.HashMap;
          import java.util.Iterator;
          import java.util.List;
          import java.util.Map;
          import java.util.Set;
          import javax.crypto.Mac;
          import javax.crypto.spec.SecretKeySpec;
          
          import io.netty.util.internal.StringUtil;
          import io.vertx.core.MultiMap;
          import io.vertx.core.http.HttpClientRequest;
          
          public class SignatureHelper {
          
              public static String getStringToSign(HttpClientRequest request) {
                 String method = request.method()
                       .name();
                 String pathname = request.path();
                 MultiMap headers = getHeadersToLower(request.headers());
                 Map<String, String> query = buildQueryMap(request.query());
                 String contentMD5 = headers.get("content-md5") == null ? "" : (String)headers.get("content-md5");
                 String contentType = headers.get("content-type") == null ? "" : (String)headers.get("content-type");
                 String date = headers.get("date") == null ? "" : (String)headers.get("date");
                 String header = method + "\n" + contentMD5 + "\n" + contentType + "\n" + date + "\n";
                 String canonicalizedHeaders = getCanonicalizedHeaders(headers);
                 String canonicalizedResource = getCanonicalizedResource(pathname, query);
                 return header + canonicalizedHeaders + canonicalizedResource;
              }
          
              private static Map<String, String> buildQueryMap(String query) {
                 Map<String, String> map = new HashMap<>();
                 if (!StringUtil.isNullOrEmpty(query)) {
                    String[] params = query.split("&");
                    Arrays.stream(params)
                          .forEach(param -> {
                             String[] kv = param.split("=");
                             map.put(kv[0], kv[1]);
                          });
                 }
                 return map;
              }
          
              protected static MultiMap getHeadersToLower(MultiMap headers) {
                 MultiMap map = MultiMap.caseInsensitiveMultiMap();
                 Set<String> keys = headers.names();
                 Iterator<String> iterator = keys.iterator();
          
                 while (iterator.hasNext()) {
                    String key = iterator.next();
                    map.add(key.toLowerCase(), headers.get(key));
                 }
                 return map;
              }
          
              protected static String getCanonicalizedHeaders(MultiMap headers) {
                 String prefix = "x-ceb";
                 Set<String> keys = headers.names();
                 List<String> canonicalizedKeys = new ArrayList();
                 Iterator var4 = keys.iterator();
          
                 while (var4.hasNext()) {
                    String key = (String)var4.next();
                    if (key.startsWith(prefix)) {
                       canonicalizedKeys.add(key);
                    }
                 }
                 String[] canonicalizedKeysArray = (String[])canonicalizedKeys.toArray(new String[canonicalizedKeys.size()]);
                 Arrays.sort(canonicalizedKeysArray);
                 StringBuilder result = new StringBuilder();
          
                 for (int i = 0; i < canonicalizedKeysArray.length; ++i) {
                    String key = canonicalizedKeysArray[i];
                    result.append(key);
                    result.append(":");
                    result.append(((String)headers.get(key)).trim());
                    result.append("\n");
                 }
          
                 return result.toString();
              }
          
              protected static String getCanonicalizedResource(String pathname, Map<String, String> query) {
                 String[] keys = (String[])query.keySet()
                       .toArray(new String[query.size()]);
                 if (keys.length <= 0) {
                    return pathname;
                 } else {
                    Arrays.sort(keys);
                    StringBuilder result = new StringBuilder(pathname);
                    result.append("?");
          
                    for (int i = 0; i < keys.length; ++i) {
                       String key = keys[i];
                       result.append(key);
                       String value = (String)query.get(key);
                       if (!StringUtil.isNullOrEmpty(value) && !"".equals(value.trim())) {
                          result.append("=");
                          result.append(value);
                       }
          
                       result.append("&");
                    }
                    return result.deleteCharAt(result.length() - 1)
                          .toString();
                 }
              }
          
              public static String getSignature(String stringToSign, String secret) throws Exception {
                 Mac mac = Mac.getInstance("HmacSHA1");
                 mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA1"));
                 byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
                 return Base64.getEncoder()
                       .encodeToString(signData);
              }
          }
          文档反馈

          建议您登录后反馈,可在建议与反馈里查看问题处理进度

          鼠标选中文档,精准反馈问题

          选中存在疑惑的内容,即可快速反馈问题,我们会跟进处理

          知道了

          上一篇 :  Cloudevents SDK参考
          下一篇 :  Go SDK
          搜索 关闭
          ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
          公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
          备案 京公网安备11010802043424号 京ICP备 2021034386号
          ©2025天翼云科技有限公司版权所有
          京ICP备 2021034386号
          备案 京公网安备11010802043424号
          增值电信业务经营许可证A2.B1.B2-20090001
          用户协议 隐私政策 法律声明