Actor故障恢复是akka中非常重要的内容,在之前的博客中虽然有介绍,但都是杂糅在其他知识点的细节中,本博客将单独介绍这一部分的故障恢复。为了简化分析的单独,本文只研究用户的actor故障恢复的步骤,系统actor也基本差不多;另外,为了简化篇幅,不重要的源码将不再整段贴出来,感兴趣的读者可以去下载源码单独分析。

  上面是官方描述actor树形结构时用到的一个图,非常重要,希望读者一定要记住这个树形的层次概念。也就是说,actor一定会归属到某个父actor下面,而actor的故障恢复就是通过这种层级来实现的。这个图之所以重要,是因为如果你能够深刻理解这个图,大概就知道如何实现故障恢复了。

  有些爱钻研的读者可能会问,还有一个 / 这个actor没有父actor啊,这个actor如果失败,怎么恢复?其实吧,这算是一个好问题。这是akka设计的根基啊,如果akka本身动不动都需要故障恢复,别人还怎么用。你可以这样理解,akka设计的比较好,或者说root actor功能比较少,轻易不会出现故障。虽然这样解释有点勉强,哈哈。

  还记得Actor的调度模型吗,actor只有在收到消息时,才会去调用receive方法,此时actor才会被某个线程执行,也就是“活着”的。如果某个actor没有消息,那么它仅仅是一堆数据躺在内存,也就是“死的”。actor只有在“活着”的时候才可能出现故障。所以我们要从actor处理消息入手,来看看如何实现故障恢复。

//Memory consistency is handled by the Mailbox (reading mailbox status then processing messages, then writing mailbox status
final def invoke(messageHandle: Envelope): Unit = {
val influenceReceiveTimeout = !messageHandle.message.isInstanceOf[NotInfluenceReceiveTimeout]
try {
currentMessage = messageHandle
if (influenceReceiveTimeout)
cancelReceiveTimeout()
messageHandle.message match {
case msg: AutoReceivedMessage ⇒ autoReceiveMessage(messageHandle)
case msg ⇒ receiveMessage(msg)
}
currentMessage = null // reset current message after successful invocation
} catch handleNonFatalOrInterruptedException { e ⇒
handleInvokeFailure(Nil, e)
} finally {
if (influenceReceiveTimeout)
checkReceiveTimeout // Reschedule receive timeout
}
}

  上面是ActorCell里面处理用户消息的相关函数,这包括在一个try-catch里面,我们假设receiveMessage处理消息出现了异常。

final protected def handleNonFatalOrInterruptedException(thunk: (Throwable) ⇒ Unit): Catcher[Unit] = {
case e: InterruptedException ⇒
thunk(e)
Thread.currentThread().interrupt()
case NonFatal(e) ⇒
thunk(e)
}
/**
* Returns true if the provided `Throwable` is to be considered non-fatal, or false if it is to be considered fatal
*/
def apply(t: Throwable): Boolean = t match {
// VirtualMachineError includes OutOfMemoryError and other fatal errors
case _: VirtualMachineError | _: ThreadDeath | _: InterruptedException | _: LinkageError | _: ControlThrowable => false
case _ => true
}

  出现异常则会执行catch代码块,其实就是执行了handleNonFatalOrInterruptedException函数,这个函数会检查是不是InterruptedException或NonFatal类型的异常,如果是,则会执行thunk也就是handleInvokeFailure。简单来说就是如果receive处理消息出现异常,则会执行handleInvokeFailure。

