ဘာလုပ်ဆောင်ပါသနည်း
- @Service class ၏ private သို့မဟုတ် public method ပေါ်တွင် decorator တပ်ရပါသည်
- ထို method မှ ပြန်ပေးသော တန်ဖိုးကို plugin DI container ထဲတွင် singleton အဖြစ် မှတ်ပုံတင်ပါသည်
- အခြား service သို့မဟုတ် controller များက type သို့မဟုတ် ပြန်ပေးသော class အလိုက် @Inject ဖြင့် ယူသုံးနိုင်ပါသည်
- ကိုယ်ပိုင်မဟုတ်သော library (BullMQ၊ ioredis၊ AWS SDK စသည်) များကို ထုပ်ပိုးရန် အသင့်တော်ဆုံးဖြစ်ပါသည်
စည်းကမ်းများ
- Host class သည် @Service() ဖြစ်ရမည်ဖြစ်ပြီး၊ module providers တွင် စာရင်းသွင်းထားရပါသည်
- Factory သည် DI တပ်ဆင်ချိန်တွင် အလုပ်လုပ်ပါသည် — client သို့မဟုတ် queue ဖန်တီးရုံသာ ထားရှိပြီး၊ ကြီးမားသော အလုပ်ကို နောက်သို့ ရွှေ့ထားရပါသည်
- @Bean method တစ်ခုလျှင် တိကျသော instance တစ်ခုသာ ပြန်ပေးရပါသည်
- Constructor injection ကို မည်သည့်နေရာတွင်မျှ မထောက်ပံ့ပါ — အသုံးပြုသူများက property @Inject ဖြင့်သာ ယူရပါသည်
BullMQ Queue နမူနာ
အသုံးများသော ပုံစံမှာ ကိုယ်ပိုင် နောက်ခံအလုပ်များအတွက် Queue ကို ထုတ်ပေးခြင်းဖြစ်ပါသည်။ ပုံမှန်အချိန်ဇယားများအတွက်မူ CronJobService ကို ဦးစားပေးရပါသည်။
TSXfactory
1import { Queue } from "bullmq";
2import { Bean, Service } from "@quan-erp/shared-backend-core";
3
4@Service()
5export class QueueRegistryService {
6 @Bean()
7 private registerQueue() {
8 return new Queue("my-queue", { connection: redisOptions });
9 }
10}TSXinject consumer
1import { Queue } from "bullmq";
2import { Inject, Service } from "@quan-erp/shared-backend-core";
3
4@Service()
5export class JobPublisherService {
6 @Inject(Queue) // or the concrete token your factory returns
7 private queue: Queue;
8
9 async enqueue(payload: unknown) {
10 await this.queue.add("task", payload);
11 }
12}မည်သည့်အခါ အသုံးပြုရမည်
- သုံးသင့်ပါသည် — မျှဝေသုံးမည့် Queue / Worker / Redis / HTTP SDK client များ
- သုံးသင့်ပါသည် — ဖန်တီးချိန်တွင် env သို့မဟုတ် config လိုအပ်သော adapter များ
- မသုံးသင့်ပါ — ပုံမှန် plugin service များ (@Service နှင့် @Inject ကို အသုံးပြုပါ)
- မသုံးသင့်ပါ — cron အချိန်ဇယားများ (CronJobService ကို အသုံးပြုပါ — Cron job စာမျက်နှာကို ကြည့်ပါ)
လိုက်နာသင့်သော အလေ့အထများ
- Factory method များကို သေးငယ်စေပြီး registerX / createX ကဲ့သို့ ရှင်းလင်းစွာ အမည်ပေးရပါသည်
- ချိတ်ဆက်မှုဆိုင်ရာ option များကို PluginEnv သို့မဟုတ် base env မှသာ ဖတ်ရပါသည် — secret ကို ကုဒ်ထဲတွင် တိုက်ရိုက် မရေးရပါ
- Library က ရှင်းလင်းမှု လိုအပ်ပါက uninstall ချိန်တွင် @OnUninstall အတွင်း disconnect လုပ်ရပါသည်
- Factory အမှန်တကယ် အလုပ်လုပ်စေရန် host @Service ကို @Module({ providers }) တွင် စာရင်းသွင်းရပါသည်