ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久riav二区三区,√新版天堂资源在线资源,国产中文字幕在线观看http://www.aygfsteel.com/paulwong/category/55385.htmlzh-cnTue, 23 Nov 2021 14:41:59 GMTTue, 23 Nov 2021 14:41:59 GMT60SPRING REACTOR 之Fluxå’ŒMonohttp://www.aygfsteel.com/paulwong/archive/2021/11/23/436063.htmlpaulwongpaulwongTue, 23 Nov 2021 06:30:00 GMThttp://www.aygfsteel.com/paulwong/archive/2021/11/23/436063.htmlhttp://www.aygfsteel.com/paulwong/comments/436063.htmlhttp://www.aygfsteel.com/paulwong/archive/2021/11/23/436063.html#Feedback0http://www.aygfsteel.com/paulwong/comments/commentRss/436063.htmlhttp://www.aygfsteel.com/paulwong/services/trackbacks/436063.htmlSPRING REACTOR 之Fluxå’ŒMonoåQŒæœ‰ç‚¹è±¡SPRING INTEGRATIONçš„IntegrationFlowåQŒæœ‰å¦‚下特点
  • 定义了针å¯ÒŽŸ¿U类型数æ®çš„处熋¹ç¨‹
  • å¯ä»¥˜q›è¡Œ¾cÕdž‹è½¬æ¢
  • 长期˜q行åQŒé™¤éžè¢«è¦æ±‚中止
  • ‹¹ç¨‹ä¸­çš„æ¯ç§æ“作å¯ä»¥åœ¨æ–°çš„线½E‹ä¸­æ‰§è¡Œ
  • å¯ä»¥æ­£å¸¸ä¸­æ­¢åQŒå¦‚果中途有异常åQŒåˆ™è¯¥æµ½E‹ä¹Ÿä¼šä¸­æ­?/li>
  • è¦subscribeåQŒæµ½E‹æ‰å¼€å§‹è¢«å¯åЍ
  • å¯ä»¥åˆ†å‰²æˆå„个孋¹ç¨‹
  • å¯ä»¥èšåˆå­æµ½E?/li>
  • Monoå‘é€ä¸€ä¸ªæ•°æ®ï¼Œž®±å‘é€ä¸­æ­¢ä¿¡å?/li>
  • Fluxå‘é€ä“Qæ„æ•°æ®ï¼Œç”Þq¨‹åºå†³å®šä½•æ—¶å‘é€ä¸­æ­¢ä¿¡å?/li>

¾~–程则比较简å•,先根æ®ä¸åŒçš„æ•°æ®¾cÕdž‹å®šä¹‰ä¸åŒçš„Flux或MonoåQŒä¸šåŠ¡æ“作用Function包装åŽï¼Œæ”‘Öœ¨map/flatmap中,å†è°ƒç”¨subscribeå¯åЍ‹¹ç¨‹ã€?/div>

]]>
EVEN DRIVEN - SPRING CLOUD STREAM - @PollableBean for Reactive Suppliershttp://www.aygfsteel.com/paulwong/archive/2021/11/23/436060.htmlpaulwongpaulwongTue, 23 Nov 2021 02:03:00 GMThttp://www.aygfsteel.com/paulwong/archive/2021/11/23/436060.htmlhttp://www.aygfsteel.com/paulwong/comments/436060.htmlhttp://www.aygfsteel.com/paulwong/archive/2021/11/23/436060.html#Feedback0http://www.aygfsteel.com/paulwong/comments/commentRss/436060.htmlhttp://www.aygfsteel.com/paulwong/services/trackbacks/436060.htmlSupplier beans, or functions that only publish messages in Spring Cloud Stream, are a bit special in that they aren't triggered by the receiving of events like Function or Consumer beans. This means that you often need a way to trigger them to be executed periodically.

For imperative functions the framework by default "polls" a Supplier function every 1 second, but that duration is configurable using the spring.cloud.stream.poller.fixed-delay property.

However, for reactive functions supplying a Flux it is only triggered once by default. This is because a Flux itself is potentially an infinite stream of events so in many cases it will only need to be triggered once. But don't worry, if you want to periodically trigger a reactive Supplier because you are producing a finite stream of events you can still do so using @PollableBean. This annotation then allows you to configure how often the function is triggered using the same spring.cloud.stream.poller.fixed-delay property!

