<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 閱讀(314) 評論(0)  編輯  收藏 所屬分類: SPRING CLOUD

    主站蜘蛛池模板: 亚洲人成人77777在线播放| 日韩国产精品亚洲а∨天堂免| 日本高清高色视频免费| 亚洲综合男人的天堂色婷婷| 毛片免费观看网址| 黄页网址大全免费观看12网站| 亚洲国产精品无码AAA片| 亚洲欧美日韩国产精品一区| 四虎永久免费地址在线观看| 亚洲精品成a人在线观看夫| 国产亚洲AV手机在线观看| 四虎在线视频免费观看视频| 黄色a三级三级三级免费看| 99ri精品国产亚洲| 亚洲精品国产福利一二区| 国产成人精品免费午夜app | 亚洲精品色在线网站| 亚洲va久久久噜噜噜久久天堂| 免费无码又爽又刺激网站直播 | 精品在线免费观看| 亚洲国产成人无码AV在线| 亚洲福利在线视频| 亚洲AV无码一区二三区| 成年黄网站色大免费全看| 国产一级一毛免费黄片| 亚洲av无码专区首页| 亚洲精品午夜视频| 亚洲一区二区三区AV无码| 国产精品久久免费视频| 老司机午夜在线视频免费| 亚洲成av人片不卡无码| 亚洲人成色7777在线观看| 四虎AV永久在线精品免费观看| 久草视频免费在线观看| 可以免费观看的毛片| 一级做a爰片性色毛片免费网站| 亚洲综合激情五月色一区| 亚洲国产电影av在线网址| 精品熟女少妇AV免费观看| 一区二区三区观看免费中文视频在线播放 | 亚洲精品成a人在线观看☆|