final def handleInvokeFailure(childrenNotToSuspend: immutable.Iterable[ActorRef], t: Throwable): Unit = {
// prevent any further messages to be processed until the actor has been restarted
if (!isFailed) try {
suspendNonRecursive()
// suspend children
val skip: Set[ActorRef] = currentMessage match {
case Envelope(Failed(_, _, _), child) ⇒ { setFailed(child); Set(child) }
case _ ⇒ { setFailed(self); Set.empty }
}
suspendChildren(exceptFor = skip ++ childrenNotToSuspend)
t match {
// tell supervisor
case _: InterruptedException ⇒
// ➡➡➡ NEVER SEND THE SAME SYSTEM MESSAGE OBJECT TO TWO ACTORS ⬅⬅⬅
parent.sendSystemMessage(Failed(self, new ActorInterruptedException(t), uid))
case _ ⇒
// ➡➡➡ NEVER SEND THE SAME SYSTEM MESSAGE OBJECT TO TWO ACTORS ⬅⬅⬅
parent.sendSystemMessage(Failed(self, t, uid))
}
} catch handleNonFatalOrInterruptedException { e ⇒
publish(Error(e, self.path.toString, clazz(actor),
"emergency stop: exception in failure handling for " + t.getClass + Logging.stackTraceFor(t)))
try children foreach stop
finally finishTerminate()
}
}

  handleInvokeFailure会执行一个try语句,该语句第一句话就是执行suspendNonRecursive,从名称来看,就是要非递归的方式挂起当前actor,就是挂起mailbox对消息的处理,其实就是设置mailbox的状态。

private def suspendNonRecursive(): Unit = dispatcher suspend this
/**
* After the call to this method, the dispatcher mustn't begin any new message processing for the specified reference
*/
protected[akka] def suspend(actor: ActorCell): Unit = {
val mbox = actor.mailbox
if ((mbox.actor eq actor) && (mbox.dispatcher eq this))
mbox.suspend()
}
/**
* Increment the suspend count by one. Caller does not need to worry about whether
* status was Scheduled or not.
*
* @return true if the previous suspend count was zero
*/
@tailrec
final def suspend(): Boolean = currentStatus match {
case Closed ⇒
setStatus(Closed); false
case s ⇒
if (updateStatus(s, s + suspendUnit)) s < suspendUnit
else suspend()
}

  挂起当前出现异常的actor的mailbox对消息的处理之后,又通过suspendChildren挂起了子actor对消息的处理(流程跟上面差不多,都是设置子actor的mailbox状态),最后给父actor发送了Failed消息就结束了。

  总结一下当前处理逻辑,如果某个actor对消息的处理出现异常,就挂起当前actor的邮箱,然后递归地挂起所有子actor的邮箱,发送Failed消息给父actor。怎么样简单吧,就是这么简单。现在要看父actor如何处理这个消息了。

final protected def handleFailure(f: Failed): Unit = {
currentMessage = Envelope(f, f.child, system)
getChildByRef(f.child) match {
/*
* only act upon the failure, if it comes from a currently known child;
* the UID protects against reception of a Failed from a child which was
* killed in preRestart and re-created in postRestart
*/
case Some(stats) if stats.uid == f.uid ⇒
if (!actor.supervisorStrategy.handleFailure(this, f.child, f.cause, stats, getAllChildStats)) throw f.cause
case Some(stats) ⇒
publish(Debug(self.path.toString, clazz(actor),
"dropping Failed(" + f.cause + ") from old child " + f.child + " (uid=" + stats.uid + " != " + f.uid + ")"))
case None ⇒
publish(Debug(self.path.toString, clazz(actor), "dropping Failed(" + f.cause + ") from unknown child " + f.child))
}
}

  父actor异步收到Failed消息后会调用handleFailure方法。这个方法有两个主要逻辑,设置当前的currentMessage值,调用当前actor也就是抛异常actor的父actor的supervisorStrategy对象的handleFailure方法,如果handleFailure不处理当前异常,则通过throw继续抛出异常,这又进入了父actor的handleInvokeFailure处理逻辑。

/**
* This is the main entry point: in case of a child’s failure, this method
* must try to handle the failure by resuming, restarting or stopping the
* child (and returning `true`), or it returns `false` to escalate the
* failure, which will lead to this actor re-throwing the exception which
* caused the failure. The exception will not be wrapped.
*
* This method calls [[akka.actor.SupervisorStrategy#logFailure]], which will
* log the failure unless it is escalated. You can customize the logging by
* setting [[akka.actor.SupervisorStrategy#loggingEnabled]] to `false` and
* do the logging inside the `decider` or override the `logFailure` method.
*
* @param children is a lazy collection (a view)
*/
def handleFailure(context: ActorContext, child: ActorRef, cause: Throwable, stats: ChildRestartStats, children: Iterable[ChildRestartStats]): Boolean = {
val directive = decider.applyOrElse(cause, escalateDefault)
directive match {
case Resume ⇒
logFailure(context, child, cause, directive)
resumeChild(child, cause)
true
case Restart ⇒
logFailure(context, child, cause, directive)
processFailure(context, true, child, cause, stats, children)
true
case Stop ⇒
logFailure(context, child, cause, directive)
processFailure(context, false, child, cause, stats, children)
true
case Escalate ⇒
logFailure(context, child, cause, directive)
false
}
}

  handleFailure会根据当前actor也就是父actor的监督策略,判断当前的指令,然后调用processFailure方法。请注意processFailure方法的第一个参数是当前父actor的context值,第三个参数是出现异常的子actor的ActorRef。

/**
* Applies the fault handling `Directive` (Resume, Restart, Stop) specified in the `Decider`
* to the child actor that failed, as opposed to [[akka.actor.AllForOneStrategy]] that applies
* it to all children.
*
* @param maxNrOfRetries the number of times a child actor is allowed to be restarted, negative value means no limit,
* if the limit is exceeded the child actor is stopped
* @param withinTimeRange duration of the time window for maxNrOfRetries, Duration.Inf means no window
* @param decider mapping from Throwable to [[akka.actor.SupervisorStrategy.Directive]], you can also use a
* [[scala.collection.immutable.Seq]] of Throwables which maps the given Throwables to restarts, otherwise escalates.
* @param loggingEnabled the strategy logs the failure if this is enabled (true), by default it is enabled
*/
case class OneForOneStrategy(
maxNrOfRetries: Int = -1,
withinTimeRange: Duration = Duration.Inf,
override val loggingEnabled: Boolean = true)(val decider: SupervisorStrategy.Decider)
extends SupervisorStrategy

  默认情况下,每个actor的监督策略是OneForOneStrategy。也就是遇到异常会执行Restart分支的代码。

def processFailure(context: ActorContext, restart: Boolean, child: ActorRef, cause: Throwable, stats: ChildRestartStats, children: Iterable[ChildRestartStats]): Unit = {
if (restart && stats.requestRestartPermission(retriesWindow))
restartChild(child, cause, suspendFirst = false)
else
context.stop(child) //TODO optimization to drop child here already?
}

  其实就是会执行restartChild方法,当然我们还可以设置重试次数以防止无限重启。(默认是没有次数限制的)

/**
* Restart the given child, possibly suspending it first.
*
* <b>IMPORTANT:</b>
*
* If the child is the currently failing one, it will already have been
* suspended, hence `suspendFirst` must be false. If the child is not the
* currently failing one, then it did not request this treatment and is
* therefore not prepared to be resumed without prior suspend.
*/
final def restartChild(child: ActorRef, cause: Throwable, suspendFirst: Boolean): Unit = {
val c = child.asInstanceOf[InternalActorRef]
if (suspendFirst) c.suspend()
c.restart(cause)
}

  restartChild比较简单,就是执行了子actor的restart函数。那么restart函数在哪里实现呢?还记得这个ActorRef的实际类型是什么吗?没错就是RepointableActorRef

def restart(cause: Throwable): Unit = underlying.restart(cause)

  上面是RepointableActorRef的restart定义,就是调用了ActorCell的restart方法。

final def restart(cause: Throwable): Unit = try dispatcher.systemDispatch(this, Recreate(cause)) catch handleException

  上面是ActorCell的restart方法的实现(在akka.actor.dungeon.Dispatch里面),就是又给自己发送了一个Recreate方法。读者可能会有疑问,之前不都把邮箱给suspend了么,怎么还收消息,但请注意这里发送的是系统消息。所以系统消息还是可以被路由的。

