不小心弄出一个线程不安全的Service
class ExcelImpService extends AbstractExcelImporter {
ExcelImportService excelImportService
List<Map> imp(FileStore excelFileStore, Map config) {
String excelPath = excelFileStore.path
assert new File(excelPath).exists()
this.
read(excelPath)
println workbook.getSheetName(0)
println workbook.getSheetName(0) //停一下
excelImportService.columns(workbook, config)
}
}
因为默认依赖注入的service是单实例的,所以会出现下面的结果
---sout---
浏览器1:company
浏览器2:expenseGroup
浏览器2:expenseGroup
浏览器1:expenseGroup (属性对象被别的线程修改了,应该还是company才对)
这个问题还是很隐晦的,而且线程安全问题一般不容易测试,所以要尽量从理论上消灭在萌芽状态
public abstract class AbstractExcelImporter extends imexporter.AbstractImexporter {
Workbook
workbook= null //
这个继承过来的属性就是隐患,每次调用read方法,都会修改之
...略...
}
经验:service如果有属性,要么搞成final的,否则就要格外留意方法中对其修改的操作。
解决办法:
开始想把ExcelImpService改成一个普通类,但是不利于获得其它service的支持(excelImportService)。。。
把service声明为session或request级别的,体验一下基于使用条件的线程安全。
/**
* default(singleton) is NOT thread safe, since extends workbook prototype from AbstractExcelImporter
* request -- 同一浏览器的同一tab是线程安全的
* session -- 不同(厂商)浏览器间是线程安全的,同一浏览器的不同tab是不安全的(但一般没人那么无聊吧,所以这就够了)
*/
static scope = 'session'
分享到:
相关推荐
Services 是可重用的业务逻辑组件,它们是无状态的,可以跨多个请求和线程安全地执行。Services 可以被 Controllers 调用,实现复杂的业务流程。 **Plugins** Grails 插件系统是其强大功能之一,允许开发者复用和...
Grails兼容广泛的Java应用服务器,包括但不限于Apache Tomcat、Jetty、Resin等,这使得Grails应用能在不同的环境中无缝运行。 8. **创建工件** Grails提供了多种命令用于生成模型类、控制器、服务等工件,如`...
在这个例子中,你可能学会了如何在Grails中使用`groovy.sql.Sql`类或者HQL(Hibernate Query Language)进行定制化查询。 3. **分页功能**:在Web应用中,数据分页是很常见的需求。Grails提供了方便的分页API,可以...
Grails在IT行业中尤其受到重视,因为它能够帮助开发者快速搭建并部署基于MVC模式的应用程序。 在入门Grails之前,首先需要了解如何下载并安装这个框架。Grails官方提供了各个版本的下载链接,通常包括zip压缩包和可...
它们可以扩展Grails核心功能,如安全、缓存、搜索引擎优化等。通过引入插件,开发者可以快速地添加新特性到项目中。 8. **配置与环境** Grails支持多环境配置,如开发、测试和生产环境,这使得在不同阶段使用不同...
Grails1.1中文文档
FCKEditor是一款著名的在线文本编辑器,grails-fckeditor-0.9.5插件则是将其集成到Grails应用中的解决方案。以下是关键点: 1. 安装与配置:在Grails项目中添加插件依赖,然后通过配置文件调整编辑器的参数,如默认...
在Grails框架中,文件的上传与下载是常见的功能需求,尤其在开发涉及大量文档、图片或媒体文件处理的应用程序时。以下是对Grails中上传和下载操作的深入解析,包括其实现机制、代码示例及注意事项。 ### 文件上传 ...
Grails1.1最新 中文 文档 当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,而且没有很好的遵循 Don't Repeat Yourself (DRY) 法则。 因此我们要以一种新的思维...
**Grails 框架详解** Grails 是一个基于 Groovy 语言的开源Web应用程序框架,它构建在Java平台之上,充分利用了Java EE的许多功能,同时提供了更简洁、高效的语法,使得开发过程更为快捷。Grails 的设计目标是简化...
- Grails版本信息可以在项目的`BuildConfig.groovy`文件中找到。 **文档引擎** - 提供了文档生成工具,帮助开发者快速生成API文档。 **依赖解析** - Grails使用Ivy作为其依赖管理系统。 - 支持配置依赖关系,包括...
1. **模型(Model)**: 在Grails中,模型通常由Domain Classes表示,它们是持久化的实体,与数据库表对应。Domain Classes使用Groovy的元编程特性,如属性验证和动态方法,提供数据验证和业务逻辑。 2. **视图...
Grails 最新的 v1.1版的中文文档,chm格式,Grails是一套快速开发Web应用的开源框架,基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,能为大家带来超高效率的一站式框架。
6. **插件系统**:Grails 插件丰富了框架的功能,如缓存、安全、测试等。了解如何查找、安装和使用插件,可以快速扩展你的应用。 7. **构建和部署**:学习 `grails war` 命令打包应用,以及如何将应用部署到各种...
在Eclipse中搭建Grails项目可能相对复杂,但通过以下步骤,即使是初学者也能顺利进行。 1. **Grails环境安装** - 首先,你需要从Grails官网(http://grails.org/)下载最新版的Grails安装包。 - 安装完成后,确保...
5. **Grails插件系统**:Grails拥有庞大的插件库,涵盖各种功能,如安全、缓存、报表、测试等。通过插件,开发者可以轻松地扩展框架功能,避免重复造轮子。 6. **Grails构建工具**:Grails的构建系统自动化处理许多...
7. **Grails服务(Service)**:服务层在Grails中的作用,如何定义服务并进行事务管理。 8. **Grails过滤器(Filters)**:过滤器在应用程序中的应用,如何在特定的HTTP请求或响应之前/之后执行代码。 9. **Grails...
在学习过程中,还可以参考在线教程、视频课程和社区论坛,如Stack Overflow和Grails官方社区,以便获取更多实践经验和帮助。 总之,Grails作为Java平台上的快速Web开发框架,以其高效、灵活和丰富的生态系统,为...