Как я могу сделать поток класса Java Spring Component безопасным? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть весенний класс, который, когда вы вызываете httpDatastoreFacade.getDatastore(), должен выдать вам хранилище данных потока запросов REST:

@Component
public class HttpDatastoreFacade {
  private Boolean useAttribute = Boolean.FALSE;

  public String getDatastore() {
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextholder.currentRequestAttributes()).getRequest();
    String datastore = request.getParameter("datastore");

    if(useAttribute) {
      datastore = String.valueOf(request.getAttribute("datastore"));
    }

    return datastore;
  }

  public void setDatastore(String datastore, Boolean useAttribute) {
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextholder.currentRequestAttributes()).getRequest();
    request.setAttribute("datastore", datastore);
    this.useAttribute = useAttribute;
  }

  public Boolean getUseAttribute() {
    return useAttribute;
  }
}

Иногда в моем коде мне нужно изменить это datastore, но затем я Я хочу немедленно изменить его после того, как я вызываю любой код, которому нужно datastore по-другому:

 @Component
  public class someClass() {
    @Autowired
    private HttpDatastoreFacade datastoreFacade;

   @Autowired
   private OtherClass otherClass;

   public void someMethod() {
     String savedDatastore = datastoreFacade.getDatastore();
     String savedUseAttribute = datastoreFacade.getUseAttribute;

     //setDatastore to new settings 
     datastoreFacade.setDatastore("newStore", true);

     //this is where I call my method's or methods that need this new datastore
     otherClass.callSomeMethod();

     //set the datastore back to old value
     datastoreFacade.setDatastore(savedDatastore , savedUseAttribute );
   }
 }

Моя проблема в том, что я сталкиваюсь с проблемами многопоточности, где useAttribute - это правда, но datastore - нет. не указан в атрибуте запроса.

Я ищу лучший шаблон java, в котором я могу заблокировать HttpDatastoreFacade, пока я выполняю свой otherClass.callSomeMethod() или любые другие вызовы, которые мне нужно сделать, пока я установите HttpDatastoreFacade обратно в нормальное состояние. otherCalss.callSomeMethod может вызывать и другие методы, которые используют HttpDatastoreFacade, и они могут захотеть установить его так, как им нужно. Поэтому, может быть, мне нужен нехватка стека datastore, который безопасен для потоков?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Кажется, что бин в @RequestScope может решить вашу проблему.

@Component
@RequestScope
public class X {
    //
}

вам не придется думать об очистке боба, ограниченного областью запроса, как ThreadLocal. Он будет собран после очистки соответствующего ServletRequest.

0 голосов
/ 24 апреля 2020

В итоге я сделал useAttribute ThreadLocal переменную, которая решила мои проблемы.

private ThreadLocal<Boolean> useAttribute = new ThreadLocal<>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...