【问题标题】:entities not being persisted when saving them async异步保存实体时未持久化的实体
【发布时间】:2016-09-09 12:44:44
【问题描述】:

我有以下代码:

控制器:

eventNotifier.saveMessage(buildMessage(message, room, sender));

事件通知器:

public void saveMessage(Message message){
        r.notify(EventConsumer.NEW_MESSAGE, Event.wrap(message));
    }

事件消费者:

@PostConstruct
    public void onStartUp() {
        r.on(Selectors.R(MESSAGE_SAVED), createEventAndPush());
        r.on(Selectors.R(NEW_MESSAGE), saveMessage());
        r.on(Selectors.R(EVENT), pushToMixpanel());
    }
public Consumer<Event<Message>> saveMessage(){
        System.err.println("Calling save async");
        return event -> messageRepo.save(event.getData());
    }

原来saveMessage 方法从未被调用过。我看到它在启动服务器过程中被调用过一次。

我不确定这是反应堆相关还是弹簧相关。

编辑:我将保存过程移至服务,没有任何改变

edit2:我记录了服务操作以查看发生了什么:

@Service
@Slf4j
public class MessageService {

    @Autowired MessageRepository messageRepo;

    @Transactional
    public void save(Message m){
        try{
            log.info("Saving...");
            messageRepo.save(m);
            log.info("Saved");
        }catch(Exception e){
            e.printStackTrace();
        }
    }

控制台的输出是:

2016-09-09 16:24:42.152  INFO 45041 --- [      wa-chub-2] com.inkdrop.app.services.MessageService  : Saving...
2016-09-09 16:24:42.154  INFO 45041 --- [      wa-chub-2] com.inkdrop.app.services.MessageService  : Saved

没有来自 JPA 的日志,什么都没有!

【问题讨论】:

  • 如果EventConsumer 是一个spring bean,它说明onStartup() 方法在创建bean 时只被调用一次。
  • 是的,EventConsumer 是弹簧豆

标签: spring spring-boot reactor project-reactor spring-async


【解决方案1】:

带有@PostConstruct 注释的方法只会在bean 创建期间被spring 上下文调用一次。 onStartup() 方法显式调用 saveMessage() 方法,因此您会看到一次调用。

每次必须显式调用它时保存它,它不会神奇地完成。

【讨论】:

  • 我想我还不够清楚。每次收到消息,我都会明确地致电生产者:eventNotifier.saveMessage。然后,我可以在日志中看到我在save 周围放置的消息MessageService,但没有JPA 日志。
  • 你能分享完整的消费者代码吗?或者至少有空方法的完整结构?
  • 没有反应堆的东西,MessageRepository .save() 方法可以保存你的实体吗?这在我看来与弹簧数据配置有关。
【解决方案2】:

我会引用@PostContruct Javadoc:

PostConstruct 注解用于需要在依赖注入完成后执行任何初始化的方法。

所以它只会在你的 bean 初始化后执行一次。

【讨论】:

  • 嗯,但我不明白?我在EventConsumer 中还有其他方法,例如将消息推送到 Firebase、记录它等,只要我愿意,它们就会被调用,没有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多