/**
* Do re-create the actor in response to a failure.
*/
protected def faultRecreate(cause: Throwable): Unit =
if (actor == null) {
system.eventStream.publish(Error(self.path.toString, clazz(actor),
"changing Recreate into Create after " + cause))
faultCreate()
} else if (isNormal) {
val failedActor = actor
if (system.settings.DebugLifecycle) publish(Debug(self.path.toString, clazz(failedActor), "restarting"))
if (failedActor ne null) {
val optionalMessage = if (currentMessage ne null) Some(currentMessage.message) else None
try {
// if the actor fails in preRestart, we can do nothing but log it: it’s best-effort
if (failedActor.context ne null) failedActor.aroundPreRestart(cause, optionalMessage)
} catch handleNonFatalOrInterruptedException { e ⇒
val ex = PreRestartException(self, e, cause, optionalMessage)
publish(Error(ex, self.path.toString, clazz(failedActor), e.getMessage))
} finally {
clearActorFields(failedActor, recreate = true)
}
}
assert(mailbox.isSuspended, "mailbox must be suspended during restart, status=" + mailbox.currentStatus)
if (!setChildrenTerminationReason(ChildrenContainer.Recreation(cause))) finishRecreate(cause, failedActor)
} else {
// need to keep that suspend counter balanced
faultResume(causedByFailure = null)
}

  上面是收到Recreate时调用的函数,简单来说就是调用aroundPreRestart函数,和clearActorFields、finishRecreate。从此也可以看出aroundPreRestart、preRestart是actor实例出现异常最后执行的函数,此时actor的状态还是出现异常时候的值。

final protected def clearActorFields(actorInstance: Actor, recreate: Boolean): Unit = {
setActorFields(actorInstance, context = null, self = if (recreate) self else system.deadLetters)
currentMessage = null
behaviorStack = emptyBehaviorStack
}

  clearActorFields设置了context/self/currentMessage/behaviorStack几个字段为默认值或者说空值。setChildrenTerminationReason这个函数不再分析,简单来说就是递归设置子actor的失败原因,然后返回false。这实现逻辑其实也挺扯的,不返回true,返回false,简直反人类。

  其实吧,setChildrenTerminationReason一般都会成功。所以会执行finishRecreate方法。

private def finishRecreate(cause: Throwable, failedActor: Actor): Unit = {
// need to keep a snapshot of the surviving children before the new actor instance creates new ones
val survivors = children try {
try resumeNonRecursive()
finally clearFailed() // must happen in any case, so that failure is propagated val freshActor = newActor()
actor = freshActor // this must happen before postRestart has a chance to fail
if (freshActor eq failedActor) setActorFields(freshActor, this, self) // If the creator returns the same instance, we need to restore our nulled out fields. freshActor.aroundPostRestart(cause)
if (system.settings.DebugLifecycle) publish(Debug(self.path.toString, clazz(freshActor), "restarted")) // only after parent is up and running again do restart the children which were not stopped
survivors foreach (child ⇒
try child.asInstanceOf[InternalActorRef].restart(cause)
catch handleNonFatalOrInterruptedException { e ⇒
publish(Error(e, self.path.toString, clazz(freshActor), "restarting " + child))
})
} catch handleNonFatalOrInterruptedException { e ⇒
clearActorFields(actor, recreate = false) // in order to prevent preRestart() from happening again
handleInvokeFailure(survivors, PostRestartException(self, e, cause))
}
}

  首先调用resumeNonRecursive,这个好像是恢复mailbox的状态的,此时就可以正常的接收消息了。重点来了:newActor。这里通过Props创建了actor的一个新的实例,一般情况下创建的actor实例与原来的都不同,不过读者是不是觉得,这里可以优化一下,弄个参数让开发者自己定义是不是重用以前的actor实例?嗯,没错,恭喜你,这就是SupervisorStrategy.Resume的作用,其实就是简单的忽略此次异常,actor实例不会有任何变化。

  重建之后调用了新actor实例的aroundPostRestart、postRestart,也就是说postRestart是新实例创建成功后执行的第一个方法。新的actor实例创建成功后,后面的survivors foreach代码块就是在递归的重启子actor了。这里不再具体分析。

  再总结一下,父actor收到子actor异常的消息后,根据当前的策略判断是恢复、重启、还是重用什么的,一般都是重启。如果是重启就是调用子actor的restart函数,就会给出现异常的子actor,发送Recreate系统消息,子actor收到该消息后,会执行一系列重启的操作,最后创建新的actor实例,重启成功。当然这个过程中,子actor的所有子actor也会被重启,也就是一个递归的处理过程。

  其实简单的说,如果某个子actor出现异常,挂起自己的邮箱和递归子actor的邮箱,发消息通知父actor,父actor根据当前策略判断能够重启,如果能够重启,则该子actor完成重启动作,并负责递归重启它的子actor。当然还有其他策略,不同的策略这个处理逻辑会有不同。

