前天使用jython全量build数据中间总会出现字符乱码问题,浪费了很多时间找问题原因,记录一下问题解决过程。
问题现象:
2013-09-27 15:39:08 [ERROR] com.duitang.dboss.client.SimpleServiceProxy - service invoke faild! org.codehaus.jackson.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 0)): has to be escaped using backslash to be included in string value at [Source: java.io.StringReader@2710e110; line: 1, column: 387287] at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433) at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521) at org.codehaus.jackson.impl.JsonParserMinimalBase._throwUnquotedSpace(JsonParserMinimalBase.java:482) at org.codehaus.jackson.impl.ReaderBasedParser._finishString2(ReaderBasedParser.java:1359) at org.codehaus.jackson.impl.ReaderBasedParser._finishString(ReaderBasedParser.java:1330) at org.codehaus.jackson.impl.ReaderBasedParser.getText(ReaderBasedParser.java:200) at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:59) at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.mapObject(UntypedObjectDeserializer.java:218) at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:47) at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.mapArray(UntypedObjectDeserializer.java:165) at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:51) at org.codehaus.jackson.map.deser.std.MapDeserializer._readAndBind(MapDeserializer.java:319) at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:249) at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33) at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863) at com.duitang.dboss.client.SimpleServiceProxy.doExecute(SimpleServiceProxy.java:76) at com.duitang.dboss.client.SimpleServiceProxy.execute(SimpleServiceProxy.java:48) at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:186) at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:204) at org.python.core.PyObject.__call__(PyObject.java:438) at org.python.core.PyObject.__call__(PyObject.java:442) at org.python.core.PyMethod.__call__(PyMethod.java:151) at dboss$py._JServiceProxy__invoke$42(/duitang/dist/app/main/java/japa/src/main/webapp/dboss.py:342)
过程分析:
1. 猜测一:数据的问题
通过报错原因应该是dboss返回的字符串包含特殊字符导致的。之前以为是某些数据包含特殊字符导致的,但是把导致错误ids记录下来测试却不会报错。
2.猜测二: 和数据没有关系
之前每次通过build数据报错来验证,这样每次测试话费很多时间,后来转念一想,也许和数据没关系吧,在本地写了一个测试脚本:
DbossClient dbossClient = new DbossClient(map); final ServiceProxy blogQueryService = dbossClient.getService("blogQueryService"); for (int i = 0; i < 1000; ++i) { try { List<Long> ids = new ArrayList(); for (int j = 0; j < 2000; ++j) { ids.add(8772421l); } Object result = blogQueryService.execute("queryBlogDetail", new Object[] { ids }); System.out.println(i); } catch (Exception e) { e.printStackTrace(); break; } }
靠,居然能重现问题,果然和数据关系,应该是大数据量传输的问题。
3.猜测三: buf读取的问题
现在问题很好定位了,之前修改了readLine方法:
public String readLine(int length) throws IOException { int bytesToRead = Math.min(input.available(), length); ByteArrayOutputStream output = new ByteArrayOutputStream(bytesToRead); int index = 0; byte[] buffer = null; while (true) { buffer = output.toByteArray(); index = ToolUtil.indexOf(buffer, EOF); if (index >= 0) { break; } bytesToRead = Math.min(input.available(), length); if (bytesToRead > 0) { byte[] bytes = new byte[bytesToRead]; input.read(bytes); output.write(bytes); } else { int b = input.read(); // 此操作会阻塞,直到有数据被读到 if (b < 0) { throw new IOException( " end of the socket input stream has been reached,may be server socket is closed!"); } else { input.unread(b); continue; } } } return new String(buffer, DbossClientConstant.ENCODE); }
但这个方法存在一个bug,其实很基础,原来input.available()返回的可用字节数,不一定保证input.read(bytes)实际能读取这么多。请看available()是如何描述的:
javadoc写道
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。
注意,有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。
注意,有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。
相关推荐
团队成员小心翼翼地取出了这只飞蛾,并将其贴在了当天的工作日志上,旁边写着:“First actual case of bug being found”(第一次真实发生的bug案例)。 这个事件不仅解决了当时的技术问题,更重要的是它创造了一...
- 示例:第一次修改是因为代码逻辑错误导致,第二次是因为数据库连接配置不当,第三次是因为前端界面未同步更新等问题。 **3. BUG解决优先级** - 开发人员根据BUG的优先级来调整自己的工作计划。 - **重要且紧急*...
- **批量运行**(仅限Test Case模式):一次性为多个Test Case创建Test Result,最多100个。 通过以上介绍,初学者可以对BugFree的基本操作和工作流程有初步了解,从而更好地进行缺陷管理和测试工作。在实际使用...
假设在一次功能测试中发现了一个BUG,具体表现为某个功能在特定条件下无法正常工作。经过初步分析,确定此BUG为“严重级”。接下来的处理流程如下: 1. **记录**:记录下BUG的详细信息,包括出现的环境、复现步骤等...
如果一个BUG可以轻松地被重现,这表明问题可能具有普遍性,需要立即解决。测试人员应记录每次尝试重现BUG的难度,并据此给出相应的分数。例如,每次操作都能立即复现的BUG可得1分,而难以复现的BUG则得分更高。这样...
BUGFREE是一款广泛使用的缺陷跟踪系统,它允许团队记录、分配和跟踪软件开发过程中的错误和问题。通过扩展脚本,用户能够定制化其工作流程,提高生产力。 在描述中提到的扩展脚本,其主要目的是在指定日期自动发送...
在IT行业中,修复bug是软件开发过程中的常态。"关于一些bug的修复问题的解决"这一标题揭示了我们要探讨的核心内容:如何有效地...每个bug的修复都是一次提升软件质量的机会,同时也反映了开发者解决问题的技能和经验。
- **定期清理**:定期清理已解决或不再需要的bug记录,保持系统的整洁。 - **有效沟通**:确保团队成员对bug的理解一致,及时更新状态和备注,避免信息滞后。 - **培训与规范**:为团队提供使用培训,制定统一的...
它借鉴了微软的研发流程和Bug管理理念,提供了一种简单实用的解决方案,尤其适合中小IT企业和技术开发团队。 **1. Bugfree的核心特点** 1. **先进理念**:Bugfree采用了微软的成熟研发流程和管理理念,使得问题...
标题:“内核208天bug分析”描述:“腾讯大神写的内核timer调试笔记,典型的208天才重现一次的bug调试技巧” 知识点: 1. 内核bug现象:从描述中提到这是一个典型的内核bug,该bug表现形式为每208天重现一次,这种...
- **日志和历史记录**:系统记录每一次bug状态的变更,便于追溯和分析。 3. **IIS配置**:IIS(Internet Information Services)是Windows操作系统上的Web服务器,用户可以直接在IIS上配置Bugfree,无需其他Web...
在软件开发过程中,bug管理是一项至关重要的任务,它涉及到整个项目的质量和进度。本文档详细阐述了禅道bug管理规范及其处理流程,旨在为开发人员和测试人员提供清晰的指导,确保bug的有效追踪和解决。 首先,我们...
3. **Java**: Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性闻名。它具有丰富的类库和强大的跨平台能力,是构建复杂应用的理想选择。 4. **开源**: 开源软件意味着其源代码对公众开放...
Bugfree是一款开源的缺陷跟踪管理系统,主要用于软件测试过程中的缺陷记录与管理。本文档将详细介绍如何搭建Bugfree环境,包括XAMPP的安装与配置,以及在解决各种安装过程中遇到的问题的基础上,对Bugfree进行安装,...
在软件测试过程中,BUG数据分析是一项至关重要的工作,它涉及到对软件缺陷的全面理解和管理,以提升软件质量和用户体验。首先,我们需要明确缺陷的定义,包括软件未达到产品说明书的功能、表现与说明书不一致、超出...
4. **关联与依赖**:BugFree支持将一个bug与其他bug关联,或者设定依赖关系,帮助团队识别和解决复杂的问题链。 5. **任务分配**:管理者可以将bug分配给特定的开发人员,明确责任人,提高问题解决效率。 6. **...
我们在2.x 版本的兼容和升级上做了大量的工作,但毕竟是一次完全的技术重构,系统稳定性和用户体验还需要在后续版本不断完善。提醒大家在对BugFree进行升级之前,对原有数据进行备份。也非常欢迎大家就使用过程中的...
在这款游戏中,玩家将与一个不断学习和适应的AI系统进行互动,这使得每一次的游戏过程都有可能带来全新的挑战和策略。下面,我们将详细探讨这款游戏的各个组成部分以及相关的知识点。 首先,游戏攻略文档提供了玩家...
### ARCGIS PRO官网发布的bug修改记录 #### 概述 ArcGIS Pro是Esri公司开发的一款高级地理信息系统软件,广泛应用于地图制作、空间数据分析、地理处理等多个领域。随着技术的发展与用户需求的增长,ArcGIS Pro不断...
综上所述,本项目的开发不仅是对现有BUG管理流程的一次升级,也为未来的软件开发提供了重要的支持工具。通过对整个项目周期的详细规划和实施,不仅提升了团队的技术能力,也为组织带来了实际的价值。