feat: タスクをまとめて追加できるように
This commit is contained in:
		
							parent
							
								
									dcc1f582a9
								
							
						
					
					
						commit
						ce888930cc
					
				|  | @ -17,6 +17,7 @@ | |||
| package dev.usbharu.owl.broker.mongodb | ||||
| 
 | ||||
| import com.mongodb.client.model.Filters | ||||
| import com.mongodb.client.model.ReplaceOneModel | ||||
| import com.mongodb.client.model.ReplaceOptions | ||||
| import com.mongodb.kotlin.client.coroutine.MongoDatabase | ||||
| import dev.usbharu.owl.broker.domain.model.task.Task | ||||
|  | @ -49,6 +50,16 @@ class MongodbTaskRepository(database: MongoDatabase, private val propertySeriali | |||
|         return@withContext task | ||||
|     } | ||||
| 
 | ||||
|     override suspend fun saveAll(tasks: List<Task>): Unit = withContext(Dispatchers.IO) { | ||||
|         collection.bulkWrite(tasks.map { | ||||
|             ReplaceOneModel( | ||||
|                 Filters.eq(it.id.toString()), | ||||
|                 TaskMongodb.of(propertySerializerFactory, it), | ||||
|                 ReplaceOptions().upsert(true) | ||||
|             ) | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     override fun findByNextRetryBefore(timestamp: Instant): Flow<Task> { | ||||
|         return collection.find(Filters.lte(TaskMongodb::nextRetry.name, timestamp)) | ||||
|             .map { it.toTask(propertySerializerFactory) }.flowOn(Dispatchers.IO) | ||||
|  |  | |||
|  | @ -23,6 +23,8 @@ import java.util.* | |||
| interface TaskRepository { | ||||
|     suspend fun save(task: Task):Task | ||||
| 
 | ||||
|     suspend fun saveAll(tasks:List<Task>) | ||||
| 
 | ||||
|     fun findByNextRetryBefore(timestamp:Instant): Flow<Task> | ||||
| 
 | ||||
|     suspend fun findById(uuid: UUID): Task? | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ package dev.usbharu.owl.broker.interfaces.grpc | |||
| 
 | ||||
| import dev.usbharu.owl.PublishTaskOuterClass | ||||
| import dev.usbharu.owl.PublishTaskOuterClass.PublishedTask | ||||
| import dev.usbharu.owl.PublishTaskOuterClass.PublishedTasks | ||||
| import dev.usbharu.owl.TaskPublishServiceGrpcKt.TaskPublishServiceCoroutineImplBase | ||||
| import dev.usbharu.owl.broker.external.toUUID | ||||
| import dev.usbharu.owl.broker.service.PublishTask | ||||
|  | @ -56,14 +57,28 @@ class TaskPublishService( | |||
|             ) | ||||
|             PublishedTask.newBuilder().setName(publishedTask.name).setId(publishedTask.id.toUUID()).build() | ||||
|         } catch (e: Throwable) { | ||||
|             logger.warn("exception ",e) | ||||
|             logger.warn("exception ", e) | ||||
|             throw StatusException(Status.INTERNAL) | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     companion object{ | ||||
|         private val logger = LoggerFactory.getLogger(dev.usbharu.owl.broker.interfaces.grpc.TaskPublishService::class.java) | ||||
|     override suspend fun publishTasks(request: PublishTaskOuterClass.PublishTasks): PublishTaskOuterClass.PublishedTasks { | ||||
| 
 | ||||
|         val tasks = request.propertiesArrayList.map { | ||||
|             PublishTask( | ||||
|                 request.name, | ||||
|                 request.producerId.toUUID(), | ||||
|                 PropertySerializeUtils.deserialize(propertySerializerFactory, it.propertiesMap) | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         val publishTasks = taskPublishService.publishTasks(tasks) | ||||
| 
 | ||||
|         return PublishedTasks.newBuilder().setName(request.name).addAllId(publishTasks.map { it.id.toUUID() }).build() | ||||
|     } | ||||
| 
 | ||||
|     companion object { | ||||
|         private val logger = | ||||
|             LoggerFactory.getLogger(dev.usbharu.owl.broker.interfaces.grpc.TaskPublishService::class.java) | ||||
|     } | ||||
| } | ||||
|  | @ -28,6 +28,7 @@ import java.util.* | |||
| 
 | ||||
| interface TaskPublishService { | ||||
|     suspend fun publishTask(publishTask: PublishTask): PublishedTask | ||||
|     suspend fun publishTasks(list: List<PublishTask>): List<PublishedTask> | ||||
| } | ||||
| 
 | ||||
| data class PublishTask( | ||||
|  | @ -44,11 +45,11 @@ data class PublishedTask( | |||
| @Singleton | ||||
| class TaskPublishServiceImpl( | ||||
|     private val taskRepository: TaskRepository, | ||||
|     private val taskDefinitionRepository:TaskDefinitionRepository, | ||||
|     private val taskDefinitionRepository: TaskDefinitionRepository, | ||||
|     private val retryPolicyFactory: RetryPolicyFactory | ||||
| ) : TaskPublishService { | ||||
|     override suspend fun publishTask(publishTask: PublishTask): PublishedTask { | ||||
|                 val id = UUID.randomUUID() | ||||
|         val id = UUID.randomUUID() | ||||
| 
 | ||||
|         val definition = taskDefinitionRepository.findByName(publishTask.name) | ||||
|             ?: throw TaskNotRegisterException("Task ${publishTask.name} not definition.") | ||||
|  | @ -77,6 +78,37 @@ class TaskPublishServiceImpl( | |||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     override suspend fun publishTasks(list: List<PublishTask>): List<PublishedTask> { | ||||
| 
 | ||||
|         val first = list.first() | ||||
| 
 | ||||
|         val definition = taskDefinitionRepository.findByName(first.name) | ||||
|             ?: throw TaskNotRegisterException("Task ${first.name} not definition.") | ||||
| 
 | ||||
|         val published = Instant.now() | ||||
| 
 | ||||
|         val nextRetry = retryPolicyFactory.factory(definition.retryPolicy).nextRetry(published, 0) | ||||
| 
 | ||||
|         val tasks = list.map { | ||||
|             Task( | ||||
|                 it.name, | ||||
|                 UUID.randomUUID(), | ||||
|                 first.producerId, | ||||
|                 published, | ||||
|                 nextRetry, | ||||
|                 null, | ||||
|                 0, | ||||
|                 it.properties | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         taskRepository.saveAll(tasks) | ||||
| 
 | ||||
|         logger.debug("Published {} tasks. name: {}", tasks.size, first.name) | ||||
| 
 | ||||
|         return tasks.map { PublishedTask(it.name, it.id) } | ||||
|     } | ||||
| 
 | ||||
|     companion object { | ||||
|         private val logger = LoggerFactory.getLogger(TaskPublishServiceImpl::class.java) | ||||
|     } | ||||
|  |  | |||
|  | @ -15,11 +15,28 @@ message PublishTask { | |||
|   UUID producer_id = 4; | ||||
| } | ||||
| 
 | ||||
| message Properties { | ||||
|   map<string,string> properties = 1; | ||||
| } | ||||
| 
 | ||||
| message PublishTasks { | ||||
|   string name = 1; | ||||
|   google.protobuf.Timestamp publishedAt = 2; | ||||
|   repeated Properties propertiesArray = 3; | ||||
|   UUID producer_id = 4; | ||||
| } | ||||
| 
 | ||||
| message PublishedTask { | ||||
|   string name = 1; | ||||
|   UUID id = 2; | ||||
| } | ||||
| 
 | ||||
| message PublishedTasks { | ||||
|   string name = 1; | ||||
|   repeated UUID id = 2; | ||||
| } | ||||
| 
 | ||||
| service TaskPublishService { | ||||
|   rpc publishTask (PublishTask) returns (PublishedTask); | ||||
|   rpc publishTasks(PublishTasks) returns (PublishedTasks); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue