Синхронизированы ли введенные классы в Java EE и Spring?

#java #dependency-injection

#java #внедрение зависимостей

Вопрос:

Я хочу иметь только один TCP-сокет, который подключается к другой программе. Каждый новый вызов моей конечной точки rest записывает данные в мой TCP-сокет. Если я напишу класс с моим TCP-сокетом и внедрю его в свой класс контроллера, будет ли он потокобезопасным? или я должен синхронизировать их с помощью ключевого слова synchronize?

 @Component
public  class ViconetBuffer {

private Socket socket;

private boolean connectToViconSocket(){
    try {
        socket = new Socket(DeviceAddressUtil.socketIp,DeviceAddressUtil.port);
        return true;
    }catch (Exception ex){
        ex.printStackTrace();
        return false;
    }
}

public void sendDataToViconSocket(String message){
    try {
        if (!socket.isConnected()){
            connectToViconSocket();
        }else socket.getOutputStream().write(message.getBytes());
    }catch (Exception ex){
        ex.printStackTrace();
    }
}
  

}

Комментарии:

1. что происходит, когда вы пытаетесь записать большой фрагмент данных в TCP и снова обращаетесь к службе во время передачи?

Ответ №1:

Нет, это ваша работа. Spring / CDI / EJB не может знать, как вы хотите, чтобы несколько потоков координировали свое использование сокета.

Комментарии:

1. Так не следует ли мне внедрить класс и сделать методы синхронизированными, а сокет статичным?