当前位置: 首页 > 知识库问答 >
问题:

使用自定义ApplicationEventPublisher发送Spring域事件

融建树
2023-03-14

我试图使用Spring Boot/Spring数据,遵循DDD体系结构准则来实现一个应用程序。我有一个聚合根,它使用方法AbstractAggregateRoot::RegisterEvent()发布域事件。此外,为了日志/跟踪的目的,我需要截获这些事件,所以我决定做一个实验:

首先,实现自定义ApplicationEvent发布服务器

public class CustomEventPublisher implements ApplicationEventPublisher {
    private final ApplicationEventPublisher publisher;

    private final Logger logger = getLogger(CustomEventPublisher.class);

    public CustomEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    @Override
    public void publishEvent(ApplicationEvent event) {
        logger.info("sending an event...");
        publisher.publishEvent(event);
    }

    //.....
}

然后注册为bean

@Configuration
public class CustomEventPublisherConfig {

    @Bean
    @Primary
    public ApplicationEventPublisher getCustomEventPublisher(ApplicationEventPublisher publisher , RabbitTemplate rabbitTemplate) {
        return new CustomEventPublisher(publisher, rabbitTemplate);
    }
}

一旦我用注入的ApplicationEventPublisher显式发布来自某个示例对象的事件,这就很好了

public void pub() {
    publisher.publishEvent(new Event(this , 1));
}

@EventListener
public void sub(Event e) {
    this.value = e.getValue();
}

我收到了“发送一个活动...”日志条目

然后我尝试定义聚合根

@Entity
public class AggregateRoot extends AbstractAggregateRoot {

    @Id
    @GeneratedValue
    private Long id;

    private int value = 0;

    public AggregateRoot setValue(int value) {
        registerEvent(new Event(this , value));
        return this;
    }
}
public void pub() {
    repository.save(new AggregateRoot().setValue(1));
}

有什么克服这个问题的建议吗?

提前致谢

共有1个答案

詹斌蔚
2023-03-14

据我所知,Spring没有提供替换EventPublishingRepositoryProxyPostProcessor使用的发布服务器的方法。在我看来,你没有选择一条正确的道路来获得你想要实现的目标,所以我不是直接回答你的问题,而是在开始时描述的你的要求。

我建议您使用@eventlistener注册一个侦听器,并在那里处理您的事件:

@EventListener
public void handleEvent(Event event) {
    System.out.println(event);
}

也可以使用@TransactionalEventListener将侦听器绑定到事务阶段:

@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void handleEvent(Event event) {
    System.out.println(event);
}
 类似资料:
  • 我的程序目的:触发服务中的BACK按钮 我尝试了很多方法,没有人能达到这个目的,最后我发现了AccessibilityService,它可能是实现这个功能的最可能的方法。 我创建了这个AccessibilityService,并测试它是否正常工作 然后我尝试将移动到服务,但它不执行操作。 我也尝试以不同的方式发送自定义事件,但没有人可以发送到MyAccessibilityService 如何向My

  • 我正在创建一个应用程序,我需要从自定义gmail域发送电子邮件。这是我的代码。 它给我的错误如下: 线程"main"中的异常java.lang.运行时异常:javax.mail.身份验证失败异常:534-5.7.14请通过534-5.7.14您的Web浏览器登录,然后重试。534-5.7.14在534 5.7.14https://support.google.com/mail/answer/787

  • /** 自定义消息发送接口(目前只支持文本消息发送) @param chatController 聊窗实体(必须是小能SDK创建的聊窗实体NtalkerChatController类型) @param type 消息类型: 11:文本消息 12:图片消息 13:语音消息 14:视频消息 @param message 消息内容 */ NSString *str = @“自定义文本消息test”;

  • 我一直在尝试使用 Openshift Online v3 来托管一个 Web 应用程序。它适用于红帽提供的域,但我无法让路由工作以使其在任何其他域上工作。我得到的只是: 应用程序不可用 应用程序当前未在此终结点处为请求提供服务。它可能尚未启动或仍在启动。 您看到此页面的可能原因: 有人知道如何在Openshift v3中创建自定义域吗?

  • 问题内容: 我正在通过制作一个简单的Twitter客户端来练习PyQt和(Q)线程。我有两个Qthread。 主/ GUI线程。 Twitter提取线程-每隔X分钟从Twitter提取数据。 因此,每隔X分钟,我的Twitter线程就会下载一组新的状态更新(Python列表)。我想将此列表移交给Main / GUI线程,以便它可以使用这些状态更新窗口。 我假设我应该使用信号/插槽系统将“状态” P