<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

    主站蜘蛛池模板: 国产一区二区三区在线观看免费| 久久精品国产亚洲7777| 日韩视频在线免费| 在线免费观看一级毛片| 精品国产亚洲男女在线线电影| 亚洲高清资源在线观看| 欧洲 亚洲 国产图片综合| 国产精品亚洲专区无码不卡| 韩国免费a级作爱片无码| 男男AV纯肉无码免费播放无码| 亚洲日本va午夜中文字幕久久 | 亚洲日本在线免费观看| 亚洲国产精品成人久久蜜臀| 亚洲国产精品综合久久久| 一个人看的免费高清视频日本| 免费国产黄网站在线观看视频| 吃奶摸下高潮60分钟免费视频 | 亚洲AV永久青草无码精品| 亚洲久热无码av中文字幕| 最近2019中文字幕免费大全5 | 亚洲AV无码国产精品色| 免费成人在线视频观看| 久久亚洲国产精品五月天婷| 久久精品国产亚洲AV天海翼| 国产福利在线免费| 亚洲婷婷在线视频| 亚州免费一级毛片| 亚洲国产精品无码AAA片| 精品一区二区三区高清免费观看| 又粗又大又猛又爽免费视频| 亚洲成av人无码亚洲成av人| 免费国产黄线在线观看| 亚洲av片不卡无码久久| 啦啦啦中文在线观看电视剧免费版| 亚洲最大黄色网址| 免费黄色网址入口| 国产高潮久久免费观看| 久久亚洲免费视频| 最近免费中文字幕大全视频| 亚洲第一综合天堂另类专 | 亚洲一区二区三区久久久久|