Node-red에서 API를 호출 할 때 Retry 처리 (디자인 패턴?)

배경



Node-red로 외부의 API를 호출하는 것이 좋지만, 그 때 상대가 만일 떨어졌을 때에 속공 실패로 하는 것은 싫기 때문에, 만약을 위해 루프시키고 있습니다.
(별로 안 좋았던 적은 없지만)

거기서 사용하고 있는 루프 처리를 노출해 둡니다.

해설





set loop params



루프의 매개 변수를 지정합니다.
delay 는 밀리 세컨드로 지정해, _retryCounter 는 망마입니다. _okStatusCode 는 API 반환값이 msg.StatusCode 에 들어 있다고 가정하고, 그 값이 무엇이라면 Loop 를 Exit 하는지의 값입니다.

something



원하는 API 처리를 돌진하십시오.

loop/timeout




첫 번째 Switch에서 StatusCode를 체크, NG이면 카운터 줄이고, 두 번째 Switch에서 카운터가 남아 있으면 지정 초 수 Wait, 안 된다면 Exit합니다.

그 후의 OK와 ERROR는 단순한 상자이므로 자유롭게 사용하십시오.

소스 코드


[{"id":"2618b143.9cc716","type":"subflow","name":"loop/timeout","info":"入力項目:  \n  \nmsg._retryCounter  \n  as number\n  ex: 60 (times)\n  \nmsg.delay\n  as number  \n  ex: 10000 (msec)  \n  defalut, 10000(msec)  \n  \nmsg._okStatusCode  \n  as number  \n  ex: 201  \n  describe OK case's http statusCode.  \n  ","category":"","in":[{"x":620,"y":440,"wires":[{"id":"54c8269a.b1e168"}]}],"out":[{"x":880,"y":440,"wires":[{"id":"54c8269a.b1e168","port":0}]},{"x":880,"y":540,"wires":[{"id":"1fc0dbfa.0f2f2c","port":0}]},{"x":820,"y":600,"wires":[{"id":"931d7748.7ebc08","port":1}]}],"outputLabels":["OK","loop","Error"]},{"id":"54c8269a.b1e168","type":"switch","z":"2618b143.9cc716","name":"","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"_okStatusCode","vt":"msg"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":750,"y":440,"wires":[[],["2fffc6ea.8f29c2"]]},{"id":"2fffc6ea.8f29c2","type":"change","z":"2618b143.9cc716","name":"counter -1","rules":[{"t":"set","p":"_retryCounter","pt":"msg","to":"$._retryCounter - 1","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":540,"wires":[["931d7748.7ebc08"]]},{"id":"1fc0dbfa.0f2f2c","type":"delay","z":"2618b143.9cc716","name":"","pauseType":"delayv","timeout":"10","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":740,"y":540,"wires":[[]]},{"id":"931d7748.7ebc08","type":"switch","z":"2618b143.9cc716","name":"","property":"_retryCounter","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"},{"t":"lte","v":"0","vt":"str"}],"checkall":"false","repair":false,"outputs":2,"x":690,"y":600,"wires":[["1fc0dbfa.0f2f2c"],[]]},{"id":"2acfbeec.b22cf2","type":"change","z":"c94f016c.b5bd3","name":"set loop params","rules":[{"t":"set","p":"_retryCounter","pt":"msg","to":"60","tot":"num"},{"t":"set","p":"delay","pt":"msg","to":"2000","tot":"num"},{"t":"set","p":"_okStatusCode","pt":"msg","to":"201","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":240,"y":700,"wires":[["84a18249.cfe4"]]},{"id":"84a18249.cfe4","type":"function","z":"c94f016c.b5bd3","name":"something","func":"//something\nreturn msg;","outputs":1,"noerr":0,"x":430,"y":700,"wires":[["637a965d.e919d8"]]},{"id":"637a965d.e919d8","type":"subflow:2618b143.9cc716","z":"c94f016c.b5bd3","name":"","x":590,"y":700,"wires":[["43eb1be0.83e32c"],["84a18249.cfe4"],["2815559a.5e347a"]]},{"id":"2815559a.5e347a","type":"function","z":"c94f016c.b5bd3","name":"error","func":"\nreturn msg;","outputs":1,"noerr":0,"x":750,"y":720,"wires":[[]]},{"id":"43eb1be0.83e32c","type":"function","z":"c94f016c.b5bd3","name":"OK","func":"\nreturn msg;","outputs":1,"noerr":0,"x":750,"y":680,"wires":[[]]}]

기타



Exit는 Loop가 횟수 넘으면만 하고 있습니다만, StatusCode가 특정의 내용이면 곧바로 Error 처리한다고 하는 것을 넣어도 좋다고 생각합니다.

이상



뭔가 있으면 돌진해 주시면 기쁩니다.
감사합니다.

좋은 웹페이지 즐겨찾기