consumer #2
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
}
|
}
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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 }
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -16,5 +16,9 @@
|
||||||
|
|
||||||
package dev.usbharu.owl.common.task
|
package dev.usbharu.owl.common.task
|
||||||
|
|
||||||
|
/**
|
||||||
|
* タスク
|
||||||
|
*
|
||||||
|
*/
|
||||||
open class Task {
|
open class Task {
|
||||||
}
|
}
|
|
@ -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
|
||||||
}
|
}
|
Loading…
Reference in New Issue