簡體   English   中英

如何在創建另一個 class 的 object 后調用方法

[英]How to call a method after a object from another class is created

首先,我想向您展示我的圖表:圖表 你怎么看,我們有兩個模塊“Ticket”和“Notification”。 通知模塊依賴於工單模塊。 一旦“TicketService”創建了一個工單,將調用 EmailHandler 組件的 sendEmail 方法。 不幸的是,我不知道如何解決這個問題。

存在對任何架構都有效的模式。 當您的TicketService創建票證時,它會生成一個事件,任何感興趣的進程都會訂閱。

EJB中,它可以使用@Observes 注釋來解決,但也可以使用任何事件代理(流媒體...kafka、activemq、spark...)。

Spring Boot不支持直接事件注冊(如此處所述@Observes ),但您可以使用它或任何其他事件代理。

如果您沒有使用 Java 企業服務,我建議您根據項目的需要使用代理(例如kafka ,如果它很大,或者為了簡單起見使用nats )。

要顯示使用 NATS 的最小代碼示例,您可以使用以下方法連接到 NATS 服務器代理:

final Connection nc = Nats.connect("nats://localhost:4222");

然后,任何有興趣知道已創建新票證的進程都將監聽此類事件

final Subscription sub = c.subscribe(CHANNEL);
while (true)
    sendMessageForTicket(sub.nextMessage(Duration.ofDays(365)).getData());

TicketService將發送一條消息以供所有這些偵聽進程接收

c.publish(CHANNEL, myCreatedTicketData);

當然,所有進程都是解耦的、水平可擴展的(例如微服務)並且只共享某個Ticket存在的知識。

您的圖表解釋了架構(組件和關系),同時忽略了技術細節(技術/框架)在普通 java 中。如果需要,您可以在普通 java 中快速實現它。

  1. 為“票”和“通知”模塊創建兩個 java 包。

  2. 為 EmailHandlerInterface 創建一個 java 接口,並將其放入 'ticket' package。

  3. 在“通知”package 中,創建 EmailHandler class 並實現創建的 EmailHandlerInterface

  4. 在“ticket”package 中,將 Ticket object 實現為簡單的 java POJO class,

  5. 在“票”模塊中,創建以票 object 為原型的 TicketSercice class,並返回創建的票 object。

  6. 您需要在“票包”中添加一個額外的 object(我們將其命名為 TicketModuleExecutor 或其他名稱)。 您必須通過 EmailHandleInterface 向其注入 EmailHandler。 這個 object 應該有一個方法 'execute' 來創建一個 Ticket object,將它傳遞給 TicketService,並在 TicketService::create 成功調用 EmailHandler::sendEmail 之后通過接口執行。

  7. 在“默認”package 中,使用 main 方法創建主應用程序 class(這樣您就可以執行您的程序)。 在主程序中,初始化“票”模塊主程序 class,初始化一個 EmailHandler object 並將其傳遞給主程序,然后調用 TicketModuleExecutor.execute() 來完成整個程序。

一般來說,如果您在實施過程中遵循所有良好實踐,如 SOLID 和 IoC,您以后可以輕松地將您的代碼遷移到任何框架,而無需更改您的架構。

我可能犯了一些小錯誤; 因為如果不使用英語編碼就很難編碼,這不是您的母語:-D 但我不會為您編碼,因為我不想為您解決任務。 您應該自己實施該應用程序。

在 Spring 中,您首先應該定義適合您的模塊。 如果是單獨的獨立應用,那么選擇通信方式1.同步或者2.異步。 對於同步選項,您可以使用 rests 或 servlets。 2. 對於異步,您可以使用 KAFKA、RabitMQ、JMS 或任何其他代理。 如果你想在一個應用程序中有模塊,你可以使用我的普通 java 示例並使用 Spring Beans 實現它,或者你可以使用 spring 事件或 AOP 方法。 關於如何實現此圖,有許多選項;-)

無論如何,對於這樣一個簡單的案例,我建議使用 Spring bean 對象實現應用程序的 KISS(保持簡單愚蠢)在這里就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM