美文网首页
个人实现的某项目技术盘点(java方向)

个人实现的某项目技术盘点(java方向)

作者: 筱书专栏 | 来源:发表于2019-02-22 14:47 被阅读0次

    整体架构

    overall.png

    执行流程

    process.png

    定时任务和执行引擎

    • 针对单个线程,将HttpClient修改成单例。
    • 针对多线程采用ThreadLocal拷贝HttpClient实例。
    • 在做耗时较长(相对而言)的Http请求交互的时候,重新生成一个httpClient对象,而不是用类变量httpclient进行管理一个线程的所有http请求。
    • 数据表更新操作采用异步方法。

    代码样例

    • 定时线程池

      @Bean
      public ScheduledExecutorFactoryBean suiteExecutorFactoryBean() {
          ScheduledExecutorFactoryBean executorFactoryBean = new ScheduledExecutorFactoryBean();
          executorFactoryBean.setThreadNamePrefix("monitor_thread_pool");
          executorFactoryBean.setPoolSize(10);
          return executorFactoryBean;
      }
      

    • 类静态变量HttpClient

      private static ThreadLocal<CloseableHttpClient> httpClient = new ThreadLocal<CloseableHttpClient>() {
      
              @Override
              public CloseableHttpClient initialValue() {
                  RequestConfig config = RequestConfig.custom()
                          .setSocketTimeout(10000)
                          .setConnectTimeout(10000)
                          .build();
      
                  PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
                  cm.setMaxTotal(200);
                  cm.setDefaultMaxPerRoute(100);
      
                  HttpClientBuilder builder = HttpClients.custom();
                  builder.setDefaultRequestConfig(config).setConnectionManager(cm);
                  return builder.build();
              }
          };
      
      

    • 重试机制

      // 如果重试,新建httpClient
      if (isRetry) {
          httpClientInstance = createHttpClient();
      } else {
          httpClientInstance = httpClient.get();
      }
      

    • 异步方式更新数据表

      // 使用异步方式更新数据表
      final int finalResultCode = resultCode;
      final String finalOptResponseBody = finalResponseBody;
      final int finalFailedTime = failedTime;
      
      scheduledExecutorService.submit(new Runnable() {
          @Override
          public void run() {
              //最后更新服务接口表
              service.setState(finalResultCode);
              service.setResponseBody(finalOptResponseBody);
              service.setSampleTime(new Date());
              service.setFailedTime(finalFailedTime);
              serviceDao.save(service);
          }
      });
      

    相关文章

      网友评论

          本文标题:个人实现的某项目技术盘点(java方向)

          本文链接:https://www.haomeiwen.com/subject/hwreyqtx.html