我有一個 Redis PubSub 物件:
object RedisPubSubService {
implicit val system = ActorSystem("RedisEtatyLib")
val config = ConfigFactory.load.getObject("redis").toConfig
val hostname = config.getString("master")
val port = config.getInt("port")
val client = RedisClient(hostname, port)
val address: InetSocketAddress = new InetSocketAddress(hostname, port)
val channels = Seq("DASHBOARDS")
val patterns = Seq("pattern.*")
var callback: Boolean => Unit = { m => }
val subscriber = system.actorOf(Props(classOf[SubscribeActor], address, channels, patterns, callback)
.withDispatcher("rediscala.rediscala-client-worker-dispatcher")
)
def publish(channel: String, msg: String) =
client.publish(channel, msg)
}
class SubscribeActor(address: InetSocketAddress,
channels: Seq[String] = Nil,
patterns: Seq[String] = Nil,
callback: Boolean => Unit)
extends RedisSubscriberActor(address, channels, patterns, Option(""), callback) {
def onMessage(message: Message): Unit = {
// stuff
}
}
問題是當我在 Jenkins 中運行測驗時,我不需要實體化這個物件。因此,我的測驗失敗了,因為試圖連接到我在 localhost 上使用的 redis 服務器(設定在 中application.conf)。我只是想在我的測驗中忽略這個物件,因為無論如何,我不使用它。
我如何在測驗檔案中實體化應用程式:
val app = new GuiceApplicationBuilder().disable[StartUpService].build()
StartUpService單例類在哪里。但是對于物件,我不能以這種方式禁用它。
[[37minfo[0m] pailcCoordinatedShutdownSupport - 使用 ServerStoppedReason 原因和 2147533000 毫秒超時啟動同步協調關閉 [[37minfo[0m] pcsAkkaHttpServer - 終止 /0.0.0.0:9001 的服務器系結 [[37minfo[0m] pcsAkkaHttpServer - 運行提供的關閉停止掛鉤連接命令失敗,原因 = Some(java.net.ConnectException: Connection timed out)
謝謝
解決方案
基于@Tim 回應,我發現module該類在應用程式中實體化了一些物件
class Module extends AbstractModule {
override def configure() = {
bind(classOf[StartUpService]).asEagerSingleton
bind(classOf[TraitRepository]).to(classOf[ClassRepository])
}
}
由于StartUpService類的原因,我在其中實體化了很多服務,所有這些都在我構建應用程式物件的所有測驗中被觸發。解決方案是創建一個TestModule(沒有 StartUp 類)并將其用于覆寫第一個。
object TestModule extends AbstractModule {
override def configure() = {
bind(classOf[TraitRepository]).to(classOf[ClassRepository])
}
}
現在我可以在不觸發所有服務的情況下創建 app 物件,如下所示:
val app = new GuiceApplicationBuilder()
.disable[Module]
.overrides(TestModule)
.build()
uj5u.com熱心網友回復:
Anobject僅在訪問 的成員時才被初始化object,因此您必須在測驗中至少使用一個值RedisPubSubService。
干凈的解決方案是將測驗中使用的所有值移動到一個單獨的類(RedisPubSubConfig?)中,并且只有真正的服務代碼在RedisPubSubService. 這樣服務只會在使用時創建。
測驗可以使用位于單獨object( RedisPubSubMock?) 中的 Mock 服務,該服務也使用RedisPubSubConfig. 這里的代碼object只會在測驗期間初始化。
或者,您可以制作相關val的 s lazy,以便它們僅在首次使用時才被初始化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/453083.html
上一篇:如何在Scala中創建回圈參考?