One example use case here could be periodically querying a data store and publishing each entry/row as an event. The number of rows in your data store is a finite number at any given time.

Example code:

@PollableBean 
public Supplier<Flux<String>> stringSupplier() { return () -> Flux.just("foo","bar","baz"); }


Reference:
https://solace.community/discussion/360/pollablebean-for-reactive-suppliers-in-spring-cloud-stream

]]>
EVEN DRIVEN - SPRING CLOUD STREAM - 从éžSCS¾l„äšgå‘逿¶ˆæ¯åˆ°SCS¾l„äšghttp://www.aygfsteel.com/paulwong/archive/2021/11/19/436054.htmlpaulwongpaulwongFri, 19 Nov 2021 03:47:00 GMThttp://www.aygfsteel.com/paulwong/archive/2021/11/19/436054.htmlhttp://www.aygfsteel.com/paulwong/comments/436054.htmlhttp://www.aygfsteel.com/paulwong/archive/2021/11/19/436054.html#Feedback0http://www.aygfsteel.com/paulwong/comments/commentRss/436054.htmlhttp://www.aygfsteel.com/paulwong/services/trackbacks/436054.html
那么在SPRING CLOUD STREAM中,如果è¦ä»ŽéžSPRING CLOUD STREAM代ç å‘é€MESSAGE到SPRING CLOUD STREAM½E‹åºåQŒé€šå¸¸ž®Þp¦å…ˆé€šçŸ¥æ¡†æž¶è‡ªåŠ¨ç”Ÿæˆä¸€ä¸ªSOURCEã€?br />
application.property
spring.cloud.stream.source=supplier
spring.cloud.stream.bindings.supplier-out-0.destination=notification-events

java
streamBridge.send("supplier-out-0", userDto);

Reference:
https://blog.devgenius.io/event-driven-microservices-with-spring-cloud-stream-e034eee3f394


]]>
EVEN DRIVEN - SPRING CLOUD STREAM - Error Handlinghttp://www.aygfsteel.com/paulwong/archive/2021/11/17/436052.htmlpaulwongpaulwongWed, 17 Nov 2021 02:50:00 GMThttp://www.aygfsteel.com/paulwong/archive/2021/11/17/436052.htmlhttp://www.aygfsteel.com/paulwong/comments/436052.htmlhttp://www.aygfsteel.com/paulwong/archive/2021/11/17/436052.html#Feedback0http://www.aygfsteel.com/paulwong/comments/commentRss/436052.htmlhttp://www.aygfsteel.com/paulwong/services/trackbacks/436052.html
@ServiceActivator(inputChannel = "my-destination.my-group.errors")
    public void handleError(ErrorMessage message) {
        Throwable throwable = message.getPayload();
        log.error("截获异常", throwable);

        Message<?> originalMessage = message.getOriginalMessage();
        assert originalMessage != null;

        log.info("原始消æ¯ä½?nbsp;= {}", new String((byte[]) originalMessage.getPayload()));
    }

详情å‚考:
https://www.itmuch.com/spring-cloud/spring-cloud-stream-error-handling/

]]>
EVEN DRIVEN - SPRING CLOUD STREAM - Function Componenthttp://www.aygfsteel.com/paulwong/archive/2021/11/15/436051.htmlpaulwongpaulwongMon, 15 Nov 2021 09:40:00 GMThttp://www.aygfsteel.com/paulwong/archive/2021/11/15/436051.htmlhttp://www.aygfsteel.com/paulwong/comments/436051.htmlhttp://www.aygfsteel.com/paulwong/archive/2021/11/15/436051.html#Feedback0http://www.aygfsteel.com/paulwong/comments/commentRss/436051.htmlhttp://www.aygfsteel.com/paulwong/services/trackbacks/436051.html
¾l„äšg地å€åQ?br />https://github.com/spring-cloud/stream-applications/tree/main/functions

