Previously, a single run of the simplest job queue workflow (1 single task, no db calls by user code in the task - we're just testing db system overhead) would result in **22 db roundtrips** on drizzle. This PR reduces it to **17 db roundtrips** by doing the following: - Modifies db.updateJobs to use the new optimized upsertRow function if the update is simple - Do not unnecessarily pass the job log to the final job update when the workflow completes => allows using the optimized upsertRow function, as only the main table is involved --- - To see the specific tasks where the Asana app for GitHub is being used, see below: - https://app.asana.com/0/0/1210888186878606
179 lines
5.6 KiB
TypeScript
179 lines
5.6 KiB
TypeScript
import type { Config } from 'payload'
|
|
|
|
import { lexicalEditor } from '@payloadcms/richtext-lexical'
|
|
import { fileURLToPath } from 'node:url'
|
|
import path from 'path'
|
|
|
|
import { devUser } from '../credentials.js'
|
|
import { seed } from './seed.js'
|
|
import { CreateSimpleRetries0Task } from './tasks/CreateSimpleRetries0Task.js'
|
|
import { CreateSimpleRetriesUndefinedTask } from './tasks/CreateSimpleRetriesUndefinedTask.js'
|
|
import { CreateSimpleTask } from './tasks/CreateSimpleTask.js'
|
|
import { CreateSimpleWithDuplicateMessageTask } from './tasks/CreateSimpleWithDuplicateMessageTask.js'
|
|
import { DoNothingTask } from './tasks/DoNothingTask.js'
|
|
import { ExternalTask } from './tasks/ExternalTask.js'
|
|
import { ReturnCustomErrorTask } from './tasks/ReturnCustomErrorTask.js'
|
|
import { ReturnErrorTask } from './tasks/ReturnErrorTask.js'
|
|
import { ThrowErrorTask } from './tasks/ThrowErrorTask.js'
|
|
import { UpdatePostStep2Task } from './tasks/UpdatePostStep2Task.js'
|
|
import { UpdatePostTask } from './tasks/UpdatePostTask.js'
|
|
import { externalWorkflow } from './workflows/externalWorkflow.js'
|
|
import { failsImmediatelyWorkflow } from './workflows/failsImmediately.js'
|
|
import { inlineTaskTestWorkflow } from './workflows/inlineTaskTest.js'
|
|
import { inlineTaskTestDelayedWorkflow } from './workflows/inlineTaskTestDelayed.js'
|
|
import { longRunningWorkflow } from './workflows/longRunning.js'
|
|
import { noRetriesSetWorkflow } from './workflows/noRetriesSet.js'
|
|
import { parallelTaskWorkflow } from './workflows/parallelTaskWorkflow.js'
|
|
import { retries0Workflow } from './workflows/retries0.js'
|
|
import { retriesBackoffTestWorkflow } from './workflows/retriesBackoffTest.js'
|
|
import { retriesRollbackTestWorkflow } from './workflows/retriesRollbackTest.js'
|
|
import { retriesTestWorkflow } from './workflows/retriesTest.js'
|
|
import { retriesWorkflowLevelTestWorkflow } from './workflows/retriesWorkflowLevelTest.js'
|
|
import { subTaskWorkflow } from './workflows/subTask.js'
|
|
import { subTaskFailsWorkflow } from './workflows/subTaskFails.js'
|
|
import { updatePostWorkflow } from './workflows/updatePost.js'
|
|
import { updatePostJSONWorkflow } from './workflows/updatePostJSON.js'
|
|
import { workflowAndTasksRetriesUndefinedWorkflow } from './workflows/workflowAndTasksRetriesUndefined.js'
|
|
import { workflowRetries2TasksRetries0Workflow } from './workflows/workflowRetries2TasksRetries0.js'
|
|
import { workflowRetries2TasksRetriesUndefinedWorkflow } from './workflows/workflowRetries2TasksRetriesUndefined.js'
|
|
|
|
const dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
|
|
// Needs to be a function to prevent object reference issues due to duplicative configs
|
|
export const getConfig: () => Partial<Config> = () => ({
|
|
collections: [
|
|
{
|
|
slug: 'posts',
|
|
admin: {
|
|
useAsTitle: 'title',
|
|
},
|
|
hooks: {
|
|
afterChange: [
|
|
async ({ req, doc, context }) => {
|
|
await req.payload.jobs.queue({
|
|
workflow: context.useJSONWorkflow ? 'updatePostJSONWorkflow' : 'updatePost',
|
|
input: {
|
|
post: doc.id,
|
|
message: 'hello',
|
|
},
|
|
req,
|
|
})
|
|
},
|
|
],
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
required: true,
|
|
},
|
|
{
|
|
name: 'content',
|
|
type: 'richText',
|
|
},
|
|
{
|
|
name: 'jobStep1Ran',
|
|
type: 'text',
|
|
},
|
|
{
|
|
name: 'jobStep2Ran',
|
|
type: 'text',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
slug: 'simple',
|
|
admin: {
|
|
useAsTitle: 'title',
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
required: true,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
admin: {
|
|
importMap: {
|
|
baseDir: path.resolve(dirname),
|
|
},
|
|
autoLogin: {
|
|
prefillOnly: true,
|
|
email: devUser.email,
|
|
password: devUser.password,
|
|
},
|
|
},
|
|
jobs: {
|
|
autoRun: [
|
|
{
|
|
silent: true,
|
|
// Every second
|
|
cron: '* * * * * *',
|
|
limit: 100,
|
|
queue: 'autorunSecond',
|
|
},
|
|
// add as many cron jobs as you want
|
|
],
|
|
shouldAutoRun: () => true,
|
|
jobsCollectionOverrides: ({ defaultJobsCollection }) => {
|
|
return {
|
|
...defaultJobsCollection,
|
|
admin: {
|
|
...(defaultJobsCollection?.admin || {}),
|
|
hidden: false,
|
|
},
|
|
}
|
|
},
|
|
processingOrder: {
|
|
queues: {
|
|
lifo: '-createdAt',
|
|
},
|
|
},
|
|
tasks: [
|
|
UpdatePostTask,
|
|
UpdatePostStep2Task,
|
|
CreateSimpleTask,
|
|
CreateSimpleRetriesUndefinedTask,
|
|
CreateSimpleRetries0Task,
|
|
CreateSimpleWithDuplicateMessageTask,
|
|
ExternalTask,
|
|
ThrowErrorTask,
|
|
ReturnErrorTask,
|
|
ReturnCustomErrorTask,
|
|
DoNothingTask,
|
|
],
|
|
workflows: [
|
|
updatePostWorkflow,
|
|
updatePostJSONWorkflow,
|
|
retriesTestWorkflow,
|
|
retriesRollbackTestWorkflow,
|
|
retriesWorkflowLevelTestWorkflow,
|
|
noRetriesSetWorkflow,
|
|
retries0Workflow,
|
|
workflowAndTasksRetriesUndefinedWorkflow,
|
|
workflowRetries2TasksRetriesUndefinedWorkflow,
|
|
workflowRetries2TasksRetries0Workflow,
|
|
inlineTaskTestWorkflow,
|
|
failsImmediatelyWorkflow,
|
|
inlineTaskTestDelayedWorkflow,
|
|
externalWorkflow,
|
|
retriesBackoffTestWorkflow,
|
|
subTaskWorkflow,
|
|
subTaskFailsWorkflow,
|
|
longRunningWorkflow,
|
|
parallelTaskWorkflow,
|
|
],
|
|
},
|
|
editor: lexicalEditor(),
|
|
onInit: async (payload) => {
|
|
if (process.env.SEED_IN_CONFIG_ONINIT !== 'false') {
|
|
await seed(payload)
|
|
}
|
|
},
|
|
typescript: {
|
|
outputFile: path.resolve(dirname, 'payload-types.ts'),
|
|
},
|
|
})
|