aaarticlea/jpeg;base64,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Dw8PDw8PDw//2wBDAQICAgQEBAcEBAcQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/3QAEADf/2gAMAwEAAhEDEQA/AP38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Q/fyiiigAooooAKrTnbt6/hVmq83mbf3dAHxTfftK/FPxP4v8WaB8B/hUfHWneC9Qn0jUNUu9dg0WF9UtVQzWtpHJBcyTeVvVJJJNib619O/a98EXfwiHxT1bR9Q0q4h19PC19o8vkm9sdbNylobaT955f7uR9+//AJ5/PsrxzQPhZoXxX8VeO/iX+yx8VNd+FviNdfvLXxBpn2e2v9PbVrZvInmn0e4J2SS7Pv8AmR7/AL9fOfxg8U6n8cvgFqGkfF/TdG8R658N/idpHhttUsId1hfI91bJPMnmeZ5LyxzbLmPzNmaAP2cn1WxtbVb69u4ooX+7I0mxDVn7ZAdmyRXV13L833q/Lvx74P8AAHjv48eIvh74D+EVp8T77wBoui6VPb+INRtbHwz4dguYfPtUsbQ29zJ5kkG3zHSPhESNHTpXy14a8P2fjr4EfB34ba7KJtEj+NWoaG9vYXM0tsmn7L/zLK3n/dzvayQu8fmHY/ltQB+yMnxk8Kr8V9H+E0MjXOo61o91rMNwjJ9m8i2nht9m/wD56SPL9z/Zr2SLpX5h6f8As8/BLwP+3L4F0Twr4J0zTbWy8FanqkEccKfur6HU7YRTDPz7498mH/2q/TmH503/AN+gCxRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRUUvSgCWivl1f2yv2U3kWP/hbnhnd/tapAn/s9e/+HvEGheK9Httf8N6h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kkgevozwz8R/2l/G/inwfoV38OX+HdjYSmfxTf6hd2V/DPshf/Q9LFtPJI/mSbX8ySOMoi/czX2cVU9RTdif3aAPyW8GfBT9oPw98LvBelWPgtU8T/BHxlf6zYwT39l9m8Safql1fvOlrOkn7iSOG7X/AF8cfzr/AN8epa34M+L37QPxMsviT4i8CXPgbRfBHhzxDYaTZaneWb3+o6n4igS3feLOeWOGCONP45PM3tX6NbRSbRu3UAfPf7MPg3xH8P8A9nz4d+BPF9idM1jQdDsbK8t2kSXZPFCkciF4zJGfnH8D4r6GoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/0/38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//ZAA==" alt="" />

  关于Actor的生命周期,上面的图画的比较清楚,读者可以自行理解。但需要注意,Instance 1和Instance 2是两个“不同”的Actor实例,这里的不同,是指Actor内部的用户状态(即开发者自定义的字段)全部丢失,都会被重建。但两个不同实例的UID相同,这就意味着用相同的ActorRef可以跟后面重新建立的Instance 2发消息。

Akka in action: actor model