ç‰Òޮоl„äšgåQŒå°†FUNCTIONå˜æˆHTTP ENDPOINTSåQ?br />https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-starter-function-web
https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-starter-function-webflux



]]>
EVEN DRIVEN - SPRING CLOUD STREAM 3.x - Functional Programming Modelhttp://www.aygfsteel.com/paulwong/archive/2021/11/10/436035.htmlpaulwongpaulwongWed, 10 Nov 2021 07:10:00 GMThttp://www.aygfsteel.com/paulwong/archive/2021/11/10/436035.htmlhttp://www.aygfsteel.com/paulwong/comments/436035.htmlhttp://www.aygfsteel.com/paulwong/archive/2021/11/10/436035.html#Feedback0http://www.aygfsteel.com/paulwong/comments/commentRss/436035.htmlhttp://www.aygfsteel.com/paulwong/services/trackbacks/436035.htmlSPRING CLOUD STREAM 3.x ç‰ˆæœ¬æ—Óž¼Œä¹‹å‰çš„一些编½E‹æ¨¡å¼ï¼Œå¦‚@EnablebinddingåQŒ@StreamListenner½{‰æ³¨é‡Šè¢«åºŸå¼ƒäº†ï¼Œ˜q™æ˜¯ç”׃ºŽä¸€äº›æ¡†æž¶çš„代ç å¿…需ç”Þq”¨æˆïL¼–写,如酾|®æ¡†æž¶ç”¨çš„Input MessageChannelåQŒOutput  MessageChannelåQŒè¿žæŽ¥MessageHandler与MessageChannel½{‰ï¼Œè¢«è§†ä¸ÞZ¸å¿…è¦çš„åŠ¨ä½œã€‚äØ“äº†ç®€åŒ–ç”¨æˆ·ä»£ç ï¼ŒäºŽæ˜¯æŽ¨å‡ºFunctional Programming Modelã€?br />
引入了新åè¯åQšSupplierã€Function与Consumer。实际上˜q™å‡ ä¸ªç±»å¯è§†ä¸ºAdapteråQŒå¦‚果之å‰å·²¾l有存在的Service¾c»ï¼Œä¸”方法å为儿U儿 øP¼Œå¯ä»¥é‡æ–°åŒ…装æˆSupplierã€Function与ConsumeråQŒåƈ在固定的æ–ÒŽ³•å:apply/get/accept中调用Service的方法ã€?br />

Supplier

当在é…置文äšg中注入此¾cÕdž‹çš„BeanåQŒåƈ在spring.cloud.stream.function.definition加入此Beançš„å¿UŽÍ¼ŒSPRING CLOUD STREAMž®×ƒ¼šå¸®ä½ ç”Ÿæˆä¸€ä¸ªOutput  MessageChannelåQŒåƈ˜qžæŽ¥ä¸Šæ­¤BeanåQŒå޾l­åªéœ€è¦åœ¨BINDDING中加入对应的Destination NameåQŒå³å¯å‘BROKER呿¶ˆæ¯äº†ã€?br />

Consumer

当在é…置文äšg中注入此¾cÕdž‹çš„BeanåQŒåƈ在spring.cloud.stream.function.definition加入此Beançš„å¿UŽÍ¼ŒSPRING CLOUD STREAMž®×ƒ¼šå¸®ä½ ç”Ÿæˆä¸€ä¸ªInput  MessageChannelåQŒåƈ˜qžæŽ¥ä¸Šæ­¤BeanåQŒå޾l­åªéœ€è¦åœ¨BINDDING中加入对应的Destination NameåQŒå³å¯æ”¶åˆ°BROKER推é€å…³äºŽæ­¤Destination的消æ¯äº†ã€?br />

Function

当在é…置文äšg中注入此¾cÕdž‹çš„BeanåQŒåƈ在spring.cloud.stream.function.definition加入此Beançš„å¿UŽÍ¼ŒSPRING CLOUD STREAMž®×ƒ¼šå¸®ä½ ç”Ÿæˆä¸€ä¸ªInputå’ŒOutput  MessageChannelåQŒåƈ˜qžæŽ¥ä¸Šæ­¤BeanåQŒå޾l­åªéœ€è¦åœ¨BINDDING中分别对Inputå’ŒOutput MessageChannel加入对应的Destination Name1/Name2åQŒå³å¯æ”¶åˆ°BROKER推é€å…³äºŽæ­¤Destination的消æ¯ï¼Œä¹Ÿå¯ä»¥å‘BROKER呿¶ˆæ¯äº†ã€?br />

