繁体   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