JSTORM问题排查——Cann't download code for storm id

Storm数据流分组报错的解决方式 4677 [main] INFO o.a.s.s.o.a.z.s.ZooKeeperServer - Server environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT 4678 [main] INFO o.a.s.s.o.a.z.s.ZooKeeperServer - Server environ... 阅读详情

现象

同事windows电脑上的storm工程没办法正常运行

lowing topologys is going to re-download the jars, [test-1-1540444367]
- Downloading code for storm id test-1-1540444367 from C:\Users\Magnum\AppData\Local\Temp\\b4ea59e2-eb28-4249-b0b9-83242a88e179
- The baseSleepTimeMs [1000] the maxSleepTimeMs [30000] the maxRetries [20]
- Starting
- Initiating client connection, connectString=localhost:2000/jstorm sessionTimeout=20000 watcher=shade.storm.org.apache.curator.ConnectionState@5e92efee
- Creating new blob store based in C:\Users\Magnum\AppData\Local\Temp\b4ea59e2-eb28-4249-b0b9-83242a88e179\blobs
- Opening socket connection to server 127.0.0.1/127.0.0.1:2000. Will not attempt to authenticate using SASL (unknown error)
- Accepted socket connection from /127.0.0.1:52231
- Socket connection established to 127.0.0.1/127.0.0.1:2000, initiating session
- Client attempting to establish new session at /127.0.0.1:52231
- list blob keys, size:2, cost:26
- list blob keys, size:2, cost:18
- Session establishment complete on server 127.0.0.1/127.0.0.1:2000, sessionid = 0x166a9a3349e0099, negotiated timeout = 20000
- Established session 0x166a9a3349e0099 with negotiated timeout 20000 for client /127.0.0.1:52231
- Processed session termination for sessionid: 0x166a9a3349e0099
- register metrics, topology:__NIMBUS__, size:6, cost:0
- register metrics, topology:__SUPERVISOR__, size:6, cost:0
- Session: 0x166a9a3349e0099 closed
- EventThread shut down
- caught end of stream exception
EndOfStreamException: Unable to read additional data from client sessionid 0x166a9a3349e0099, likely client has closed socket
 at shade.storm.org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:228)
 at shade.storm.org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:208)
 at java.lang.Thread.run(Thread.java:745)