与SPRING INTEGRATION的整å?/h2>如果è¦å¯¹æ¶ˆæ¯˜q›è¡Œå¤æ‚处ç†åQŒå¦‚拆分消æ¯ã€èšåˆæ¶ˆæ¯ã€IF ELSE消毽{‰ï¼Œž®Þp¦å€ŸåŠ©SPRING INTEGRATION了ã€?br />
@Bean
    public IntegrationFlow upperCaseFlow(LoanService loanService) {
        return IntegrationFlows
                    //turn this IntegrationFlow as a gateway, here is a Function interface 
                    
//with loadCheckerFunction as bean name
                    .from(LoadCheckerFunction.class, gateway -> gateway.beanName("loadCheckerFunction"))
                    .handle(loanService, "check")
                    .logAndReply(LoggingHandler.Level.WARN);
    }

    public interface LoadCheckerFunction extends Function<Loan, Loan>{

    }

IntegrationFlows.from(Class<?> serviceInterface)是å¯ä»¥å°†æœ¬IntegrationFlow包装æˆserviceInterface的实现类åQŒå¦‚果调用此接å£åQŒæœ€¾lˆä¼š˜q”回IntegrationFlow最åŽä¸€ä¸ªæ­¥éª¤çš„实体åQŒå¦‚果这个serviceInterface是Functionçš„è¯åQŒåˆšå¥½å’ŒSPRING CLOUD STREAMå¯ÒŽŽ¥ä¸Šã€?br />
åŽç®‹åœ¨spring.cloud.stream.function.definition加入此Beançš„å¿U°loadCheckerFunctionåQŒSPRING CLOUD STREAMž®×ƒ¼šå¸®ä½ ç”Ÿæˆä¸€ä¸ªInputå’ŒOutput  MessageChannelåQŒåƈ˜qžæŽ¥ä¸Šæ­¤BeanåQŒå†åœ¨BINDDING中分别对Inputå’ŒOutput MessageChannel加入对应的Destination Name1/Name2åQŒå³å¯æ”¶åˆ°BROKER推é€å…³äºŽæ­¤Destination的消æ¯ï¼Œä¹Ÿå¯ä»¥å‘BROKER呿¶ˆæ¯ã€?br />
application.yaml
# This setting can increase or decrease the rate of message production (1000 = 1s)
# spring.cloud.stream.poller.fixed-delay=1000

# 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:
      stream:
         function.definition: loadCheckerFunction
         #BindingProperties
         bindings:
            loadCheckerFunction-in-0:
               destination: queue.pretty.log.messages
               binder: local_rabbit
            loadCheckerFunction-out-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

Reference

https://spring.io/blog/2019/10/25/spring-cloud-stream-and-spring-integration

]]>
EVEN DRIVEN - SPRING CLOUD STREAM - SPRING CLOUDå¾®æœåŠ¡çš„EVEN DRIVEN框架http://www.aygfsteel.com/paulwong/archive/2021/11/05/436031.htmlpaulwongpaulwongFri, 05 Nov 2021 06:58:00 GMThttp://www.aygfsteel.com/paulwong/archive/2021/11/05/436031.htmlhttp://www.aygfsteel.com/paulwong/comments/436031.htmlhttp://www.aygfsteel.com/paulwong/archive/2021/11/05/436031.html#Feedback0http://www.aygfsteel.com/paulwong/comments/commentRss/436031.htmlhttp://www.aygfsteel.com/paulwong/services/trackbacks/436031.html
å³Aå¾®æœåŠ¡åº”ç”¨å°†æ•°æ®å‘é€åˆ°MESSAGE BROKER中的æŸä¸ªDESTINATIONåQŒæ­¤DESTINATION是广播型åQŒéžç‚¹å¯¹ç‚¹åž‹ã€‚Bå¾®æœåŠ¡åº”ç”¨è®¢é˜…æ­¤DESTINATIONåQŒå½“有新MESSAGE到达此DESTINATIONæ—Óž¼ŒMESSAGE BROKER会将此MESSAGE推é€ç»™B应用。所有对此MESSAGE有需è¦çš„应用å‡å¯è®¢é˜…åQŒä»Žè€Œæ”¶åˆ°æ­¤MESSAGEã€?br />
SPRING CLOUD ä¸­EVENT DRIVEN的框架就是SPRING CLOUD STREAM。其底层是ä‹É用SPRING INTEGRATION实现ã€?br />
SPRING CLOUD STREAM有以下新åè¯åQ?br />
  • BINDERåQ?/li>
