0

次のコードがあります。

コントローラ:

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

EventNotifier:

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 からのログはありません。

4

2 に答える 2

2

で注釈が付けられたメソッドは@PostConstruct、Bean の作成中にスプリング コンテキストによって 1 回だけ呼び出されます。メソッドはメソッドを明示的にonStartup()呼び出すsaveMessage()ため、呼び出しが 1 回表示されます。

明示的に呼び出す必要があるたびに保存するには、魔法のように行うことはありません。

于 2016-09-09T14:30:19.477 に答える