Вызываемый <T> вызов () + Входные параметры + Spring

1

Я борюсь со следующим:

  1. Класс построен по весне
  2. Он реализует интерфейс, состоящий из двух методов (процесс, выключение)
  3. Он также реализует Callable

Проблема: process() возвращает тип и вызывается внутри вызова(), проблема в том, что процесс имеет входные параметры, которые не разрешают вызов(). Поэтому я сослался на этот вопрос: есть ли способ принять аргумент в вызываемом методе? , к сожалению, это не сработает для меня, поскольку мой объект, построенный через Spring, process() вызывается из JSP, а входные параметры являются переменными, в зависимости от действия пользователя.

Будет включать некоторый код для разъяснения, ниже:

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
   }
}

Как я могу обойти это?

  • 0
    Было бы лучше, если вы поделитесь с нами, вы используете его. С другой стороны, почему бы просто не вызывать process так как это public метод?
  • 0
    Это текущая реализация, но мне нужно, чтобы MyClass был работоспособным и принимал входные параметры.
Теги:
jsp
multithreading
spring

1 ответ

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 s, вы могли бы дать ему фабричный метод:

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
}
  • 0
    Второй вариант звучит более актуально в моей ситуации, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню