diff --git a/packages/bull-board/src/board.manager.ts b/packages/bull-board/src/board.manager.ts new file mode 100644 index 000000000000..47f33dcafa6a --- /dev/null +++ b/packages/bull-board/src/board.manager.ts @@ -0,0 +1,32 @@ +import { Singleton } from '@midwayjs/core'; +import { createBullBoard } from '@bull-board/api'; +import { BaseAdapter } from '@bull-board/api/dist/src/queueAdapters/base'; + +@Singleton() +export class BullBoardManager { + private bullBoard: ReturnType; + + public setBullBoard(bullBoard: ReturnType) { + this.bullBoard = bullBoard; + } + + public getBullBoardOrigin(): ReturnType { + return this.bullBoard; + } + + public addQueue(queue: BaseAdapter) { + this.bullBoard.addQueue(queue); + } + + public removeQueue(queueOrName: string | BaseAdapter) { + this.bullBoard.removeQueue(queueOrName); + } + + public replaceQueues(newBullQueues: readonly BaseAdapter[]) { + this.bullBoard.replaceQueues(newBullQueues); + } + + public setQueues(newBullQueues: readonly BaseAdapter[]) { + this.bullBoard.setQueues(newBullQueues); + } +} diff --git a/packages/bull-board/src/board.middleware.ts b/packages/bull-board/src/board.middleware.ts index ad9536805bf9..ff7f6ea45c76 100644 --- a/packages/bull-board/src/board.middleware.ts +++ b/packages/bull-board/src/board.middleware.ts @@ -17,6 +17,7 @@ import { createBullBoard } from '@bull-board/api'; import { BullAdapter } from '@bull-board/api/bullAdapter'; import { MidwayAdapter } from './adapter'; import { BullBoardOption } from './interface'; +import { BullBoardManager } from './board.manager'; const MIME_MAP = { '.html': 'text/html', @@ -43,24 +44,25 @@ export class BoardMiddleware implements IMiddleware { @Inject() - framework: bull.Framework; + protected framework: bull.Framework; @Config('bullBoard') - bullBoardConfig: BullBoardOption; + protected bullBoardConfig: BullBoardOption; - bullBoard: ReturnType; + @Inject() + protected bullBoardManager: BullBoardManager; private basePath: string; private serverAdapter: MidwayAdapter; @Init() - async init() { + protected async init() { const queueList = this.framework.getQueueList(); const wrapQueues = queueList.map(queue => new BullAdapter(queue)); this.basePath = this.bullBoardConfig.basePath; this.serverAdapter = new MidwayAdapter(); - this.bullBoard = createBullBoard({ + const bullBoard = createBullBoard({ queues: wrapQueues, serverAdapter: this.serverAdapter, options: { @@ -68,6 +70,7 @@ export class BoardMiddleware }, }); this.serverAdapter.setBasePath(this.basePath); + this.bullBoardManager.setBullBoard(bullBoard); } resolve(app: IMidwayApplication) { diff --git a/packages/bull-board/src/index.ts b/packages/bull-board/src/index.ts index 8d37babd3aa6..84a2477f0c62 100644 --- a/packages/bull-board/src/index.ts +++ b/packages/bull-board/src/index.ts @@ -1,3 +1,5 @@ export { BullBoardConfiguration as Configuration } from './configuration'; export * from './board.middleware'; +export * from './board.manager'; export * from './interface'; +export * as BullBoard from '@bull-board/api'; diff --git a/packages/bull-board/test/index.test.ts b/packages/bull-board/test/index.test.ts index 1a4f56bf10d0..478eb9cdf99a 100644 --- a/packages/bull-board/test/index.test.ts +++ b/packages/bull-board/test/index.test.ts @@ -1,5 +1,6 @@ -import { createApp, close, createHttpRequest } from '@midwayjs/mock'; +import { createApp, close, createHttpRequest, createLightApp } from '@midwayjs/mock'; import { join } from 'path'; +import * as bullboard from '../src'; describe(`/test/index.test.ts`, () => { it('test ui in koa', async () => { @@ -51,4 +52,26 @@ describe(`/test/index.test.ts`, () => { await close(app); }); + + it('should test bullboard manager', async () => { + const app = await createLightApp('', { + imports: [bullboard], + }); + const manager = await app.getApplicationContext().getAsync(bullboard.BullBoardManager); + expect(manager).toBeDefined(); + expect(manager.getBullBoardOrigin()).toBeUndefined(); + + // set bull board + const bullBoard = { + addQueue: () => {}, + removeQueue: () => {}, + replaceQueues: () => {}, + setQueues: () => {}, + }; + + manager.setBullBoard(bullBoard); + expect(manager.getBullBoardOrigin()).toBe(bullBoard); + + await close(app); + }); }); diff --git a/site/docs/extensions/bull.md b/site/docs/extensions/bull.md index cc5fe3f88d02..51da4dbc6f0f 100644 --- a/site/docs/extensions/bull.md +++ b/site/docs/extensions/bull.md @@ -798,7 +798,37 @@ export default { } ``` +此外,组件提供了 `BullBoardManager` ,可以添加动态创建的队列。 +```typescript +import { Configuration, Inject } from '@midwayjs/core'; +import * as bull from '@midwayjs/bull'; +import * as bullBoard from '@midwayjs/bull-board'; + +@Configuration({ + imports: [ + // ... + bull, + bullBoard + ] +}) +export class MainConfiguration { + + @Inject() + bullFramework: bull.Framework; + + @Inject() + bullBoardManager: bullBoard.BullBoardManager; + + async onReady() { + const testQueue = this.bullFramework.createQueue('test', { + // ... + }); + + this.bullBoardManager.addQueue(testQueue); + } +} +``` diff --git a/site/i18n/en/docusaurus-plugin-content-docs/current/extensions/bull.md b/site/i18n/en/docusaurus-plugin-content-docs/current/extensions/bull.md index c7ba129d9695..0b6837809a87 100644 --- a/site/i18n/en/docusaurus-plugin-content-docs/current/extensions/bull.md +++ b/site/i18n/en/docusaurus-plugin-content-docs/current/extensions/bull.md @@ -795,6 +795,38 @@ export default { } ``` +In addition, the component provides the `BullBoardManager` class, which can add queues dynamically created. + +```typescript +import { Configuration, Inject } from '@midwayjs/core'; +import * as bull from '@midwayjs/bull'; +import * as bullBoard from '@midwayjs/bull-board'; + +@Configuration({ + imports: [ + // ... + bull, + bullBoard + ] +}) +export class MainConfiguration { + + @Inject() + bullFramework: bull.Framework; + + @Inject() + bullBoardManager: bullBoard.BullBoardManager; + + async onReady() { + const testQueue = this.bullFramework.createQueue('test', { + // ... + }); + + this.bullBoardManager.addQueue(testQueue); + } +} +``` +