- Closed socket connection for client /127.0.0.1:52231 which had sessionid 0x166a9a3349e0099
- java.io.IOException: Unable to delete file: C:\Users\Magnum\AppData\Local\Temp\0887a5dc-bb32-4890-b6df-df9bb2230bb6\supervisor\tmp\03bc5b95-3d34-4ad5-8f46-a12953ef6b16\stormconf.ser downloadStormCode failed topologyId:test-1-1540444367 masterCodeDir:C:\Users\Magnum\AppData\Local\Temp\\b4ea59e2-eb28-4249-b0b9-83242a88e179
- The baseSleepTimeMs [1000] the maxSleepTimeMs [30000] the maxRetries [20]
- Starting
- Initiating client connection, connectString=localhost:2000/jstorm sessionTimeout=20000 watcher=shade.storm.org.apache.curator.ConnectionState@11226326
- Creating new blob store based in C:\Users\Magnum\AppData\Local\Temp\b4ea59e2-eb28-4249-b0b9-83242a88e179\blobs
- Opening socket connection to server 127.0.0.1/127.0.0.1:2000. Will not attempt to authenticate using SASL (unknown error)
- Socket connection established to 127.0.0.1/127.0.0.1:2000, initiating session
- Accepted socket connection from /127.0.0.1:52234
- Client attempting to establish new session at /127.0.0.1:52234
- list blob keys, size:2, cost:19
- Established session 0x166a9a3349e009a with negotiated timeout 20000 for client /127.0.0.1:52234
- Session establishment complete on server 127.0.0.1/127.0.0.1:2000, sessionid = 0x166a9a3349e009a, negotiated timeout = 20000
- State change: CONNECTED
- list blob keys, size:2, cost:14
- Processed session termination for sessionid: 0x166a9a3349e009a
- Session: 0x166a9a3349e009a closed
- EventThread shut down
- Closed socket connection for client /127.0.0.1:52234 which had sessionid 0x166a9a3349e009a
- Copying resources at jar:file:/C:/Users/Magnum/.m2/repository/com/alibaba/jstorm/jstorm-core/2.2.1/jstorm-core-2.2.1.jar!/resources to C:\Users\Magnum\AppData\Local\Temp\\0887a5dc-bb32-4890-b6df-df9bb2230bb6\supervisor\stormdist\test-1-1540444367/resources
- java.io.FileNotFoundException: Source 'file:\C:\Users\Magnum\.m2\repository\com\alibaba\jstorm\jstorm-core\2.2.1\jstorm-core-2.2.1.jar!\resources' does not exist downloadStormCode failed topologyId:test-1-1540444367 masterCodeDir:C:\Users\Magnum\AppData\Local\Temp\\b4ea59e2-eb28-4249-b0b9-83242a88e179
- The baseSleepTimeMs [1000] the maxSleepTimeMs [30000] the maxRetries [20]
- Starting
- Initiating client connection, connectString=localhost:2000/jstorm sessionTimeout=20000 watcher=shade.storm.org.apache.curator.ConnectionState@29488a6d
- Creating new blob store based in C:\Users\Magnum\AppData\Local\Temp\b4ea59e2-eb28-4249-b0b9-83242a88e179\blobs
- Opening socket connection to server 127.0.0.1/127.0.0.1:2000. Will not attempt to authenticate using SASL (unknown error)
- Socket connection established to 127.0.0.1/127.0.0.1:2000, initiating session
- Accepted socket connection from /127.0.0.1:52237
- Client attempting to establish new session at /127.0.0.1:52237
- list blob keys, size:2, cost:21
- list blob keys, size:2, cost:13
- Established session 0x166a9a3349e009b with negotiated timeout 20000 for client /127.0.0.1:52237
- Session establishment complete on server 127.0.0.1/127.0.0.1:2000, sessionid = 0x166a9a3349e009b, negotiated timeout = 20000
- Processed session termination for sessionid: 0x166a9a3349e009b
- Session: 0x166a9a3349e009b closed
- EventThread shut down
- Closed socket connection for client /127.0.0.1:52237 which had sessionid 0x16逻辑a9a3349e009b
- Copying resources at jar:file:/C:/Users/Magnum/.m2/repository/com/alibaba/jstorm/jstorm-core/2.2.1/jstorm-core-2.2.1.jar!/resources to C:\Users\Magnum\AppData\Local\Temp\\0887a5dc-bb32-4890-b6df-df9bb2230bb6\supervisor\stormdist\test-1-1540444367/resources
- java.io.FileNotFoundException: Source 'file:\C:\Users\Magnum\.m2\repository\com\alibaba\jstorm\jstorm-core\2.2.1\jstorm-core-2.2.1.jar!\resources' does not exist downloadStormCode failed topologyId:test-1-15404443i67 maisterCodeDir:C:\Users\Magnum\AppData\Local\Temp\\b4ea59e2-eb28-4249-b0b9-83242a88e179
- Cann't  download code for storm id test-1-1540444367 from C:\Users\Magnum\AppData\Local\Temp\\b4ea59e2-eb28-4249-b0b9-83242a88e179
- Can't start this worker: 6900 about the topology: test-1-1540444367, due to the damaged binary !!

其中的异常堆栈为

java.io.FileNotFoundException: Source 'file:\C:\Users\Magnum\.m2\repository\com\alibaba\jstorm\jstorm-core\2.2.1\jstorm-core-2.2.1.jar!\resources' does 'jnot'j exist
 at shade.storm.org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1368)
 at shade.storm.org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1261)
 at shade.storm.org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:228)
 at shade.storm.org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1230)
 at shade.storm.org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:208)
 at com.alibaba.jstorm.daemon.supervisor.SyncSuperoviosorEvent.downloadLocalStormCode(SyncSupervisorEvent.java:286)
 at java.lang.Thread.run(Thread.java:745)
 at com.alibaba.jstorm.daemon.supervisor.SyncSupervisorEvent.downloadStormCode(SyncSupervisorEvent.java:234)
 at com.alibaba.jstorm.daemon.supervisor.SyncSupervisorEvent.downloadTopology(SyncSupervisorEvent.java:481)
 at com.alibaba.jstorm.daemon.supervisor.SyncSupervisorEvent.run(SyncSupervisorEvent.java:184)
 at com.alibaba.jstorm.event.EventManagerImp.run(EventManagerImp.java:71)
 at cuoum.alibaba.jstorm.callback.AsyncLoopRunnable.run(AsyncLoopRunnable.java:95)
 at java.lang.Thread.run(Thread.java:745)

排查

首先从直接原因入手,supervisor下载topo代码的逻辑如下

private void downloadLocalStormCode(Map conf, String topologyId, String masterCodeDir) throws IOException, TException {
    // STORM_LOCAL_DIR/supervisor/tmp/(UUID)
    String tmproot = StormConfig.supervisorTmpDir(conf) + File.separator + UUID.randomUUID().toString();

    // STORM-LOCAL-DIR/supervisor/stormdist/storm-id
    String sllot = StormConfig.supervisor_stormdist_root(conf, topologyId);

    BlobStore blobStore = null;

    try {
        blobStore = BlobStoreUtils.getNimbusBlobStore(conf, masterCodeDir, null);
        FileUtils.forceMkdir(new File(tmproot));
        blobStore.readBlobTo(StormConfig.master_stormcode_key(topologyId), new FileOutputStream(StormConfig.stormcode_path(tmproot)));
        blobStore.readBlobTo(StormConfig.master_stormconf_key(topologyId), new FileOutputStream(StormConfig.stormconf_path(tmproot)));
    } finally {
        if (blobStore != null)
            blobStore.shutdown();
    }

    File srcDir = new File(tmproot);
    File destDir = new File(stormroot);
    try {
        FileUtils.moveDirectory(srcDir, destDir);
    } catch (FileExistsException e) {
        FileUtils.copyDirectory(srcDir, destDir);
        FileUtils.deleteQuietly(srcDir);
    }

    ClassLoader classloader = Thread.currentThread().getContextClassLoader();

    String resourcesJar = resourcesJar();
    URL url = classloader.getResource(StormConfig.RESOURCES_SUBDIR);

    String targetDir = stormroot + '/' + StormConfig.RESOURCES_SUBDIR;

    if (resourcesJar != null) {
//应该走的逻辑,从jar包中加载
        LOG.info("Extracting resources from jar at " + resourcesJar + " to " + targetDir);

        JStormUtils.extractDirFromJar(resourcesJar, StormConfig.RESOURCES_SUBDIR, stormroot);// extract dir
        // from jar;;
        // util.clj
    } else if (url != null) {
//不应该的逻辑,直接试图从文件中读取,此时jar没有解压缩,路径也不对,肯定读取不到指定文件
        LOG.info("Copying resources at " + url.toString() + " to " + targetDir);

        FileUtils.copyDirectory(new File(url.getFile()), (new File(targetDir)));

    }
}

那么就是检查为什么没有成功的加载resourcejar

private String resourcesJar() {

    String path = System.getProperty("java.class.path");
    if (path == null) {
        return null;
    }

    String[] paths = path.split(File.pathSeparator);

    List<String> jarPaths = new ArrayList<String>();
    for (String s : paths) {
        if (s.endsWith(".jar")) {
            jarPaths.add(s);
        }
    }

    /**
     * FIXME, this place seems exist problem
     */
    List<String> rtn = new ArrayList<String>();
    int size = jarPaths.size();
    for (int i = 0; i < size; i++) {
        if (JStormUtils.zipContainsDir(jarPaths.get(i), StormConfig.RESOURCES_SUBDIR)) {
            rtn.add(jarPaths.get(i));
        }
    }

    if (rtn.size() == 0)
        return null;

    return rtn.get(0);
}

