保存异步时,实体不会被持久化

时间:2016-09-09 12:44:45

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

我有以下代码:

控制器:

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

事件通知器:

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

EventConsumer:

@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没有日志,没有!

2 个答案:

答案 0 :(得分:2)

使用npm install d3-drag 注释的方法仅在bean创建期间由spring上下文调用一次。 @PostConstruct方法明确调用onStartup()方法,因此您可以看到一次调用。

要在每次必须明确调用它时保存它,它就不会神奇地完成。

答案 1 :(得分:1)

我会引用@PostContruct Javadoc

  

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

因此,在初始化bean之后,它只会被执行一次。