[{"data":1,"prerenderedAt":744},["ShallowReactive",2],{"docs:\u002Fguide\u002Fclient":3},{"page":4,"untranslated":743,"translated":743},{"id":5,"title":6,"body":7,"description":734,"extension":735,"meta":736,"navigation":76,"path":737,"publishedAt":738,"seo":739,"stem":740,"updatedAt":741,"__hash__":742},"docs_ja\u002Fguide\u002Fclient.md","別Workerからの投入",{"type":8,"value":9,"toc":725},"minimark",[10,14,35,39,245,248,261,350,353,365,402,408,411,426,511,519,523,573,576,603,649,653,656,713,721],[11,12,6],"h1",{"id":13},"別workerからの投入",[15,16,17,18,22,23,26,27,30,31,34],"p",{},"performerを持たないWorkerからジョブを投入する場合、",[19,20,21],"code",{},"tsumugi\u002Fclient","の",[19,24,25],{},"createClient","を使用してください。",[28,29],"br",{},"\nperformerを定義したWorkerでは、",[19,32,33],{},"defineTsumugi","の戻り値から投入します。",[36,37,38],"h2",{"id":38},"使い方",[40,41,46],"pre",{"className":42,"code":43,"language":44,"meta":45,"style":45},"language-ts shiki shiki-themes github-light github-dark","import { createClient } from 'tsumugi\u002Fclient';\n\nconst jobs = createClient\u003CEnv>();\n\nexport default {\n  async fetch(request, env) {\n    const id = await jobs.enqueue(env, {\n      binding: 'MAIL',\n      payload: { to: 'a@example.com', subject: 'hi' },\n    });\n    return Response.json({ id });\n  },\n} satisfies ExportedHandler\u003CEnv>;\n","ts","",[19,47,48,71,78,104,109,121,146,169,181,199,205,220,226],{"__ignoreMap":45},[49,50,53,57,61,64,68],"span",{"class":51,"line":52},"line",1,[49,54,56],{"class":55},"szBVR","import",[49,58,60],{"class":59},"sVt8B"," { createClient } ",[49,62,63],{"class":55},"from",[49,65,67],{"class":66},"sZZnC"," 'tsumugi\u002Fclient'",[49,69,70],{"class":59},";\n",[49,72,74],{"class":51,"line":73},2,[49,75,77],{"emptyLinePlaceholder":76},true,"\n",[49,79,81,84,88,91,95,98,101],{"class":51,"line":80},3,[49,82,83],{"class":55},"const",[49,85,87],{"class":86},"sj4cs"," jobs",[49,89,90],{"class":55}," =",[49,92,94],{"class":93},"sScJk"," createClient",[49,96,97],{"class":59},"\u003C",[49,99,100],{"class":93},"Env",[49,102,103],{"class":59},">();\n",[49,105,107],{"class":51,"line":106},4,[49,108,77],{"emptyLinePlaceholder":76},[49,110,112,115,118],{"class":51,"line":111},5,[49,113,114],{"class":55},"export",[49,116,117],{"class":55}," default",[49,119,120],{"class":59}," {\n",[49,122,124,127,130,133,137,140,143],{"class":51,"line":123},6,[49,125,126],{"class":55},"  async",[49,128,129],{"class":93}," fetch",[49,131,132],{"class":59},"(",[49,134,136],{"class":135},"s4XuR","request",[49,138,139],{"class":59},", ",[49,141,142],{"class":135},"env",[49,144,145],{"class":59},") {\n",[49,147,149,152,155,157,160,163,166],{"class":51,"line":148},7,[49,150,151],{"class":55},"    const",[49,153,154],{"class":86}," id",[49,156,90],{"class":55},[49,158,159],{"class":55}," await",[49,161,162],{"class":59}," jobs.",[49,164,165],{"class":93},"enqueue",[49,167,168],{"class":59},"(env, {\n",[49,170,172,175,178],{"class":51,"line":171},8,[49,173,174],{"class":59},"      binding: ",[49,176,177],{"class":66},"'MAIL'",[49,179,180],{"class":59},",\n",[49,182,184,187,190,193,196],{"class":51,"line":183},9,[49,185,186],{"class":59},"      payload: { to: ",[49,188,189],{"class":66},"'a@example.com'",[49,191,192],{"class":59},", subject: ",[49,194,195],{"class":66},"'hi'",[49,197,198],{"class":59}," },\n",[49,200,202],{"class":51,"line":201},10,[49,203,204],{"class":59},"    });\n",[49,206,208,211,214,217],{"class":51,"line":207},11,[49,209,210],{"class":55},"    return",[49,212,213],{"class":59}," Response.",[49,215,216],{"class":93},"json",[49,218,219],{"class":59},"({ id });\n",[49,221,223],{"class":51,"line":222},12,[49,224,225],{"class":59},"  },\n",[49,227,229,232,235,238,240,242],{"class":51,"line":228},13,[49,230,231],{"class":59},"} ",[49,233,234],{"class":55},"satisfies",[49,236,237],{"class":93}," ExportedHandler",[49,239,97],{"class":59},[49,241,100],{"class":93},[49,243,244],{"class":59},">;\n",[36,246,247],{"id":247},"必要なbinding",[15,249,250,251,254,255,257,260],{},"投入するWorkerに設定するbindingは、",[19,252,253],{},"JOB_SHARD","に限定されます。",[28,256],{},[19,258,259],{},"script_name","には、Tsumugiを設定したWorkerの名前を指定してください。",[40,262,266],{"className":263,"code":264,"language":265,"meta":45,"style":45},"language-jsonc shiki shiki-themes github-light github-dark","{\n  \"durable_objects\": {\n    \"bindings\": [\n      {\n        \"name\": \"JOB_SHARD\",\n        \"class_name\": \"TsumugiJobShard\",\n        \"script_name\": \"my-jobs\",\n      },\n    ],\n  },\n}\n","jsonc",[19,267,268,273,281,289,294,307,319,331,336,341,345],{"__ignoreMap":45},[49,269,270],{"class":51,"line":52},[49,271,272],{"class":59},"{\n",[49,274,275,278],{"class":51,"line":73},[49,276,277],{"class":86},"  \"durable_objects\"",[49,279,280],{"class":59},": {\n",[49,282,283,286],{"class":51,"line":80},[49,284,285],{"class":86},"    \"bindings\"",[49,287,288],{"class":59},": [\n",[49,290,291],{"class":51,"line":106},[49,292,293],{"class":59},"      {\n",[49,295,296,299,302,305],{"class":51,"line":111},[49,297,298],{"class":86},"        \"name\"",[49,300,301],{"class":59},": ",[49,303,304],{"class":66},"\"JOB_SHARD\"",[49,306,180],{"class":59},[49,308,309,312,314,317],{"class":51,"line":123},[49,310,311],{"class":86},"        \"class_name\"",[49,313,301],{"class":59},[49,315,316],{"class":66},"\"TsumugiJobShard\"",[49,318,180],{"class":59},[49,320,321,324,326,329],{"class":51,"line":148},[49,322,323],{"class":86},"        \"script_name\"",[49,325,301],{"class":59},[49,327,328],{"class":66},"\"my-jobs\"",[49,330,180],{"class":59},[49,332,333],{"class":51,"line":171},[49,334,335],{"class":59},"      },\n",[49,337,338],{"class":51,"line":183},[49,339,340],{"class":59},"    ],\n",[49,342,343],{"class":51,"line":201},[49,344,225],{"class":59},[49,346,347],{"class":51,"line":207},[49,348,349],{"class":59},"}\n",[36,351,352],{"id":352},"設定の一致",[15,354,355,358,359,361,362,364],{},[19,356,357],{},"shards","を2以上に設定したbindingでは、",[19,360,25],{},"にも同じ",[19,363,357],{},"を指定してください。",[40,366,368],{"className":42,"code":367,"language":44,"meta":45,"style":45},"const jobs = createClient\u003CEnv>({\n  MAIL: { shards: 4 },\n});\n",[19,369,370,387,397],{"__ignoreMap":45},[49,371,372,374,376,378,380,382,384],{"class":51,"line":52},[49,373,83],{"class":55},[49,375,87],{"class":86},[49,377,90],{"class":55},[49,379,94],{"class":93},[49,381,97],{"class":59},[49,383,100],{"class":93},[49,385,386],{"class":59},">({\n",[49,388,389,392,395],{"class":51,"line":73},[49,390,391],{"class":59},"  MAIL: { shards: ",[49,393,394],{"class":86},"4",[49,396,198],{"class":59},[49,398,399],{"class":51,"line":80},[49,400,401],{"class":59},"});\n",[15,403,404,407],{},[19,405,406],{},"policy","と保持期間は、bindingごとにTsumugiを設定したWorkerと同じ値を指定してください。",[36,409,410],{"id":410},"投入時の既定値",[15,412,413,415,416,419,420,422,423,425],{},[19,414,33],{},"に指定した",[19,417,418],{},"onEnqueue","は、別Workerからの投入には適用されません。",[28,421],{},"\n別Workerからの投入にも同じ既定値を使う場合は、",[19,424,25],{},"の第3引数に同じ関数を指定してください。",[40,427,429],{"className":42,"code":428,"language":44,"meta":45,"style":45},"const jobs = createClient\u003CEnv>(\n  {},\n  {},\n  { onEnqueue: (input) => (input.binding === 'MAIL' ? { timeoutMs: 120_000 } : undefined) },\n);\n",[19,430,431,448,453,457,506],{"__ignoreMap":45},[49,432,433,435,437,439,441,443,445],{"class":51,"line":52},[49,434,83],{"class":55},[49,436,87],{"class":86},[49,438,90],{"class":55},[49,440,94],{"class":93},[49,442,97],{"class":59},[49,444,100],{"class":93},[49,446,447],{"class":59},">(\n",[49,449,450],{"class":51,"line":73},[49,451,452],{"class":59},"  {},\n",[49,454,455],{"class":51,"line":80},[49,456,452],{"class":59},[49,458,459,462,464,467,470,473,476,479,482,485,488,491,494,497,500,503],{"class":51,"line":106},[49,460,461],{"class":59},"  { ",[49,463,418],{"class":93},[49,465,466],{"class":59},": (",[49,468,469],{"class":135},"input",[49,471,472],{"class":59},") ",[49,474,475],{"class":55},"=>",[49,477,478],{"class":59}," (input.binding ",[49,480,481],{"class":55},"===",[49,483,484],{"class":66}," 'MAIL'",[49,486,487],{"class":55}," ?",[49,489,490],{"class":59}," { timeoutMs: ",[49,492,493],{"class":86},"120_000",[49,495,496],{"class":59}," } ",[49,498,499],{"class":55},":",[49,501,502],{"class":86}," undefined",[49,504,505],{"class":59},") },\n",[49,507,508],{"class":51,"line":111},[49,509,510],{"class":59},");\n",[15,512,513,514,518],{},"既定値の決まり方は、",[515,516,410],"a",{"href":517},"\u002Fguide\u002Fexecution#%E6%8A%95%E5%85%A5%E6%99%82%E3%81%AE%E6%97%A2%E5%AE%9A%E5%80%A4","で説明しています。",[36,520,522],{"id":521},"api","API",[524,525,526,539],"table",{},[527,528,529],"thead",{},[530,531,532,536],"tr",{},[533,534,535],"th",{},"メソッド",[533,537,538],{},"内容",[540,541,542,553,563],"tbody",{},[530,543,544,550],{},[545,546,547],"td",{},[19,548,549],{},"enqueue(env, input)",[545,551,552],{},"1件のジョブの投入。戻り値はジョブID",[530,554,555,560],{},[545,556,557],{},[19,558,559],{},"enqueueMany(env, inputs)",[545,561,562],{},"複数のジョブの一括投入",[530,564,565,570],{},[545,566,567],{},[19,568,569],{},"shardFor(env, binding, partitionKey?)",[545,571,572],{},"投入先のshardのstubの取得",[36,574,575],{"id":575},"型",[15,577,578,580,581,139,584,139,587,139,590,139,593,139,596,139,599,602],{},[19,579,21],{},"は、",[19,582,583],{},"EnqueueInput",[19,585,586],{},"EnqueueOptions",[19,588,589],{},"EnqueueItem",[19,591,592],{},"JobQueue",[19,594,595],{},"Performers",[19,597,598],{},"BindingConfig",[19,600,601],{},"TsumugiClient","などの型を提供します。",[15,604,605,22,607,609,610,612,613,616,617,620,621,616,624,627,628,630,631,633,634,637,638,640,641,643,644,648],{},[19,606,25],{},[19,608,165],{},"が受け取る",[19,611,583],{},"では、",[19,614,615],{},"binding","は",[19,618,619],{},"string","型, ",[19,622,623],{},"payload",[19,625,626],{},"unknown","型です。",[28,629],{},"\nそのため、bindingごとの型検査とキーの必須化は適用されません。",[28,632],{},"\nperformerの型を共有している場合は、",[19,635,636],{},"JobQueue\u003CM>","に適合するラッパーを作成すると、",[19,639,33],{},"と同じ型検査が適用されます。",[28,642],{},"\n両者の違いは、",[515,645,647],{"href":646},"\u002Fguide\u002Fenqueue#%E6%8A%95%E5%85%A5%E6%96%B9%E6%B3%95","投入方法","にまとめています。",[36,650,652],{"id":651},"rest-apiからの投入","REST APIからの投入",[15,654,655],{},"Workerを追加せずにジョブを投入する場合は、Tsumugiを設定したWorkerのREST APIにリクエストを送信してください。",[40,657,661],{"className":658,"code":659,"language":660,"meta":45,"style":45},"language-bash shiki shiki-themes github-light github-dark","curl -X POST https:\u002F\u002Fmy-jobs.example.workers.dev\u002Fapi\u002Fjobs \\\n  -H \"Authorization: Bearer $TSUMUGI_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"binding\":\"MAIL\",\"payload\":{\"to\":\"a@example.com\",\"subject\":\"hi\"}}'\n","bash",[19,662,663,680,696,705],{"__ignoreMap":45},[49,664,665,668,671,674,677],{"class":51,"line":52},[49,666,667],{"class":93},"curl",[49,669,670],{"class":86}," -X",[49,672,673],{"class":66}," POST",[49,675,676],{"class":66}," https:\u002F\u002Fmy-jobs.example.workers.dev\u002Fapi\u002Fjobs",[49,678,679],{"class":86}," \\\n",[49,681,682,685,688,691,694],{"class":51,"line":73},[49,683,684],{"class":86},"  -H",[49,686,687],{"class":66}," \"Authorization: Bearer ",[49,689,690],{"class":59},"$TSUMUGI_TOKEN",[49,692,693],{"class":66},"\"",[49,695,679],{"class":86},[49,697,698,700,703],{"class":51,"line":80},[49,699,684],{"class":86},[49,701,702],{"class":66}," \"Content-Type: application\u002Fjson\"",[49,704,679],{"class":86},[49,706,707,710],{"class":51,"line":106},[49,708,709],{"class":86},"  -d",[49,711,712],{"class":66}," '{\"binding\":\"MAIL\",\"payload\":{\"to\":\"a@example.com\",\"subject\":\"hi\"}}'\n",[15,714,715,716,720],{},"リクエストの形式は、",[515,717,719],{"href":718},"\u002Freference\u002Frest-api#post-apijobs","REST API","を参照してください。",[722,723,724],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":45,"searchDepth":80,"depth":80,"links":726},[727,728,729,730,731,732,733],{"id":38,"depth":73,"text":38},{"id":247,"depth":73,"text":247},{"id":352,"depth":73,"text":352},{"id":410,"depth":73,"text":410},{"id":521,"depth":73,"text":522},{"id":575,"depth":73,"text":575},{"id":651,"depth":73,"text":652},"performerを持たないWorkerから、tsumugi\u002FclientのcreateClientを使用してジョブを投入する方法について","md",{},"\u002Fguide\u002Fclient","2026-07-22",{"title":6,"description":734},"guide\u002Fclient","2026-10-25","9oYBHYP_YiQG-b6CsHYYRJ_PDg9kZbrlZtLcaeBTFdg",false,1794027571429]