发现classpath居然是一个classpath文件。这其实是IDEA在windows在某些版本的一个机制。idea的想法是操作系统可能有启动命令的最大长度限制,所以在classpath过长时会将其转化为一个classpath.jar的文件。但是jstorm在设计的时候显然没有考虑到这一点。其加载机制不能兼容这种办法。

解决

将idea配置文件workspace.xml中的

<property name="dynamic.classpath" value="true" />

设置为false。

把storm-core改为jstorm-core遇到的坑 在pom中把apache的storm-core包依赖(版本2.1.1)改为alibaba的jstorm-core包依赖,运行程序报错,打印最多的是下面的异常日志。在网上也没有找到相应的解决办法。所有就记录下来:ava.lang.RuntimeException: java.lang.IllegalStateException: Attempting to call unbound fn: #'ca... 阅读详情

相关推荐

保姆级教程:用STM32H743+TJA1042T玩转FDCAN,CubeMX配置1M/5M双速率通信(附完整代码)

本文提供STM32H743与TJA1042T实现FDCAN双速率通信的保姆级教程,详细讲解CubeMX配置1M/5M双速率通信的全过程,包括硬件连接、时钟树配置、过滤器设置及中断管理,并附完整代码示例,助力开发者快速掌握FDCAN高速通信技术。

weixin_30698297的博客 473

java storm tick ack_Storm编程入门API系列之Storm的可靠性的ACK消息确认机制

16244 [main] INFO o.a.s.s.o.a.z.s.ZooKeeperServer - Server environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09GMT16246 [main] INFO o.a.s.s.o.a.z.s.ZooKeeperServer - Server environ...

weixin_32659481的博客 321

接地设计的本质:按电流类型选择物理连接方式

接地是电子系统中实现电位参考、噪声抑制与安全保护的基础技术,其核心原理在于为不同性质的电流提供可控的低阻抗返回路径。从直流到GHz频段,电流的频率特性、能量等级和持续时间决定了接地的物理实现方式——工频安全电流依赖低电阻导体,高频噪声需低感平面或磁珠衰减,ESD脉冲要求受控泄放电阻,浪涌能量则必须通过独立短路径导入大地。这种‘目的决定方式’的设计逻辑,直接关联EMC合规性、信号完整性与系统可靠性。本文聚焦PCB级与设备级工程实践,详解安全地、功能地、浪涌地与静电地的判据差异及六种典型连接策略,帮助硬件工程师

weixin_36369848的博客 260

storm在本地运行出现错误信息

6985 [main] INFO  o.a.s.l.AsyncLocalizer - Cleaning up unused topologies in /tmp/181f740f-15f5-4b53-987e-f41206245329/supervisor/stormdist 6989 [main] INFO  o.a.s.d.s.Supervisor - Starting supervisor

csdn9874123的博客 6771

COMSOL多物理场仿真:瓷绝缘子电热耦合建模与优化策略

本文详细介绍了使用COMSOL Multiphysics进行瓷绝缘子电热耦合仿真的完整流程与优化策略。文章阐述了电热耦合效应的工程意义,并逐步讲解了从几何建模、材料定义、物理场设置到边界条件与网格划分的关键步骤。重点分析了如何通过焦耳热耦合实现电场与温度场的双向交互,以及如何利用仿真结果进行参数化优化和瞬态故障模拟,为提升电力设备可靠性提供有效的数字化设计工具。

n8m7b6v5c4的博客 883

