mirror of https://github.com/usbharu/Hideout.git
feat: ProducerのBeanを作成できるように
This commit is contained in:
parent
3a541fa4b0
commit
5ef130c94f
|
@ -192,6 +192,7 @@ dependencies {
|
|||
implementation(libs.bundles.apache.tika)
|
||||
implementation(libs.bundles.openapi)
|
||||
implementation(libs.bundles.kjob)
|
||||
implementation(libs.bundles.owl.producer)
|
||||
implementation(libs.bundles.spring.boot.oauth2)
|
||||
implementation(libs.bundles.spring.boot.data.mongodb)
|
||||
implementation(libs.bundles.spring.boot.data.mongodb)
|
||||
|
@ -230,7 +231,7 @@ dependencies {
|
|||
|
||||
implementation("dev.usbharu:http-signature:1.0.0")
|
||||
implementation("dev.usbharu:emoji-kt:2.0.0")
|
||||
implementation("dev.usbharu:owl-producer-default:0.0.1")
|
||||
|
||||
|
||||
|
||||
testImplementation("org.springframework.boot:spring-boot-starter-test")
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* Copyright (C) 2024 usbharu
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.usbharu.hideout.application.config
|
||||
|
||||
import dev.usbharu.owl.common.retry.RetryPolicyFactory
|
||||
import dev.usbharu.owl.producer.api.OWL
|
||||
import dev.usbharu.owl.producer.api.OwlProducer
|
||||
import dev.usbharu.owl.producer.defaultimpl.DEFAULT
|
||||
import dev.usbharu.owl.producer.embedded.EMBEDDED
|
||||
import dev.usbharu.owl.producer.embedded.EMBEDDED_GRPC
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties
|
||||
import org.springframework.context.annotation.Bean
|
||||
import org.springframework.context.annotation.Configuration
|
||||
|
||||
@Configuration
|
||||
class OwlConfig(private val producerConfig: ProducerConfig) {
|
||||
@Bean
|
||||
fun producer(retryPolicyFactory: RetryPolicyFactory? = null): OwlProducer {
|
||||
return when (producerConfig.mode) {
|
||||
ProducerMode.EMBEDDED -> {
|
||||
OWL(EMBEDDED) {
|
||||
if (retryPolicyFactory != null) {
|
||||
this.retryPolicyFactory = retryPolicyFactory
|
||||
}
|
||||
if (producerConfig.port != null) {
|
||||
this.port = producerConfig.port.toString()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ProducerMode.GRPC -> {
|
||||
OWL(EMBEDDED_GRPC) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ProducerMode.EMBEDDED_GRPC -> {
|
||||
OWL(DEFAULT) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ConfigurationProperties("hideout.owl.producer")
|
||||
data class ProducerConfig(val mode: ProducerMode = ProducerMode.EMBEDDED, val port: Int? = null)
|
||||
|
||||
enum class ProducerMode {
|
||||
GRPC,
|
||||
EMBEDDED,
|
||||
EMBEDDED_GRPC
|
||||
}
|
|
@ -1,6 +1,9 @@
|
|||
hideout:
|
||||
url: "https://test-hideout.usbharu.dev"
|
||||
use-mongodb: true
|
||||
owl:
|
||||
producer:
|
||||
standalone: embedded
|
||||
security:
|
||||
jwt:
|
||||
generate: true
|
||||
|
|
|
@ -11,6 +11,7 @@ repositories {
|
|||
|
||||
dependencies {
|
||||
testImplementation(kotlin("test"))
|
||||
implementation("dev.usbharu:owl-consumer:0.0.1")
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
package dev.usbharu
|
||||
|
||||
fun main() {
|
||||
println("Hello World!")
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Copyright (C) 2024 usbharu
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.usbharu.hideout.worker
|
||||
|
||||
import dev.usbharu.owl.consumer.TaskRequest
|
||||
import dev.usbharu.owl.consumer.TaskResult
|
||||
import dev.usbharu.owl.consumer.TaskRunner
|
||||
|
||||
class DeliverAcceptTaskRunner : TaskRunner {
|
||||
override val name: String
|
||||
get() = ""
|
||||
|
||||
override suspend fun run(taskRequest: TaskRequest): TaskResult {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
}
|
|
@ -10,6 +10,7 @@ swagger = "2.2.6"
|
|||
serialization = "1.6.3"
|
||||
kjob = "0.6.0"
|
||||
tika = "2.9.1"
|
||||
owl = "0.0.1"
|
||||
|
||||
[libraries]
|
||||
|
||||
|
@ -55,6 +56,10 @@ apache-tika-parsers = { module = "org.apache.tika:tika-parsers", version.ref = "
|
|||
kjon-core = { module = "org.drewcarlson:kjob-core", version.ref = "kjob" }
|
||||
kjon-mongo = { module = "org.drewcarlson:kjob-mongo", version.ref = "kjob" }
|
||||
|
||||
owl-producer-api = { module = "dev.usbharu:owl-producer-api", version.ref = "owl" }
|
||||
owl-producer-default = { module = "dev.usbharu:owl-producer-default", version.ref = "owl" }
|
||||
owl-producer-embedded = { module = "dev.usbharu:owl-producer-embedded", version.ref = "owl" }
|
||||
|
||||
[bundles]
|
||||
|
||||
exposed = ["exposed-core", "exposed-java-time", "exposed-jdbc", "exposed-spring"]
|
||||
|
@ -66,6 +71,7 @@ openapi = ["jakarta-annotation", "jakarta-validation", "swagger-annotations", "s
|
|||
serialization = ["serialization-core", "serialization-json"]
|
||||
apache-tika = ["apache-tika-core", "apache-tika-parsers"]
|
||||
kjob = ["kjon-core", "kjon-mongo"]
|
||||
owl-producer = ["owl-producer-api", "owl-producer-default", "owl-producer-embedded"]
|
||||
|
||||
[plugins]
|
||||
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package dev.usbharu.owl.broker
|
||||
|
||||
import dev.usbharu.owl.broker.service.DefaultRetryPolicyFactory
|
||||
import dev.usbharu.owl.broker.service.RetryPolicyFactory
|
||||
import dev.usbharu.owl.common.retry.DefaultRetryPolicyFactory
|
||||
import dev.usbharu.owl.common.retry.ExponentialRetryPolicy
|
||||
import dev.usbharu.owl.common.retry.RetryPolicyFactory
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.koin.core.context.startKoin
|
||||
import org.koin.dsl.module
|
||||
|
|
|
@ -21,3 +21,9 @@ import org.koin.core.module.Module
|
|||
interface ModuleContext {
|
||||
fun module():Module
|
||||
}
|
||||
|
||||
data object EmptyModuleContext : ModuleContext {
|
||||
override fun module(): Module {
|
||||
return org.koin.dsl.module { }
|
||||
}
|
||||
}
|
|
@ -24,6 +24,7 @@ import dev.usbharu.owl.broker.domain.model.task.TaskRepository
|
|||
import dev.usbharu.owl.broker.domain.model.taskdefinition.TaskDefinitionRepository
|
||||
import dev.usbharu.owl.broker.domain.model.taskresult.TaskResult
|
||||
import dev.usbharu.owl.broker.domain.model.taskresult.TaskResultRepository
|
||||
import dev.usbharu.owl.common.retry.RetryPolicyFactory
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.flow.*
|
||||
import org.koin.core.annotation.Singleton
|
||||
|
|
|
@ -21,6 +21,7 @@ import dev.usbharu.owl.broker.domain.model.task.Task
|
|||
import dev.usbharu.owl.broker.domain.model.task.TaskRepository
|
||||
import dev.usbharu.owl.broker.domain.model.taskdefinition.TaskDefinitionRepository
|
||||
import dev.usbharu.owl.common.property.PropertyValue
|
||||
import dev.usbharu.owl.common.retry.RetryPolicyFactory
|
||||
import org.koin.core.annotation.Singleton
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.time.Instant
|
||||
|
|
|
@ -14,10 +14,9 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.usbharu.owl.broker.service
|
||||
package dev.usbharu.owl.common.retry
|
||||
|
||||
|
||||
import dev.usbharu.owl.broker.domain.exception.service.RetryPolicyNotFoundException
|
||||
import dev.usbharu.owl.common.retry.RetryPolicy
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
interface RetryPolicyFactory {
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.usbharu.owl.broker.domain.exception.service
|
||||
package dev.usbharu.owl.common.retry
|
||||
|
||||
class RetryPolicyNotFoundException : RuntimeException {
|
||||
constructor() : super()
|
|
@ -27,7 +27,8 @@ package dev.usbharu.owl.producer.api
|
|||
*/
|
||||
fun <P : OwlProducer, T : OwlProducerBuilder<P, C>, C : OwlProducerConfig> OWL(
|
||||
owlProducerBuilder: T,
|
||||
configBlock: C.() -> Unit
|
||||
) {
|
||||
configBlock: C.() -> Unit = {},
|
||||
): P {
|
||||
owlProducerBuilder.apply(owlProducerBuilder.config().apply { configBlock() })
|
||||
return owlProducerBuilder.build()
|
||||
}
|
|
@ -15,6 +15,7 @@ dependencies {
|
|||
implementation(project(":owl-broker"))
|
||||
implementation(platform("io.insert-koin:koin-bom:3.5.3"))
|
||||
implementation("io.insert-koin:koin-core")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
|
|
|
@ -16,9 +16,8 @@
|
|||
|
||||
package dev.usbharu.owl.producer.embedded
|
||||
|
||||
import dev.usbharu.owl.broker.ModuleContext
|
||||
import dev.usbharu.owl.broker.OwlBrokerApplication
|
||||
import dev.usbharu.owl.broker.service.RetryPolicyFactory
|
||||
import dev.usbharu.owl.common.retry.RetryPolicyFactory
|
||||
import dev.usbharu.owl.common.task.PublishedTask
|
||||
import dev.usbharu.owl.common.task.Task
|
||||
import dev.usbharu.owl.common.task.TaskDefinition
|
||||
|
@ -29,10 +28,7 @@ import org.koin.dsl.module
|
|||
import org.koin.ksp.generated.defaultModule
|
||||
|
||||
class EmbeddedGrpcOwlProducer(
|
||||
private val moduleContext: ModuleContext,
|
||||
private val retryPolicyFactory: RetryPolicyFactory,
|
||||
private val port: Int,
|
||||
private val owlProducer: OwlProducer,
|
||||
private val config: EmbeddedGrpcOwlProducerConfig,
|
||||
) : OwlProducer {
|
||||
|
||||
private lateinit var application: Koin
|
||||
|
@ -43,20 +39,20 @@ class EmbeddedGrpcOwlProducer(
|
|||
|
||||
val module = module {
|
||||
single<RetryPolicyFactory> {
|
||||
retryPolicyFactory
|
||||
config.retryPolicyFactory
|
||||
}
|
||||
}
|
||||
modules(module, defaultModule, moduleContext.module())
|
||||
modules(module, defaultModule, config.moduleContext.module())
|
||||
}.koin
|
||||
|
||||
application.get<OwlBrokerApplication>().start(port)
|
||||
application.get<OwlBrokerApplication>().start(config.port.toInt())
|
||||
}
|
||||
|
||||
override suspend fun <T : Task> registerTask(taskDefinition: TaskDefinition<T>) {
|
||||
owlProducer.registerTask(taskDefinition)
|
||||
config.owlProducer.registerTask(taskDefinition)
|
||||
}
|
||||
|
||||
override suspend fun <T : Task> publishTask(task: T): PublishedTask<T> {
|
||||
return owlProducer.publishTask(task)
|
||||
return config.owlProducer.publishTask(task)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright (C) 2024 usbharu
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.usbharu.owl.producer.embedded
|
||||
|
||||
import dev.usbharu.owl.producer.api.OwlProducerBuilder
|
||||
|
||||
class EmbeddedGrpcOwlProducerBuilder : OwlProducerBuilder<EmbeddedGrpcOwlProducer, EmbeddedGrpcOwlProducerConfig> {
|
||||
private var config = config()
|
||||
|
||||
override fun config(): EmbeddedGrpcOwlProducerConfig {
|
||||
return EmbeddedGrpcOwlProducerConfig()
|
||||
}
|
||||
|
||||
override fun build(): EmbeddedGrpcOwlProducer {
|
||||
return EmbeddedGrpcOwlProducer(
|
||||
config
|
||||
)
|
||||
}
|
||||
|
||||
override fun apply(owlProducerConfig: EmbeddedGrpcOwlProducerConfig) {
|
||||
this.config = owlProducerConfig
|
||||
}
|
||||
}
|
||||
|
||||
val EMBEDDED_GRPC by lazy { EmbeddedGrpcOwlProducerBuilder() }
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Copyright (C) 2024 usbharu
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.usbharu.owl.producer.embedded
|
||||
|
||||
import dev.usbharu.owl.broker.ModuleContext
|
||||
import dev.usbharu.owl.common.retry.RetryPolicyFactory
|
||||
import dev.usbharu.owl.producer.api.OwlProducer
|
||||
import dev.usbharu.owl.producer.api.OwlProducerConfig
|
||||
|
||||
class EmbeddedGrpcOwlProducerConfig : OwlProducerConfig {
|
||||
lateinit var moduleContext: ModuleContext
|
||||
lateinit var retryPolicyFactory: RetryPolicyFactory
|
||||
lateinit var port: String
|
||||
lateinit var owlProducer: OwlProducer
|
||||
}
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package dev.usbharu.owl.producer.embedded
|
||||
|
||||
import dev.usbharu.owl.broker.ModuleContext
|
||||
import dev.usbharu.owl.broker.OwlBrokerApplication
|
||||
import dev.usbharu.owl.broker.service.*
|
||||
import dev.usbharu.owl.common.retry.RetryPolicyFactory
|
||||
import dev.usbharu.owl.common.task.PublishedTask
|
||||
import dev.usbharu.owl.common.task.Task
|
||||
import dev.usbharu.owl.common.task.TaskDefinition
|
||||
|
@ -32,10 +32,7 @@ import java.util.*
|
|||
import dev.usbharu.owl.broker.domain.model.taskdefinition.TaskDefinition as BrokerTaskDefinition
|
||||
|
||||
class EmbeddedOwlProducer(
|
||||
private val moduleContext: ModuleContext,
|
||||
private val retryPolicyFactory: RetryPolicyFactory,
|
||||
private val name: String,
|
||||
private val port: Int,
|
||||
private val embeddedOwlProducerConfig: EmbeddedOwlProducerConfig,
|
||||
) : OwlProducer {
|
||||
|
||||
private lateinit var producerId: UUID
|
||||
|
@ -50,17 +47,22 @@ class EmbeddedOwlProducer(
|
|||
|
||||
val module = module {
|
||||
single<RetryPolicyFactory> {
|
||||
retryPolicyFactory
|
||||
embeddedOwlProducerConfig.retryPolicyFactory
|
||||
}
|
||||
}
|
||||
modules(module, defaultModule, moduleContext.module())
|
||||
modules(module, defaultModule, embeddedOwlProducerConfig.moduleContext.module())
|
||||
}.koin
|
||||
|
||||
val producerService = application.get<ProducerService>()
|
||||
|
||||
producerId = producerService.registerProducer(RegisterProducerRequest(name, name))
|
||||
producerId = producerService.registerProducer(
|
||||
RegisterProducerRequest(
|
||||
embeddedOwlProducerConfig.name,
|
||||
embeddedOwlProducerConfig.name
|
||||
)
|
||||
)
|
||||
|
||||
application.get<OwlBrokerApplication>().start(port)
|
||||
application.get<OwlBrokerApplication>().start(embeddedOwlProducerConfig.port.toInt())
|
||||
}
|
||||
|
||||
override suspend fun <T : Task> registerTask(taskDefinition: TaskDefinition<T>) {
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright (C) 2024 usbharu
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.usbharu.owl.producer.embedded
|
||||
|
||||
import dev.usbharu.owl.broker.EmptyModuleContext
|
||||
import dev.usbharu.owl.common.retry.DefaultRetryPolicyFactory
|
||||
import dev.usbharu.owl.producer.api.OwlProducerBuilder
|
||||
|
||||
class EmbeddedOwlProducerBuilder : OwlProducerBuilder<EmbeddedOwlProducer, EmbeddedOwlProducerConfig> {
|
||||
var config: EmbeddedOwlProducerConfig = config()
|
||||
|
||||
override fun config(): EmbeddedOwlProducerConfig {
|
||||
val embeddedOwlProducerConfig = EmbeddedOwlProducerConfig()
|
||||
|
||||
with(embeddedOwlProducerConfig) {
|
||||
moduleContext = EmptyModuleContext
|
||||
retryPolicyFactory = DefaultRetryPolicyFactory(emptyMap())
|
||||
name = "embedded-owl-producer"
|
||||
port = "50051"
|
||||
}
|
||||
|
||||
return embeddedOwlProducerConfig
|
||||
}
|
||||
|
||||
override fun build(): EmbeddedOwlProducer {
|
||||
return EmbeddedOwlProducer(
|
||||
config
|
||||
)
|
||||
}
|
||||
|
||||
override fun apply(owlProducerConfig: EmbeddedOwlProducerConfig) {
|
||||
this.config = owlProducerConfig
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
val EMBEDDED by lazy { EmbeddedOwlProducerBuilder() }
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright (C) 2024 usbharu
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.usbharu.owl.producer.embedded
|
||||
|
||||
import dev.usbharu.owl.broker.ModuleContext
|
||||
import dev.usbharu.owl.common.retry.RetryPolicyFactory
|
||||
import dev.usbharu.owl.producer.api.OwlProducerConfig
|
||||
|
||||
class EmbeddedOwlProducerConfig : OwlProducerConfig {
|
||||
lateinit var moduleContext: ModuleContext
|
||||
lateinit var retryPolicyFactory: RetryPolicyFactory
|
||||
lateinit var name: String
|
||||
lateinit var port: String
|
||||
}
|
Loading…
Reference in New Issue