<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    EVEN DRIVEN - SPRING CLOUD STREAM - Routing Function

    SPRING CLOUD STREAM內置了一個RoutingFunction,能將MESSAGE路由到應用的其他FUNCTION中。
    對接RoutingFunction可發送消息到其外部DESTINATION中或用“|”連接符連接。

    application.yaml
    # This setting can increase or decrease the rate of message production (1000 = 1s)
    #
     spring.cloud.stream.poller.fixed-delay=1000
    #
     DefaultPollerProperties

    # This setting can control which function method in our code will be triggered if there are multiple
    #
     spring.cloud.function.definition=supplyLoan

    # Give the autogenerated binding a friendlier name
    spring:
       application:
          name: loan-check-rabbit
       banner:
          location: classpath:/banner-rabbit.txt
       cloud:
          #BindingServiceProperties
          stream:
             #StreamFunctionProperties
             function:
                definition: loadCheckerFunction;loanCheckerDecieder;loanCheckerConsumer;\
                            loanDeclinedConsumer;loanApprovedConsumer;loanCheckerProcessor|functionRouter
                routing:
                   enabled: true
             #BindingProperties
             bindings:
                loanCheckerProcessor|functionRouter-in-0:
                   destination: queue.pretty.log.messages
                   binder: local_rabbit
                   
                loanApprovedConsumer-in-0:
                   destination: load.approved
                   binder: local_rabbit
                loanDeclinedConsumer-in-0:
                   destination: load.declined
                   binder: local_rabbit
                   
                loanCheckerDecieder-in-0:
                   destination: queue.pretty.log.messages.222
                   binder: local_rabbit
                loanCheckerDecieder-out-0:
                   destination: queue.pretty.approved.messages
                   binder: local_rabbit
                loanCheckerConsumer-in-0:
                   destination: queue.pretty.approved.messages
                   binder: local_rabbit
             #BinderProperties
             binders:
                local_rabbit:
                   type: rabbit
                   environment:
                      spring:
                         rabbitmq:
                            host: 10.80.27.69
                            port: 5672
                            username: guest
                            password: guest
                            virtual-host: my-virtual-host
                            
                            
    logging:
       level:
          root: info
          org.springframework:
             cloud.function: debug
             #retry: debug


    LoanCheckConfiguration.java
    package com.paul.testspringcloudstream.loancheck.config;

    import java.util.function.Consumer;
    import java.util.function.Function;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.function.context.MessageRoutingCallback;
    import org.springframework.cloud.stream.function.StreamBridge;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.integration.support.MessageBuilder;
    import org.springframework.messaging.Message;

    import com.paul.testspringcloudstream.common.model.Loan;
    import com.paul.testspringcloudstream.common.model.Status;
    import com.paul.testspringcloudstream.loancheck.router.LoanCheckerRouter;
    import com.paul.testspringcloudstream.loancheck.service.LoanProcessor;
    import com.paul.testspringcloudstream.loancheck.service.LoanService;

    @Configuration
    public class LoanCheckConfiguration {
        
        private static final Logger log = LoggerFactory.getLogger(LoanCheckConfiguration.class);
        private static final Long MAX_AMOUNT = 10000L;
        private static final String LOG_PATTERN = "{} - {} {} for ${} for {}";
        
        @Autowired
        public void test(Consumer<Loan> loanCheckerConsumer) {
            log.info("{}", loanCheckerConsumer.getClass());
        }
        
        
        @Bean
        public Consumer<Loan> loanCheckerConsumer(){
            return loan -> 
                log.info(LOG_PATTERN, "loanCheckerConsumer", loan.getStatus(), loan.getUuid(), loan.getAmount(), loan.getName());
        }
        
        @Bean
        public Consumer<Loan> loanDeclinedConsumer(){
            return loan -> 
                log.info(LOG_PATTERN, "loanDeclinedConsumer", loan.getStatus(), loan.getUuid(), loan.getAmount(), loan.getName());
        }
        
        @Bean
        public Consumer<Loan> loanApprovedConsumer(){
            return loan -> 
                log.info(LOG_PATTERN, "loanApprovedConsumer", loan.getStatus(), loan.getUuid(), loan.getAmount(), loan.getName());
        }
        
        @Bean
        public MessageRoutingCallback loanCheckerRouter() {
            return new LoanCheckerRouter();
        }
        
        @Bean
        public Function<Loan, Loan> loanCheckerProcessor(
            LoanService loanService
        ){
            return loan -> loanService.check(loan);
        }
        
        @Bean
        public Function<Loan, Message<Loan>> loanCheckerProcessorBak(
            LoanService loanService
        ){
            return loan -> {
                Loan result = loanService.check(loan);
                String sendTo = Status.DECLINED.name().equals(result.getStatus()) ? 
                            LoanProcessor.DECLINED_OUT : LoanProcessor.APPROVED_OUT;
                
                return MessageBuilder.withPayload(result)
                            .setHeader("spring.cloud.stream.sendto.destination", sendTo)
                            .build();
            };
        }
        
        @Bean
        public Consumer<Loan> loanCheckerDecieder(StreamBridge streamBridge){
            return loan -> {
                log.info(LOG_PATTERN, "loanCheckerDecieder", loan.getStatus(), loan.getUuid(), loan.getAmount(), loan.getName());

                if (loan.getAmount() > MAX_AMOUNT) {
                    loan.setStatus(Status.DECLINED.name());
                    streamBridge.send(LoanProcessor.DECLINED_OUT, "local_rabbit", loan);
                } else {
                    loan.setStatus(Status.APPROVED.name());
                    streamBridge.send(LoanProcessor.APPROVED_OUT, "local_rabbit", loan);
                }

                log.info(LOG_PATTERN, "loanCheckerDecieder", loan.getStatus(), loan.getUuid(), loan.getAmount(), loan.getName());
            };
        }

    }


    LoanCheckerRouter.java,將路由條件統一在此處
    package com.paul.testspringcloudstream.loancheck.router;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.cloud.function.context.MessageRoutingCallback;
    import org.springframework.messaging.Message;

    import com.paul.testspringcloudstream.common.model.Loan;
    import com.paul.testspringcloudstream.common.model.Status;

    public class LoanCheckerRouter implements MessageRoutingCallback{
        
        private static final Logger log = LoggerFactory.getLogger(LoanCheckerRouter.class);

        @Override
        public String functionDefinition(Message<?> message) {
            
    //        byte[] resultByte = (byte[])message.getPayload();
    //        String resultString = new String(resultByte);
    //        
    //        return "loanDeclinedConsumer";
            
            Loan result = (Loan)message.getPayload();
            
            log.info("Loan status: {}", result.getStatus());
            
            return Status.DECLINED.name().equals(result.getStatus()) ? 
                        "loanDeclinedConsumer" : "loanApprovedConsumer";
        }

    }

    posted on 2021-11-15 14:46 paulwong 閱讀(309) 評論(0)  編輯  收藏 所屬分類: SPRING CLOUD

    主站蜘蛛池模板: av无码久久久久不卡免费网站| av无码东京热亚洲男人的天堂| 亚洲国产日韩在线人成下载| 女人18特级一级毛片免费视频| 一级看片免费视频囗交| 亚洲自偷自偷精品| 日韩高清在线免费看| 国产免费阿v精品视频网址| 亚洲а∨天堂久久精品9966| 亚洲综合另类小说色区色噜噜| 最近新韩国日本免费观看| 亚洲AV成人精品日韩一区| 亚洲国产精品高清久久久| 一个人在线观看视频免费| 国产99久久久久久免费看| 亚洲午夜一区二区三区| 亚洲国产精品无码久久久蜜芽 | 99久久免费国产精品特黄| 一级特黄a免费大片| 国产精品亚洲午夜一区二区三区| 中文字幕不卡亚洲 | 99久久精品国产免费| 无忧传媒视频免费观看入口| 亚洲日本视频在线观看| 亚洲色婷婷一区二区三区| 成人免费无码精品国产电影| **aaaaa毛片免费| a级毛片免费观看视频| 亚洲性线免费观看视频成熟 | 产传媒61国产免费| 亚洲色大成网站www| 亚洲四虎永久在线播放| 久久久久亚洲AV成人网人人软件| 精品久久久久久久免费加勒比| 91麻豆国产免费观看| 免费萌白酱国产一区二区三区| 免费国产黄网站在线看| 99亚洲男女激情在线观看| 亚洲色精品VR一区区三区| 亚洲最大的视频网站| 亚洲麻豆精品果冻传媒|