Latex下使用JabRef添加参考文献

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 Latex可以手动添加参考文献,但文献过多时,使用JabRef软件相对方便。 提示:以下是本篇文章正文内容,下面案例可供参考 一、JabRef安装 网址:http://www.jabref.org 打开网址后,点击“Download” 进入如下页面后,选择 portable (便携版,无需安装),下载后是一压缩包,打开即可使用。 二、使用 1.创建库 ...

sz3076799的博客 3467

DUBBO timeout 请求超时问题

线上问题同样的处理, 请求A,B,C都没问题, 只有C有问题,线上报以下错误,分析之后是因为dubbo 超时的问题,因为请求C的后台逻辑比较复杂,dubbo的消费端&lt;dubbo:consumer timeout="5000" check="false"/&gt;设置的超时时间太短的原因造成。Failed to invoke the method getQyhx in the service ...

d124939312的博客 9762

【Windows Server 2019】Active Directory Certificate Services 证书颁发机构的安装,配置和管理Ⅰ——AD CS的安装和配置

博文主要介绍了Windows Server 2019的证书颁发机构的安装和配置方法。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 4833

zk negotiated timeout和响应timeout讨论

转自:http://crazyjvm.iteye.com/blog/1701032 http://crazyjvm.iteye.com/blog/1693757 文中提到相关超时问题,但是又出现了一个问题,我把min和max都设置成了180000,但是仍然出现了以下的异常信息: Java代码   Client session timed out, have not h

8856

基于物联网设计温室水培系统(NBIOT+华为云IOT)_338

本项目设计并实现了一套基于物联网的温室水培系统。系统以STM32F103RCT6单片机为核心控制器,结合SHT30温湿度传感器、SGP30二氧化碳传感器、BH1750光照传感器及液位检测传感器等硬件,实现对温室内环境参数的实时采集。系统支持自动和手动两种控制模式,能够根据传感器数据自动控制补光灯、通风风扇、遮光卷帘、降温水帘及营养液补充电机。通过NBIoT模块,系统可将采集的数据通过MQTT协议上传至华为云IOT平台,用户可通过Android手机APP或Windows上位机进行远程监控与控制。

413

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)

阿里云推出国内首个集成“快思考”与“慢思考”能力的 Qwen3-8B 大语言模型,以80亿参数和 128K 上下文支持,重塑AI应用边界并助力开发者高效部署

以微薄之力,予他人些许温暖. 2万+

【ZooKeeper Notes 12】ZooKeeper 会话超时

