sean.zhou
2022-03-28 7d0facde2378bf5e3709306ed0dfbd9f59967d48
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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<Object> splitState(TopicStateReceiver receiver) {
        ArrayList<Object> 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()
                .<Object, String> 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();
    }
}