consumer #2

Merged
usbharu merged 10 commits from consumer into master 2024-04-30 09:26:10 +00:00
13 changed files with 170 additions and 2 deletions
Showing only changes of commit 9b58d15c29 - Show all commits

View File

@ -1,10 +1,19 @@
package dev.usbharu.owl.common.property package dev.usbharu.owl.common.property
/**
* Boolean型のプロパティ
*
* @property value プロパティ
*/
class BooleanPropertyValue(override val value: Boolean) : PropertyValue<Boolean>() { class BooleanPropertyValue(override val value: Boolean) : PropertyValue<Boolean>() {
override val type: PropertyType override val type: PropertyType
get() = PropertyType.binary get() = PropertyType.binary
} }
/**
* [BooleanPropertyValue]のシリアライザー
*
*/
class BooleanPropertySerializer : PropertySerializer<Boolean> { class BooleanPropertySerializer : PropertySerializer<Boolean> {
override fun isSupported(propertyValue: PropertyValue<*>): Boolean { override fun isSupported(propertyValue: PropertyValue<*>): Boolean {
return propertyValue.value is Boolean return propertyValue.value is Boolean

View File

@ -1,10 +1,19 @@
package dev.usbharu.owl.common.property package dev.usbharu.owl.common.property
/**
* Double型のプロパティ
*
* @property value プロパティ
*/
class DoublePropertyValue(override val value: Double) : PropertyValue<Double>() { class DoublePropertyValue(override val value: Double) : PropertyValue<Double>() {
override val type: PropertyType override val type: PropertyType
get() = PropertyType.number get() = PropertyType.number
} }
/**
* [DoublePropertyValue]のシリアライザー
*
*/
class DoublePropertySerializer : PropertySerializer<Double> { class DoublePropertySerializer : PropertySerializer<Double> {
override fun isSupported(propertyValue: PropertyValue<*>): Boolean { override fun isSupported(propertyValue: PropertyValue<*>): Boolean {
return propertyValue.value is Double return propertyValue.value is Double

View File

@ -16,11 +16,20 @@
package dev.usbharu.owl.common.property package dev.usbharu.owl.common.property
/**
* Integer型のプロパティ
*
* @property value プロパティ
*/
class IntegerPropertyValue(override val value: Int) : PropertyValue<Int>() { class IntegerPropertyValue(override val value: Int) : PropertyValue<Int>() {
override val type: PropertyType override val type: PropertyType
get() = PropertyType.number get() = PropertyType.number
} }
/**
* [IntegerPropertyValue]のシリアライザー
*
*/
class IntegerPropertySerializer : PropertySerializer<Int> { class IntegerPropertySerializer : PropertySerializer<Int> {
override fun isSupported(propertyValue: PropertyValue<*>): Boolean { override fun isSupported(propertyValue: PropertyValue<*>): Boolean {
return propertyValue.value is Int return propertyValue.value is Int

View File

@ -16,13 +16,30 @@
package dev.usbharu.owl.common.property package dev.usbharu.owl.common.property
/**
* [PropertySerializer]のユーティリティークラス
*/
object PropertySerializeUtils { object PropertySerializeUtils {
/**
* Stringと[PropertyValue][Map]から[PropertyValue]をシリアライズしStringとStringの[Map]として返します
*
* @param serializerFactory シリアライズに使用する[PropertySerializerFactory]
* @param properties シリアライズする[Map]
* @return Stringとシリアライズ済みの[PropertyValue][Map]
*/
fun serialize( fun serialize(
serializerFactory: PropertySerializerFactory, serializerFactory: PropertySerializerFactory,
properties: Map<String, PropertyValue<*>> properties: Map<String, PropertyValue<*>>
): Map<String, String> = ): Map<String, String> =
properties.map { it.key to serializerFactory.factory(it.value).serialize(it.value) }.toMap() properties.map { it.key to serializerFactory.factory(it.value).serialize(it.value) }.toMap()
/**
* Stringとシリアライズ済みの[PropertyValue][Map]からシリアライズ済みの[PropertyValue]をデシリアライズしStringと[PropertyValue][Map]として返します
*
* @param serializerFactory デシリアライズに使用する[PropertySerializerFactory]
* @param properties デシリアライズする[Map]
* @return Stringと[PropertyValue][Map]
*/
fun deserialize( fun deserialize(
serializerFactory: PropertySerializerFactory, serializerFactory: PropertySerializerFactory,
properties: Map<String, String> properties: Map<String, String>

View File

@ -16,8 +16,26 @@
package dev.usbharu.owl.common.property package dev.usbharu.owl.common.property
/**
* プロパティの型
*
*/
enum class PropertyType { enum class PropertyType {
/**
* 数字
*
*/
number, number,
/**
* 文字列
*
*/
string, string,
/**
* バイナリ
*
*/
binary binary
} }

View File

@ -22,6 +22,13 @@ package dev.usbharu.owl.common.property
* @param T プロパティの型 * @param T プロパティの型
*/ */
sealed class PropertyValue<T> { sealed class PropertyValue<T> {
/**
* プロパティ
*/
abstract val value: T abstract val value: T
/**
* プロパティの型
*/
abstract val type: PropertyType abstract val type: PropertyType
} }

View File

@ -1,10 +1,19 @@
package dev.usbharu.owl.common.property package dev.usbharu.owl.common.property
/**
* String型のプロパティ
*
* @property value プロパティ
*/
class StringPropertyValue(override val value: String) : PropertyValue<String>() { class StringPropertyValue(override val value: String) : PropertyValue<String>() {
override val type: PropertyType override val type: PropertyType
get() = PropertyType.string get() = PropertyType.string
} }
/**
* [StringPropertyValue]のシリアライザー
*
*/
class StringPropertyValueSerializer : PropertySerializer<String> { class StringPropertyValueSerializer : PropertySerializer<String> {
override fun isSupported(propertyValue: PropertyValue<*>): Boolean { override fun isSupported(propertyValue: PropertyValue<*>): Boolean {
return propertyValue.value is String return propertyValue.value is String

View File

@ -4,8 +4,14 @@ import java.time.Instant
import kotlin.math.pow import kotlin.math.pow
import kotlin.math.roundToLong import kotlin.math.roundToLong
/**
* 指数関数的に待機時間が増えるリトライポリシー
* `firstRetrySeconds x attempt ^ 2 - firstRetrySeconds`
*
* @property firstRetrySeconds
*/
class ExponentialRetryPolicy(private val firstRetrySeconds: Int = 30) : RetryPolicy { class ExponentialRetryPolicy(private val firstRetrySeconds: Int = 30) : RetryPolicy {
override fun nextRetry(now: Instant, attempt: Int): Instant = override fun nextRetry(now: Instant, attempt: Int): Instant =
now.plusSeconds(firstRetrySeconds.times((2.0).pow(attempt).roundToLong()) - 30) now.plusSeconds(firstRetrySeconds.times((2.0).pow(attempt).roundToLong()) - firstRetrySeconds)
} }

View File

@ -18,6 +18,19 @@ package dev.usbharu.owl.common.retry
import java.time.Instant import java.time.Instant
/**
* リトライポリシー
*
*/
interface RetryPolicy { interface RetryPolicy {
/**
* 次のリトライ時刻を返します
*
* [attempt]を負の値にしてはいけません
*
* @param now 現在の時刻
* @param attempt 試行回数
* @return 次のリトライ時刻
*/
fun nextRetry(now: Instant, attempt: Int): Instant fun nextRetry(now: Instant, attempt: Int): Instant
} }

View File

@ -18,7 +18,19 @@ package dev.usbharu.owl.common.task
import dev.usbharu.owl.common.property.PropertyType import dev.usbharu.owl.common.property.PropertyType
/**
* プロパティ定義
*
* @property map プロパティ名とプロパティタイプの[Map]
*/
class PropertyDefinition(val map: Map<String, PropertyType>) : Map<String, PropertyType> by map { class PropertyDefinition(val map: Map<String, PropertyType>) : Map<String, PropertyType> by map {
/**
* プロパティ定義のハッシュを求めます
*
* ハッシュ値はプロパティ名とプロパティタイプ名を結合したものを結合し各文字のUTF-16コードと31を掛け続けたものです
*
* @return
*/
fun hash(): Long { fun hash(): Long {
var hash = 1L var hash = 1L
map.map { it.key + it.value.name }.joinToString("").map { hash *= it.code * 31 } map.map { it.key + it.value.name }.joinToString("").map { hash *= it.code * 31 }

View File

@ -17,8 +17,16 @@
package dev.usbharu.owl.common.task package dev.usbharu.owl.common.task
import java.time.Instant import java.time.Instant
import java.util.UUID import java.util.*
/**
* 公開済みのタスク
*
* @param T タスク
* @property task タスク
* @property id タスクのID
* @property published 公開された時刻
*/
data class PublishedTask<T : Task>( data class PublishedTask<T : Task>(
val task: T, val task: T,
val id: UUID, val id: UUID,

View File

@ -16,5 +16,9 @@
package dev.usbharu.owl.common.task package dev.usbharu.owl.common.task
/**
* タスク
*
*/
open class Task { open class Task {
} }

View File

@ -18,15 +18,62 @@ package dev.usbharu.owl.common.task
import dev.usbharu.owl.common.property.PropertyValue import dev.usbharu.owl.common.property.PropertyValue
/**
* タスク定義
*
* @param T タスク
*/
interface TaskDefinition<T : Task> { interface TaskDefinition<T : Task> {
/**
* タスク名
*/
val name: String val name: String
/**
* 優先度
*/
val priority: Int val priority: Int
/**
* 最大リトライ数
*/
val maxRetry: Int val maxRetry: Int
/**
* リトライポリシー名
*
* ポリシーの解決は各Brokerに依存しています
*/
val retryPolicy: String val retryPolicy: String
/**
* タスク実行時のタイムアウト(ミリ秒)
*/
val timeoutMilli: Long val timeoutMilli: Long
/**
* プロパティ定義
*/
val propertyDefinition: PropertyDefinition val propertyDefinition: PropertyDefinition
/**
* [Task][Class]
*/
val type: Class<T> val type: Class<T>
/**
* タスクをシリアライズします.
* プロパティのシリアライズと混同しないようにしてください
* @param task シリアライズするタスク
* @return シリアライズされたタスク
*/
fun serialize(task: T): Map<String, PropertyValue<*>> fun serialize(task: T): Map<String, PropertyValue<*>>
/**
* タスクをデシリアライズします
* プロパティのデシリアライズと混同しないようにしてください
* @param value デシリアライズするタスク
* @return デシリアライズされたタスク
*/
fun deserialize(value: Map<String, PropertyValue<*>>): T fun deserialize(value: Map<String, PropertyValue<*>>): T
} }