1

POST エンドポイントを持つスプリング ブート API アプリケーションがあります。メソッドとして /doSomething と呼びましょう。そのリクエストでは、API [B] から取得する必要があり、API [B] に再度投稿する必要があります。その場合、スプリングの再試行を処理する最良の方法は何ですか。

以下のコードを見つけてください

@RequestMapping(value = "/subpub", method = RequestMethod.POST, headers = {"content-type=application/x-www-form-urlencoded"})
    public String subPub(HttpServletRequest request, HttpServletResponse response, @RequestBody String rawBody) {
    //persists some data on this database

    //this method will invoke api[A] and api[B]
    integrationServiceBean.processCourseMetaData("_id");
    return "OK"
}; 

IntegrationServiceBean クラス

package com.org.reader.integration;

@Service
public class IntegrationServiceBean {


    /**
     * This method will process meta data submission for  
     * section details by section id and update meta data
     *
     * @param sectionId
     */
    @Retryable(RuntimeException.class)
    public void processCourseMetaData(final String sectionId) {

        System.out.println("Invoking processCourseMetaData");

        ResponseEntity<String> responseEntity = registrarService.findOneSection(sectionId);
        String responseBody = responseEntity.getBody();

        LinkedHashMap requestObj = (LinkedHashMap) JsonUtils.jsonToObject(responseBody);
        LinkedHashMap metaDataObj = (LinkedHashMap) requestObj.get(Constant.Response.META_DATA);
        if (!contextConfig.getMetaDataCopyable().isEmpty()) {

            metaDataObj.put(Constant.MetaData.COPYABLE, contextConfig.getMetaDataCopyable());
        }
        if (!contextConfig.getMetaDataPending().isEmpty()) {

            metaDataObj.put(Constant.MetaData.PENDING, contextConfig.getMetaDataPending());
        }
        metaDataObj.put(Constant.MetaData.LAUNCH_URL, getLaunchUrlByEnvironment(requestObj, sectionId));

        String updatedSectionPayload = JsonUtils.toJsonString(requestObj);

        registrarService.updateSection(sectionId, updatedSectionPayload);
    }

    @Recover
    public void recover(RuntimeException e){
        System.out.println("Recovering - returning safe value"+e.getMessage());

    }



}

私の問題は、統合サービス Bean に再試行が適用された場合、アプリケーションの主要部分のパフォーマンスに影響を与えることです。

そして、ベストプラクティスは何でしょうか

4

1 に答える 1

2

タグ付けされたメソッド@Retryableは、現在実行中のスレッドをブロックすることにより、別のスレッドで呼び出されます。

コードの見通しに関しては、

保存はスレッド (スレッド A など) で行われ、統合サービスは他のスレッド (スレッド B など) で処理されています。したがって、スレッド A は、B が終了するまでブロックされます。そのため、次の行はintegrationServiceBean.processCourseMetaData("_id");、成功または再試行 limit の使い果たされて終了するまでブロックされます。

あなたの質問に来ます。

データの保存はそのままです。したがって、パフォーマンスに影響はないと思います。

ベストプラクティスについて話す

サービス間にネットワーク パーティションがある場合は常に、再試行を使用することをお勧めします。アプリケーションを堅牢にします。

于 2016-11-21T11:08:27.447 に答える