Callable <t> call()+输入参数+ Spring </t>

时间:2015-03-24 07:54:33

标签: java multithreading spring jsp

我正在努力解决以下问题:

  1. 该类是通过Spring构建的
  2. 它实现了由两个方法(进程,关闭)
  3. 组成的接口
  4. 它还实现了Callable
  5. 问题: process()返回一个Type并在call()内部调用,问题是该进程有call()签名不允许的输入参数。所以我提到了这个问题:Is there a way to take an argument in a callable method?,遗憾的是,由于我的对象是通过Spring构建的,因此我无法为我工作,从JSP调用process()并且输入参数是可变的,具体取决于用户操作

    将包含一些代码以供澄清,如下:

    public class MyClass implements MyClassInterface, Callable<Results> {
    
       private String fileLocation;
       private final SMTPMailer smtpMalier;
    
       public MyClass(String fileLocation, SMTPMailer smtpMalier) {
          this.fileLocation = fileLocation;
          this.smtpMalier = smtpMalier;
       }
    
       public Results call() {
          // to return process(arg1, arg2) here, need to cater for input parameters
       }
    
       public Results process(String arg1, String arg2) {
          // does some proceeding, returns Results
       }
    
       public void shutdown() {
          // shut down implementation
       }
    }
    

    我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

简短的回答是,你不能。 Callable的合同是它可以在没有任何输入的情况下执行操作。 如果需要参数,则不是Callable

您需要考虑如何调用代码。我假设你有这样的代码:

AsyncTaskExecutor executor = ...;
MyClass theService = ...;
String foo = "apple", bar = "banana";
Future<Results> result = executor.submit(theService); // Needs foo and bar :(

简单的解决方案是,不要在Callable中实施MyClass不能可调,它需要一些输入参数!实现Callable代替它,例如你拥有所有参数:

AsyncTaskExecutor executor = ...;
MyClass theService = ...;
String foo = "apple", bar = "banana";
Future<Results> result = executor.submit(new Callable<Results>(){
    @Override public Results call(){
        return theService.process(foo, bar);
    }
});
// Or if you're on Java 8:
Future<Results> result = executor.submit(() -> theService.process(foo, bar);

如果这种情况发生了很多,并且你真的真的希望课程为你提供Callable,你可以给它一个工厂方法:

public class MyClass implements MyClassInterface {
   public Results process(String arg1, String arg2) {
      // does some proceeding, returns Results
   }
   public Callable<Results> bind(String arg1, String arg2) {
      return () -> process(arg1, arg2);
   }
   // Other methods omitted
}