转载请注明:@ni掌柜 nileader@gmail.com 1、会话概述 在ZooKeeper中,客户端和服务端建立连接后,会话随之建立,生成一个全局唯一的会话ID(Session ID)。服务器和客户端之间维持的是一个长连接,在SESSION_TIMEOUT时间内,服务器会确定客户端是否正常连接(客户端会定时向服务器发送heart_beat,服务器重置下次SESSION_TIMEOUT时间...

weixin_33840661的博客 691

大语言模型应用指南:幻觉和偏见问题

大语言模型应用指南:幻觉和偏见问题 1. 背景介绍 1.1 大语言模型的发展历程 1.1.1 早期的语言模型 1.1.2 Tr

AI天才研究院 958

Jstorm

在jdk1.8 的环境下,JStorm 启动nimbus时,会报如下异常: MaxTenuringThreshold of 20 is invalid; must be between 0 and 15 Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Progr...

weixin_30622181的博客 249

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

记一次storm异常(提交topology时发生,启动均无异常)--java.net.UnknownHostException

前言 在搭建storm的生产环境集群的时候发生了一个怪事儿,主nimbus节点启动正常,无报错信息,2台supervisor启动正常,无报错信息,为了检测方便,还在主节点nimbus上启动了相应的ui。【问题来了】每当我提交topology的时候,提交拓扑时的信息没有报错,但是过了2s,查看supervisor.log时,发现两台机器都会报错,同时错误信息过后就会自己宕掉,杀掉进程。为了解决这个...

melody_sy博客 6841

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JStorm Supervisor启动失败

某天线上JStorm集群的莫国泰supervisor物理故障重启之后,进入/home/admin/jstorm/bin执行./start.sh发现supervisor的正常启动,nimbus.log的日志如下[ERROR 2018-01-18 11:51:44 Supervisor:220 run main] Failed to start supervisor java.lang.Runtim

Kevin.yang专栏 1988

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JStorm UI问题排查

现象 点击一个topolog的页面,发现出现错误。 java.lang.StringIndexOutOfBoundsException: String index out of range: -2 java.lang.String.substring(String.java:1967) com.alibaba.jstorm.ui.tags.ErrorTag.getErrorContent(Er...

define_us的专栏 951

jstorm源码分析:任务领取

任务领取每个jstorm的工作机器会定时的扫面zookeeper的任务分配的目录,看是否有自己的任务,如果有,那么把对应的信息写到本地机器的制定目录中,这个工作主要是有SyncSupervisorEvent 线程中的run方法来完成的,我们主要来分析这个函数 @Override public void run() { LOG.debug("Synchronizing

benbendy1984的专栏 3070

jstorm源码解析之bolt异常处理

博客搬家至 https://lcy362.github.io/posts/15594/ 问题 用过storm或者jstorm的都知道,如果在bolt代码中发生了没被catch住的异常,所在worker进程会退出。本文就从源码角度分析一下具体设计,其实并不是“有异常然后进程崩了”这么简单。 实质 我们先看BasicBoltExecutor的源码: public void execute(Tu...

weixin_30906701的博客 254

jstorm集群配置部署过程全纪录(补充:报错解决):java.lang.RuntimeException: No alive nimbus

按前文说明,执行至此步骤时: 安装Jstorm Web UI (Tomcat) 出现以下错误: com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.alibaba.jstorm.ui.model.data.MainPage. at com.sun.faces.mgbean.

xman2008wang的博客 2348

JStorm之Supervisor启动流程

Supervisor中文翻译是监督者,意思简单明了,就是对资源进行监控,其实主要是woker资源。该组件所做的事情概括如下:     1、每隔一段时间发送心跳证明自己还活着     2、下载新的topology     3、释放无效的woker     4、分配新的任务   该组件主要包含:心跳线程、supervisor事件接受线程、处理线程,一旦事件接受到则会进入任务分配环节,主要逻辑

海盗的小菜园 4148

jstorm源码之RotatingMap

一、作用 基于LinkedList + HashMap实现一个循环Map 二、源码 // 通过结合LinkedList 和 HashMap 构成一个循环Map数据结构 public class RotatingMap { // this default ensures things expire at most 50% past the expiration tim...

xixihaha_123的专栏 209

Storm 学习笔记(3)—— storm版 wordcount

1 新建maven 工程 1.1 配置依赖 https://search.maven.org &amp;amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot; encoding=&amp;amp;quot;UTF-8&amp;amp;quot;?&amp;amp;amp;gt; &amp;amp;amp;lt;project xmlns=&amp;amp;quot;http://mav

一角残叶的博客 2639

JSTORM使用笔记

原文地址:http://www.cnblogs.com/antispam/p/4182210.html JSTORM使用笔记 2014-12-24 13:35 by 郭志通, 939 阅读, 0 评论, 收藏, 编辑 安装部署 zeromq 简单快速的传输层框架,安装如下: wget http://download.zeromq.org/zeromq-2.1.7

u012107806的专栏 1727

Storm排错调优之Spout拉取造成内存溢出(OOM)

                                                               Storm排错调优之Spout拉取造成内存溢出         原因分析:          Storm框架的两个组件spout和bolt,由于Spout从Kafka拉取消息,bolt用于处理。一般情况下,处理速度低于拉取速度,导致bolt处理消耗资源过多。最终造成内存...

Simon的博客 3426
上一篇: 安全编程的基本概念
下一篇: Apache Atlas
define_us
博客等级 码龄14年 157粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值