杨子锋
杨子锋

Reputation: 5

How to get StateContext in StateMachineListener and how to config states to implement my statechart?

My First Question:

In my StateMachineConfiguration.class.

@Bean
public StateMachineListener<CompanyStatus, CompanyEvents> listener() {
    return new StateMachineListenerAdapter<CompanyStatus, CompanyEvents>() {
        @Override
        public void transition(Transition<CompanyStatus, CompanyEvents> transition) {
            if(transition.getTarget().getId() == CompanyStatus.COMPANY_CREATED) {
                logger.info("公司创建,发送消息到用户服务和菜单服务");
                // how to get stateContext in there?
                StateContext stateContext;
                Message message = new Message.Builder<String>().messageType(CompanyStatus.COMPANY_CREATED.toString()).build();
                messageSender.sendToUaa(message);
                messageSender.sendToRes(message);
            }
        }
    };
}

In my service.

log.debug("Request to save Company : {}", companyDTO);
    Company company = companyMapper.toCmpy(companyDTO);
    company = companyRepository.save(company);
    stateMachine.sendEvent(MessageBuilder
        .withPayload(CompanyEvents.COMPANY_CREATE)
        .setHeader("companyId", company.getId())
        .build());
    return companyMapper.toCmpyDTO(company);

How I can get message header[companyId] in listener?

My Second Question: statechart

Upvotes: 0

Views: 1010

Answers (1)

Janne Valkealahti
Janne Valkealahti

Reputation: 2646

In StateMachineListener you could use its stateContext method which gives you access to StateContext. StateContext then have access to message headers via its getMessageHeaders.

Original listener interface didn't expose that much so we had to add new method which exposes context which were introduced to machine later than listener interface were created. This because we need not to break things and we generally like to be backward compatibility.

Upvotes: 2

Related Questions