[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jira-kak-obrabatyvat-sobytiya-v-jira-cloud":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},1068,"kak-obrabatyvat-sobytiya-v-jira-cloud",27,"jira","Jira","📋","Как обрабатывать события в Jira Cloud?","Обработка событий в Jira Cloud основана на Forge Triggers (рекомендуемый подход) и Connect Webhooks, в отличие от синхронных Event Listener в DC.\n\n### Forge Triggers\n\n```yaml\n# manifest.yml\nmodules:\n  trigger:\n    - key: on-issue-created\n      function: issueCreatedHandler\n      events:\n        - avi:jira:created:issue\n    - key: on-issue-updated\n      function: issueUpdatedHandler\n      events:\n        - avi:jira:updated:issue\n    - key: scheduled-task\n      function: scheduledHandler\n      interval: hour  # minute, hour, day, week\n```\n\n\u003Cdetails>\n\u003Csummary>Код обработчиков событий\u003C\u002Fsummary>\n\n```typescript\nexport async function onIssueCreated(event: any, context: any) {\n    const { issue } = event;\n    console.log(`Issue created: ${issue.key}`);\n\n    if (issue.fields.issuetype.name === 'Bug'\n        && issue.fields.priority.name === 'Critical') {\n\n        await api.asApp().requestJira(\n            route`\u002Frest\u002Fapi\u002F3\u002Fissue\u002F${issue.key}`,\n            {\n                method: 'PUT',\n                headers: { 'Content-Type': 'application\u002Fjson' },\n                body: JSON.stringify({\n                    update: { labels: [{ add: 'critical-auto' }] }\n                })\n            }\n        );\n    }\n}\n\nexport async function onIssueUpdated(event: any, context: any) {\n    const { issue, changelog } = event;\n    if (!changelog?.items) return;\n\n    for (const change of changelog.items) {\n        if (change.field === 'status' && change.toString === 'Done') {\n            await fetch('https:\u002F\u002Fapi.example.com\u002Ftasks\u002Fcompleted', {\n                method: 'POST',\n                headers: { 'Content-Type': 'application\u002Fjson' },\n                body: JSON.stringify({\n                    issueKey: issue.key,\n                    completedAt: new Date().toISOString()\n                })\n            });\n        }\n    }\n}\n\nexport async function onScheduled(event: any) {\n    const response = await api.asApp().requestJira(route`\u002Frest\u002Fapi\u002F3\u002Fsearch`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\u002Fjson' },\n        body: JSON.stringify({\n            jql: 'duedate \u003C now() AND status != Done',\n            maxResults: 50\n        })\n    });\n    const data = await response.json();\n    console.log(`Просроченных задач: ${data.total}`);\n}\n```\n\n\u003C\u002Fdetails>\n\n### Различия обработки событий DC vs Cloud\n\n| Аспект | DC (Event Listener) | Cloud (Forge Trigger) | Cloud (Connect Webhook) |\n|---|---|---|---|\n| Вызов | Синхронно в JVM | Async (serverless) | HTTP POST |\n| Доставка | Гарантированная | At-least-once | At-least-once |\n| Порядок | Гарантированный | Не гарантированный | Не гарантированный |\n| Timeout | Нет (в JVM) | 25 секунд | Зависит от сервера |\n| Retry | Нет (свой) | Автоматический (3x) | Ограниченный |\n\n### Частые ошибки\n\n- Синхронная тяжёлая обработка в Forge trigger — превышение 25-секундного лимита\n- Предположение о порядке событий — issue_updated может прийти раньше issue_created\n- Не обрабатывать дубликаты — проверяйте, было ли событие уже обработано\n- Неиспользование фильтров в Connect webhooks — получение всех событий перегружает сервер\n\n### Как используется в 2026\n\n- Forge Triggers стали основным механизмом для Cloud-приложений\n- Atlassian улучшил гарантии доставки и добавил dead-letter queue для failed triggers\n- Async Events в Forge — для цепочек обработки (trigger -> async function -> async function)\n- Scheduled triggers ограничены: minute, hour, day, week — нет cron-выражений\n\n> **На собеседовании:** сравните три подхода: DC Event Listener (синхронный, в JVM), Forge Trigger (async, serverless, 25s лимит), Connect Webhook (HTTP POST, свой сервер). Ключевое: idempotent-обработка обязательна — события at-least-once, порядок не гарантирован.","","middle",[15,16,17,18,7],"jira-forge","webhooks","event-driven","jira-cloud",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":33,"featuredSnippetReady":34},"Как обрабатывать события в Jira Cloud — Gymterview","Обработка событий Jira Cloud: Forge Triggers (avi:jira:created:issue), Connect Webhooks, Scheduled Triggers. Сравнение DC Event Listener vs Cloud.","События в Jira Cloud: Forge Triggers и Connect Webhooks — Gymterview","Forge Triggers vs Connect Webhooks: async обработка, at-least-once доставка, scheduled triggers, сравнение с DC Event Listener.",[27,28,29,30,31,17,32],"Forge Triggers","Jira Cloud события","avi:jira:created:issue","Connect Webhooks","Scheduled Triggers","at-least-once","Два механизма: Forge Triggers (рекомендуемый, async serverless, автоматический retry 3x, events: avi:jira:created:issue и др.) и Connect Webhooks (HTTP POST, свой сервер). Отличия от DC: асинхронная доставка, at-least-once, порядок не гарантирован, 25s timeout для Forge. Scheduled Triggers: minute\u002Fhour\u002Fday\u002Fweek. Idempotent-обработка обязательна.",true]