서비스가 계속해서 멈추는 이슈가 발생했다. web 서버가 총 4개로 구성되어 있는데, 첫번째 서버가 멈추면 그 이후로 2,3,4 번의 서버들이 멈추는 문제가 발생했다. 계속해서 멈추고 오류를 확인해보니 JSch를 부르는 컨트롤러 이후에 어떤 로그도 작성되어있지 않았다.
JSch 관련해서 검색해보니 hang현상이 존재하는 것을 확인 할 수 있었다. 구글에 검색해보니 hangup현상이 발견되는 경우가 있었고 특히 현재 사용하고 있는 jsch-0.1.55 버전에서 hang 현상이 발견되는 경우가 많았다
구글에 검색해보니 여러 방법들이 있었는데 그 중에서 테스트해본것이 settimeout 메서드를 사용해서 시간이 초과되는 경우에 session을 끊어내는 방법을 사용했다. 어떤 경우에는 settimeout 메서드를 활용해도 hang 현상이 발견되는 경우가 있다고 했지만 우선 가장 기본적인 것을 적용해보기로 했고 정상적으로 작동하는 것을 볼 수 있었다.
java로 sftp로 파일 전송 및 다른 서버로 접속하여 명령어를 실행하게 해주는 라이브러리 이다.
JSch is a pure Java implementation of SSH2.
JSch allows you to connect to an sshd server and use port forwarding, X11 forwarding, file transfer, etc., and you can integrate its functionality into your own Java programs. JSch is licensed under BSD style license.
JSch는 SSH2의 순수한 Java 구현입니다.
JSch를 사용하면 sshd 서버에 연결하여 포트 포워딩, X11 포워딩, 파일 전송 등을 사용할 수 있으며, 해당 기능을 자체 Java 프로그램에 통합할 수 있습니다. JSch는 BSD 스타일 라이선스에 따라 라이선스가 부여됩니다.
jcraft document에는 위처럼 작성되어있는데,, x11 과 wiredX에 대해서 찾아보았다. X window system이란다. 리눅스에서 gui방식으로 윈도우 환경과 유사한 interface를 제공하고, linux를 처음 사용하는 사람들에게 쉽게 사용할 수 있는 편리성을 제공한다.
pom.xml
<dependancy>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependancy>
import java.time.LocalDateTime;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpProgressMonitor;
public class SFTPSender {
private String ADDRESS = "접속할주소";
private int PORT = 22; //포트번호
private String USERNAME = "아이디";
private String PASSWORD = "비밀번호";
private static Session session = null;
private static Channel channel = null;
private static ChannelSftp channelSftp = null;
public void sshAccess() throws Exception {
JSch jsch = new JSch();
session = jsch.getSession(USERNAME, ADDRESS, PORT); //세션 오픈!
session.setPassword(PASSWORD);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
//이부분은 내가 추가!
session.setTimeout(config.connectionTimeout);//set timeout for connection
session.connect();
session.setTimeout(conf.dataTimeout); //set timeout for data transfer
}
}
출처: https://js2prince.tistory.com/?page=4 [개발은 전투다:티스토리]
위에처럼 커넥트 부분에 connection 과정의 timeout과 data부분의 timeout 을 설정했다.
jsch라는 사실을 처음 알았다. 새로운것을 배우는것은 참 재미있는 경험이다. 그리고 스스로가 아직도 많이 부족하다는 것을 많이 느낄 수 있었다.