是对MESSAGE BROKERæ“作æ–ÒŽ³•的抽象,å›_º”用通过此BINDERæ“作MESSAGE BROKER。目å‰åªå®žçŽ°äº†RABITMQå’ŒKAFKAã€?br />
  • CHANNEL
MESSAGE从SPRING CLOUD STREAMä¼ ç»™åº”ç”¨æˆ–ç›¸åæ˜¯é€šè¿‡CHANNEL传递的åQŒè¿™ç‚¹å’ŒSPRING INTEGRATION是一æ ïLš„ã€?br />
  • SOURCE
MESSAGE从应用传¾l™SPRING CLOUD STREAMçš„CHANNELåQŒå«@INPUTåQŒåŒ…å«è¿™¿UCHANNEL的接å£å«SOURCEã€?br />
  • SINK
MESSAGE从SPRING CLOUD STREAM传给应用的CHANNELåQŒå«@OUPUTåQŒåŒ…å«è¿™¿UCHANNEL的接å£å«SINKã€?br />
  • BIDDING
¾l‘定哪个@INPUT或哪个@OUPUT与哪个DESTINATIONå‘逿ˆ–接收关系的MAPPINGã€?br />
  • EnableBinding
应用å¯åŠ¨æ—¶å°±ä¼šå¾ç«‹EnableBinding指定的接å£ä¸­çš„CHANNEL
  • 消费者群¾l?/li>
默认下如果åŒä¸€ä¸ªåº”用部¾|²äº†å¤šä¸ªå®žä¾‹åQŒåˆ™æ¯ä¸ªå®žä¾‹éƒ½ä¼šæ”¶åˆ°MESSAGEåQŒè¿™æ—¶å¦‚果设¾|®äº†æ¶ˆè´¹è€…群¾l„å¿UŽÍ¼Œåˆ™åŒä¸€ä¸ªå¿UîC¸‹çš„å¤šä¸ªå®žä¾‹ï¼Œåªæœ‰ä¸€ä¸ªèƒ½æ”¶åˆ°MESSAGEã€?br />
  • PARTITION
如果为MESSAGE指定规则åQŒå¦‚MESSAGEæŸä¸ªå­—段å€ég»¥Aå¼€å¤´äØ“ä¸€ä¸ªè§„åˆ™ï¼Œä»¥Bå¼€å¤´äØ“ä¸€ä¸ªè§„åˆ™ï¼Œé‚£ä¹ˆä»¥A开头的MESSAGE会放到åŒä¸€ä¸ªåˆ†åŒÞZ¸­ã€?br />
˜q™æ ·ä½¿ç”¨ž®±å¾ˆ½Ž€å•了åQŒåªè¦å–å¾—OUTPUT CHANNELåQŒå°±å¯ä»¥å‘é€MESSAGEåQŒå°†ä»£ç å…Œ™”到INPUT CHANNELåQŒå°±èƒ½åœ¨æ”¶åˆ°MESSAGEæ—Óž¼Œç›¸å…³ä»£ç ž®×ƒ¼šè¢«æ‰§è¡Œã€?br />


]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º Á¬Æ½ÏØ| ä¬ÄÏÊÐ| Ó¢¼ªÉ³ÏØ| ½ðƽ| ÌúÁëÊÐ| ¸ÊËàÊ¡| ÄÏ¿µÊÐ| °ÍÑåÏØ| ÉîÔóÏØ| ¾Å½­ÊÐ| ÇɼÒÏØ| ³»ÖÝÊÐ| ˼éÊÐ| ãå´¨ÏØ| ÎâÖÒÊÐ| Áúʤ| ÒÁ´ºÊÐ| ƽ¶ÈÊÐ| ¶«¸ÛÊÐ| °ÍÑåÏØ| ×ÛÒÕ| ÍÐÀïÏØ| IJ¶¨ÏØ| ¹²ºÍÏØ| ºìÔ­ÏØ| ½­±±Çø| ÄáÀÕ¿ËÏØ| ÓÜÖÐÏØ| µç°×ÏØ| ËÉ×ÌÊÐ| ËïÎâÏØ| ÒæÑôÊÐ| ÔúÂ³ÌØÆì| Àè³ÇÏØ| ÷ÖÝÊÐ| ¡»¯ÏØ| ¸Ê×ÎÏØ| ²ìÓçÏØ| ÉòÑôÊÐ| ³çÃ÷ÏØ| ·ð¸ÔÏØ|