本文整理匯總了Golang中github.com/cloudfoundry/storeadapter.StoreAdapter.GetAndMaintainLock方法的典型用法代碼示例。如果您正苦於以下問題:Golang StoreAdapter.GetAndMaintainLock方法的具體用法?Golang StoreAdapter.GetAndMaintainLock怎麽用?Golang StoreAdapter.GetAndMaintainLock使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類github.com/cloudfoundry/storeadapter.StoreAdapter
的用法示例。
在下文中一共展示了StoreAdapter.GetAndMaintainLock方法的1個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: Daemonize
func Daemonize(
component string,
callback func() error,
period time.Duration,
timeout time.Duration,
logger logger.Logger,
adapter storeadapter.StoreAdapter,
) error {
logger.Info("Acquiring lock for " + component)
lostLockChannel, releaseLockChannel, err := adapter.GetAndMaintainLock(component, 10)
if err != nil {
logger.Info(fmt.Sprintf("Failed to acquire lock: %s", err))
return err
}
go func() {
<-lostLockChannel
logger.Error("Lost the lock", errors.New("Lock the lock"))
os.Exit(197)
}()
logger.Info("Acquired lock for " + component)
logger.Info(fmt.Sprintf("Running Daemon every %d seconds with a timeout of %d", int(period.Seconds()), int(timeout.Seconds())))
for {
afterChan := time.After(period)
timeoutChan := time.After(timeout)
errorChan := make(chan error, 1)
t := time.Now()
go func() {
errorChan <- callback()
}()
select {
case err := <-errorChan:
logger.Info("Daemonize Time", map[string]string{
"Component": component,
"Duration": fmt.Sprintf("%.4f", time.Since(t).Seconds()),
})
if err != nil {
logger.Error("Daemon returned an error. Continuining...", err)
}
case <-timeoutChan:
releaseLockChannel <- true
return errors.New("Daemon timed out. Aborting!")
}
<-afterChan
}
return nil
}