Akka源码分析-故障恢复的更多相关文章

  1. Akka源码分析-Cluster-Singleton

    akka Cluster基本实现原理已经分析过,其实它就是在remote基础上添加了gossip协议,同步各个节点信息,使集群内各节点能够识别.在Cluster中可能会有一个特殊的节点,叫做单例节点. ...

  2. Akka源码分析-Akka Typed

    对不起,akka typed 我是不准备进行源码分析的,首先这个库的API还没有release,所以会may change,也就意味着其概念和设计包括API都会修改,基本就没有再深入分析源码的意义了. ...

  3. Akka源码分析-Akka-Streams-概念入门

    今天我们来讲解akka-streams,这应该算akka框架下实现的一个很高级的工具.之前在学习akka streams的时候,我是觉得云里雾里的,感觉非常复杂,而且又难学,不过随着对akka源码的深 ...

  4. Akka源码分析-Cluster-Metrics

    一个应用软件维护的后期一定是要做监控,akka也不例外,它提供了集群模式下的度量扩展插件. 其实如果读者读过前面的系列文章的话,应该是能够自己写一个这样的监控工具的.简单来说就是创建一个actor,它 ...

  5. Akka源码分析-Cluster-Distributed Publish Subscribe in Cluster

    在ClusterClient源码分析中,我们知道,他是依托于“Distributed Publish Subscribe in Cluster”来实现消息的转发的,那本文就来分析一下Pub/Sub是如 ...

  6. Akka源码分析-Persistence

    在学习akka过程中,我们了解了它的监督机制,会发现actor非常可靠,可以自动的恢复.但akka框架只会简单的创建新的actor,然后调用对应的生命周期函数,如果actor有状态需要回复,我们需要h ...

  7. Akka源码分析-local-DeathWatch

    生命周期监控,也就是死亡监控,是akka编程中常用的机制.比如我们有了某个actor的ActorRef之后,希望在该actor死亡之后收到响应的消息,此时我们就可以使用watch函数达到这一目的. c ...

  8. Akka源码分析-Cluster-ActorSystem

    前面几篇博客,我们依次介绍了local和remote的一些内容,其实再分析cluster就会简单很多,后面关于cluster的源码分析,能够省略的地方,就不再贴源码而是一句话带过了,如果有不理解的地方 ...

  9. Akka源码分析-CircuitBreaker(熔断器)

    熔断器,在很多技术栈中都会出现的一种技术.它是在分布式系统中提供一个稳定的阻止嵌套失败的机制. 该怎么理解呢?简单来说,在分布式环境中,如果某个计算节点出现问题,很容易出现失败的逆向传到或整个系统的雪 ...

随机推荐

  1. Sublime Text 3 快捷键(转载)

    本文转自:https://segmentfault.com/a/1190000002570753 (欢迎阅读原文,侵删) Sublime Text 3 快捷键精华版 Ctrl+Shift+P:打开命令 ...

  2. buf.readUInt32BE()函数详解

    buf.readUInt32BE(offset[, noAssert]) buf.readUInt32LE(offset[, noAssert]) offset {Number} 0 noAssert ...

  3. xfce 安装文泉驿字体

    下载文泉驿字体 #拷贝字体到目录/usr/share/fonts/wqy#创建字体缓存 mkfontscale # 在当前目录下生成fonts.scale文件 mkfontdir # 在当前目录下生成 ...

  4. 用Python实现阿里钉钉机器人读取数据库内容自动发群通知

    最近想把一些预警数据信息按照一定的要求自动发送到移动端APP,最终把目标放在了腾讯的微信和阿里的钉钉软件上,由于刚开始学习python,于是编程工具想用python来实现.微信使用群体最广,通过一天的 ...

  5. SQL Server数据库基础编程

    转载,查看原文 Ø Go批处理语句 用于同时执行多个语句 Ø 使用.切换数据库 use master go   Ø 创建.删除数据库 方法1. --判断是否存在该数据库,存在就删除 if (exist ...

  6. C. Day at the Beach

    codeforces 599c C. Day at the Beach One day Squidward, Spongebob and Patrick decided to go to the be ...

  7. js eslint语法规范错误提示代码

    最近在用eslint代码检测,因为之前不太注意代码规范,刚开始确实头疼,哈哈,不过用习惯了就会感觉还不错,其实也没有那样难调试 我看过之前有些人已经做过总结,自己记录下,方便自己以后查找 “Missi ...

  8. Maven学习总结(30)——Maven项目通用三级版本号说明

     项目版本号说明     当前版本号:1.0.0-SNAPSHOT     本项目采用通用的三级版本号,版本号格式是[主版本号].[副版本号].[修复版本号]-[稳定状态],如:1.0.0-SNAPS ...

  9. JavaSE 学习笔记之包装类(十七)

    基本数据类型对象包装类:是按照面向对象思想将基本数据类型封装成了对象. 好处: 1:可以通过对象中的属性和行为操作基本数据. 2:可以实现基本数据类型和字符串之间的转换. 关键字   对应的类名 by ...

  10. Java并发:线程安全的单例模式

    转载请注明出处:jiq•钦'stechnical Blog 1.饿汉式 public class Singleton { private final static Singleton INSTANCE ...