package com.dji.sample.manage.handler; import com.dji.sample.component.mqtt.model.ChannelName; import com.dji.sample.component.mqtt.model.TopicStateReceiver; import com.dji.sample.manage.model.receiver.DevicePayloadReceiver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.annotation.MessageEndpoint; import org.springframework.integration.annotation.Splitter; import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.integration.dsl.IntegrationFlows; import java.util.ArrayList; import java.util.Collection; /** * * @author sean.zhou * @date 2021/11/17 * @version 0.1 */ @MessageEndpoint @Configuration public class StateSplitter { /** * Split the state message data to different channels for handling according to their different types. * @param receiver state message * @return */ @Splitter(inputChannel = ChannelName.INBOUND_STATE_SPLITTER, outputChannel = ChannelName.INBOUND_STATE_ROUTER) public Collection splitState(TopicStateReceiver receiver) { ArrayList type = new ArrayList<>(); type.add(receiver.getData()); return type; } /** * Split according to the different types in the list. * @return */ @Bean public IntegrationFlow splitList() { return IntegrationFlows .from(ChannelName.INBOUND_STATE_LIST) .split() . route(dataType -> { Class clazz = dataType.getClass(); if (DevicePayloadReceiver.class.isAssignableFrom(clazz)) { return ChannelName.INBOUND_STATE_PAYLOAD; } return null; }, mapping -> { mapping.channelMapping(ChannelName.INBOUND_STATE_PAYLOAD, ChannelName.INBOUND_STATE_PAYLOAD); }) .get(); } }