当前位置: 首页 > 面试题库 >

RestTemplate应该是静态全局声明的吗?

景轶
2023-03-14
问题内容

我在代码中使用Java Callable Future。以下是我使用future和callables的主要代码-

public class TimeoutThread {

    public static void main(String[] args) throws Exception {

        ExecutorService executor = Executors.newFixedThreadPool(5);
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

下面是我的Task类,该类实现Callable接口,我需要根据所拥有的主机名生成URL,然后使用调用SERVERS RestTemplate。如果第一个主机名中有任何异常,那么我将为另一个主机名生成URL,然后尝试拨打电话。

class Task implements Callable<String> {
    private static RestTemplate restTemplate = new RestTemplate();

    @Override
    public String call() throws Exception {

    //.. some code

    for(String hostname : hostnames)  {
            if(hostname == null) {
                continue;
            }
            try {
                String url = generateURL(hostname);         
                response = restTemplate.getForObject(url, String.class);

                // make a response and then break
                break;

            } catch (Exception ex) {
                ex.printStackTrace(); // use logger
            }
        }
    }
}

所以我的问题应该声明RestTemplate为静态全局变量吗?还是在这种情况下不应该是静态的?


问题答案:

无论是哪种方式,static还是实例都没有关系。

RestTemplate的发出HTTP请求的方法是线程安全的,因此与RestTemplate每个Task实例是否拥有一个实例还是所有Task实例都具有共享实例无关(垃圾回收除外)。

就个人而言,我将创建RestTemplate外部Task类并将其作为参数传递给Task构造函数。(尽可能使用控制反转。)



 类似资料:
  • 问题内容: 杰克逊图书馆的班级似乎是线程安全的。 这是否意味着我应该像这样将我声明为静态字段? 而不是像这样的实例级字段? 问题答案: 是的,建议您这样做是安全的。 您所引用页面的唯一警告是,共享器一旦被共享便无法修改。但您不更改配置,这样就可以了。如果确实需要更改配置,则可以从静态块执行此操作,也可以。 编辑 :(2013/10) 在2.0及更高版本中,可以通过注意到还有一种更好的方法来增强上述

  • 问题内容: 我已经多次遇到这个问题,而且我从不费心去了解它为什么会发生,并了解“静态”的实际含义。我只是应用了Eclipse建议的更改并继续进行。 蚀告诉我要做,但我不确定为什么。那么“静态”到底是什么,它是如何使用的,使用“静态”的目的是什么,为什么它给了我这个问题? 问题答案: 这是您的示例: 该方法是与该类关联的静态方法。它没有与的实例相关联,因此它无法访问与的实例相关联的变量。解决方案 不

  • 问题内容: 我刚刚在一些我未编写的代码中发现了一个错误,我对此感到有些惊讶: 尽管该代码在输入数据上失败了很多 _(因为它试图以17.01.2011格式查找日期并返回诸如10396/2011之类的东西,然后由于无法解析日期而崩溃,但这 确实是错误 的)这个问题的重点;)_我想知道: Pattern.compile 的要点之一不是要进行速度优化(通过预编译正则表达式)? 难道不是所有的“静态”模式都

  • 问题内容: 我正在编写一个小程序,以有序的方式定时显示我的Rubik立方体解。但是Python(3)一直困扰着我关于全局声明之前使用时间的困扰。但是奇怪的是,它在开始时就声明为(是,是列表),然后在函数(他抱怨的地方)中再次声明为,并使用对其进行“全局”处理。这是我的代码,因此您可以根据需要进行分析: 任何帮助将不胜感激,因为我是Python世界的新手:) 问题答案: 全局声明是当你声明是 如果声

  • 我有困难建立一个有3个类的结构。我不确定包含/转发声明。 下面的代码一直在编译,直到我在inclino.h中添加名称空间和枚举。我从Inclinomeasure.h收到“Inclino尚未声明”。 倾斜度。h 倾斜度 倾角读数.h 结构正确吗?如何访问其他类中的枚举? 提前道谢。 编辑:我修复了名称空间的问题,把它放在一个新的文件,包括由3类。但我似乎误用了include/forward声明。

  • 问题内容: 我有一个快速的问题。在静态关键字声明之后立即开始的代码块,那是什么类型的方法?我从未见过。如果有人能启发我,将不胜感激。谢谢。 问题答案: 这不是方法,而是类的静态Initializer块。您可以在Java Language Specification中 阅读有关它的更多信息。 加载该类后,其中的代码将执行一次。