scala - turorial RetryTemplate

本文介绍了一种使用Scala语言实现的简单RetryTemplate类,该类允许用户定义重试次数及延迟时间,并通过传递操作作为参数来执行重试逻辑。文章还提供了一个简单的测试示例。
在公司里面用java实现了一个RetryTemplate的模板,可能spring里面已经实现了,但是用scala实现了一个很简单的,就当作学习吧。
下面是RetryTemplate.scala


class RetryTemplate(c: Int, d: Long) {

require(c > 0 && d > 0)
val count = c
val delay = d

def this() {
this(10, 500)
}

def retryOperation(action: () => Unit): Unit = {
def wrapAction(): Boolean = {
action()
true
}
this.retryOperation(classOf[Boolean], wrapAction)
}

def retryOperation[T <: Any](returnType: Class[T], action: () => T): T = {
//scala里面的变量初始化真是坑跌。
var exception: Throwable = null.asInstanceOf[Throwable]
var result: T = null.asInstanceOf[T]
//scala里面没有break判断,直接return又会报ReturnNotControl的exception.
(1 to count).toStream.takeWhile(i => !exception.isInstanceOf[FinishStatus]).foreach {
_ =>
try {
result = action()
exception = new FinishStatus
} catch {
case ex: Throwable => {
exception = ex
delayTime
}
}
}

if (exception.isInstanceOf[FinishStatus]) {
result
} else {
Console.println("retry attempt max times, finish retry.")
throw exception
}
}

def delayTime(): Unit = {
Thread.sleep(delay);
}
}

private class FinishStatus extends Throwable with NoStackTrace



下面是测试代码

class HelloworldModule extends RetryTemplate {

def sayHello() = {
Console.println("sayHello")
//throw new IllegalStateException
}

}

object TestReretyTemplate {

def main(args: Array[String]) {
val helloworldModule = new HelloworldModule
helloworldModule.retryOperation(helloworldModule.sayHello)
}

}

希望对scala有更深理解的童鞋能够更好的实现。
<think>好的,我现在需要解决用户的问题:“Scala compilerJARs notfound”,具体涉及scala-compiler-2.11.12.jar和scala-reflect-2.11.12.jar在Maven仓库中的解决方案。用户之前提到过更改Maven路径、重新导入SDK以及Spark版本与Scala版本的兼容性问题,所以应该结合这些信息来回答。 首先,我应该回忆一下常见的导致这个错误的原因。根据引用[2],用户提到可能是因为Maven路径配置错误,或者项目缺少Scala SDK。此外,引用[3]指出Spark3.0+需要Scala2.12,而Spark2.x可能默认使用2.12,但用户如果还在用Scala2.11可能需要特别处理。所以用户的问题可能和版本不匹配有关,或者依赖未正确下载。接下来,我需要分步骤思考解决方案:1.**检查Scala版本兼容性**:用户提到的JAR是2.11.12版本的,如果他们使用的是Spark3.0或更高版本,这会导致不兼容,因为Spark3.0需要Scala2.12。这时候需要确认用户的项目使用的Spark版本,如果是3.0+,可能需要升级Scala到2.12,或者降级Spark到2.x版本。2.**确认Maven仓库路径**:用户之前修改过Maven路径,所以需要检查Maven的settings.xml中的本地仓库路径是否正确,确保JAR包被下载到正确的位置。如果路径错误,Maven可能无法找到这些依赖。3.**手动安装依赖**:如果Maven无法自动下载,可能需要手动从Maven仓库下载这两个JAR包,然后放入本地仓库的对应路径下。例如,scala-compiler-2.11.12.jar应该放在D:\maven_repository_3.63\org\scala-lang\scala-compiler\2.11.12目录下。4.**项目配置检查**:在IDE中检查项目的Scala SDK是否配置正确。可能需要重新导入或添加ScalaSDK,特别是确保项目模块使用了正确的Scala版本。引用[2]提到用户重新导入SDK后问题解决,所以这步很重要。5.**清理和重新构建项目**:有时候Maven缓存可能导致问题,执行mvn cleaninstall或通过IDE的重新构建功能来触发依赖的重新下载。 6. **检查POM文件依赖**:确保pom.xml中正确声明了Scala编译器相关的依赖,比如scala-compiler和scala-reflect的版本是否正确,并且scope可能设置为provided或者compile。引用[4]提到pom需要配置scala-library和scala-maven-plugin,所以需要确认这些配置是否存在且正确。7.**检查网络或仓库镜像**:如果公司网络有限制,或者Maven镜像配置不正确,可能导致无法下载依赖。可以尝试更换Maven镜像源,比如使用阿里云的镜像。8.**IDE设置**:在IntelliJ中,可能需要手动设置Scala插件和SDK。引用[4]提到安装Scala插件并配置SDK,所以需要确保IDE已正确安装插件,并且项目模块关联了正确的SDK。 现在,结合这些步骤,我需要整理出一个结构清晰的回答,分点说明解决方案,并确保引用相关的引用内容。例如,当提到版本兼容性时,引用[3]的内容;当提到SDK配置时,引用[2]和[4]。同时,用户可能需要相关的问题,比如如何检查Spark版本与Scala的兼容性,或者如何手动安装Maven依赖,所以生成的问题需要围绕这些方面。最后,确保回答中使用正确的中文,LaTeX格式符合要求,没有使用任何markdown,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要太多公式,但如果有变量或路径,可能需要用行内格式,比如路径中的版本号。</think>### 解决“Scala compiler JARs not found”问题的方法 #### 1. **确认Spark与Scala版本兼容性** - Spark 3.0及以上版本仅支持Scala 2.12[^3]。若项目中使用的是Spark 3.0+,需将Scala版本升级至2.12,或降级Spark至2.x版本(例如2.4.5)。 - 检查`pom.xml`中的Scala版本配置: ```xml <properties> <scala.version>2.11.12</scala.version> </properties> ``` 若需兼容Spark 2.x,可保留Scala 2.11;否则需调整为2.12。 #### 2. **修复Maven仓库路径** - 确认Maven本地仓库路径是否正确(引用[2]中用户修改过路径)。检查`settings.xml`中的配置: ```xml <localRepository>D:\maven_repository_3.63</localRepository> ``` - 手动下载缺失的JAR文件: - 访问[Maven仓库](https://mvnrepository.com/),搜索`scala-compiler-2.11.12.jar`和`scala-reflect-2.11.12.jar`。 - 将文件放入对应目录: ``` D:\maven_repository_3.63\org\scala-lang\scala-compiler\2.11.12\ D:\maven_repository_3.63\org\scala-lang\scala-reflect\2.11.12\ ``` #### 3. **重新配置项目依赖** - 在`pom.xml`中添加显式依赖(引用[4]): ```xml <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-reflect</artifactId> <version>${scala.version}</version> </dependency> ``` - 添加Scala Maven插件: ```xml <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>4.7.1</version> </plugin> ``` #### 4. **IDE设置修复** - **重新导入Scala SDK**(引用[2]): - 在IntelliJ中,右键项目 -> `Add Framework Support` -> 选择Scala SDK。 - 若SDK未安装,需手动下载[Scala 2.11.12](https://www.scala-lang.org/download/)并配置路径。 - **清理缓存**: - 执行`mvn clean install`或通过IDE的`Rebuild Project`功能。 #### 5. **检查网络与镜像源** - 若依赖下载失败,尝试更换Maven镜像源(如阿里云): ```xml <mirror> <id>aliyunmaven</id> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>*</mirrorOf> </mirror> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值