SAP PO 7.5의 JDBC Sender채널에서 폴링이 안되는 여러 현상에 대해 알아보고 같은 현상을 겪었던 사이트나 블로그를 참조해서 원인을 확인하고 해결하는 과정을 보여주는 내용이며 그외 스레드 처리에 대한 이해를 돕는 내용입니다.
JDBC Sender채널 실행시 CC(Communication Channel)모니터링의 노드에 'Processing Started' 상태에서 다음 단계로 넘어가지 않는 현상이 발생되었으며
NWDS(SAP NetWeaver Developer Studio)의 SAP Management Console에서 특정 AP서버의 스레드SAP_AFScheduler.Worker에 'Processing' 상태로 오랫동안 남아있는 경우가 있었습니다. 그리고 직접 해당 DB에 쿼리를 실행하는 경우 타임아웃이 발생되었었습니다.
추 후에 송신DB 잠금이 해제되고도 PO 7.5의 CC모니터링에 'Started'와 SAP Management Console에 SAP_AFScheduler.Worker가 실행중 상태로 남아있었습니다. 이 스레드의 상태를 Show Call Stack를 통해 확인하게 되면 아래 내용을 확인 할수 있습니다.
java.lang.Thread.State: RUNNABLE
locked...
Locked ownable synchronizers
....................
원인분석
이 현상은 SAP PO가 송신DB에 접근 시 조회하는 테이블에 락이 걸리거나 네트워크가 단절되는 등 다양한 원인으로 JDBC Sender채널에 'Processing' 상태로 남아있을수 있는것 같습니다. 그리고 그외 원인으로도 발생될수 있는 현상인것 같습니다.
자바성능튜닝이야기
정말 도움이 되었던 사이트입니다. 스레드별 상태를 이해할수 있는데.. 'BLOCKED' 상태인경우 진행중인 A스레드(상태: RUNNABLE)에서 소유한 락을 B, C(상태: BLOCKED)스레드에서 획득하지 못하고 대기하고 있어 어플리케이션 성능이 느려지는 경우라고 합니다.
그리고 데드락인 경우도 있는데 A스레드가 작업하려면 B스레드의 락을 획득해야하고 B스레드가 작업하려면 A스레드가 락을 획득해야하는데.. 서로 상대가 소유하고 있는 락을 획득하기 위해 어느 하나의 스레드에서 락을 해제하기 전까지 데드락 상태가 해제되지 않게되는것이라고 합니다.
해결과정
구글에서 검색한 사이트와 블로그 내용을 참고로 해결을 진행하는 과정입니다.
JDBC sender channel polling the data indefenetly after appyling taskTimeout parameter also
SAP 커뮤니티에 문의글을 남긴내용을 보면 폴링안되는 현상이 발생되었으며 SAP에서 제안한 note 1083488의 JDBC Sender채널에 taskTimeout을 적용 후에도 폴링이 안되는 현상이 발생되었다고 합니다.
note 1083488 내용에 의하면 FTP/JDBC Sender Channel에 폴링이 중지되는 현상이 있으며 재실행하면 잘 동작이 되는 현상이 있으며 해결방법에는 taskTimeout을 적용하면 된다고 나와있습니다.
그러고 보니 전에 FTP Sender채널에서 장기간 폴링 안되는 현상이 있었고 재시작하면 폴링이 정상적으로 되다가 그다음 폴링때 안되는 현상이 있었는데 FTP connection Parameters > Timeout으로 해결했던걸로 기억이 나는군요. 현재 위 내용과 관련있는 내용인지 모르겠지만.. 타 시스템과 연계할때는 타임아웃 설정도 필수로 고려해봐야될것 같고 잘만들어진 솔루션이나 프로그램에는 기본적으로 타임아웃이 설정되있는것 같습니다.
JDBC Sender체널에 taskTimeout 파라메터를 적용 후에 SAP Management Console의SAP_AFScheduler.Worker에 빨간불 들어온걸 확인 후에 taskTimeout의 설정된 시간에 처리가 되는지 확인해봤지만.. 처리가 되지 않았으며.. 오라클버젼의 영향이나 테스트방법에 오류가 있어서 테스트는 잘 안되는 경우가 있을것 같습니다.
SAP XI JDBC Communication Channels Not Polling or Hanging
이 블로그내용에서는 JAVA Node가 충돌 후에 JDBC Sender채널에서 폴링이 안되는 현상이 발생되었으며 몰랐던 사실이지만 SAP PO의 큐 서비스(SCS인스턴스)에서 잠금이 설정한 상태로 유지되어 잠금이 제거 될때까지 채널이 폴링이 되지 않는 현상이 있다고 합니다. 이 사이트에서도 taskTimeout 매개변수를 설정하면 설정된 시간만큼만 잠금을 유지하고 이후에는 유지되지 않는거 하는데.. JAVA의 Node충돌이 어떤케이스에 발생되는지 알수 있으면 좋을것 같습니다.
XI버젼때의 내용이라 지금도 가능한지는 모르겠지만 Visual Admin에서 잠금을 지울수 있는 방법이 있다고 하는데 지금은 NWA에서 잠금을 해제할수 있는 기능이 있을것 같은데 찾을수 없군요. 아시는분이 얘기를 해주셨는데 Manaagement Console의 실행중인 스레드를 강제로 죽이는 부분에 문의를 하셨다고 하시는데.. SAP에서 다른 프로세스에 어떤 영향을 줄지 몰라서 죽이는것보다 재시작을 하는걸 권장 했었다고 하는데 노드를 얘기하시는 거겠죠? 두개가 같은 방법인지는 모르겠습니다..
송신 DB와 총돌로 인하여 JDBC Sender채널이 폴링이 되지 않는경우 아래 사이트를 통해 점검을 할수 있다고 하며 화면에 표시되어있지 않는 채널인 경우 버그가 있을수 있다고 합니다. 이 버그에 대해서는 note 1483974를 참고하며 된다고 합니다.
*채널 개수가 많은 경우 브라우저에서 로딩하는 시간이 상당히 오래 걸립니다.
http://<host>:<port>/AdapterFramework/scheduler/scheduler.jsp
가끔 Oracle 데이터베이스에 연결되어 SQL문을 실행하는 동안 채널이 중지 되는경우(네트워크 단절 등) Message Monitoring에 DLNG(Delivering)상태로 남아있는 경우가 있는것 같습니다. 이문제를 피하기위해 JDBC Sender Channel에 Connection Timeout인 oracle.net. CONNECT_TIMEOUT과 read time인 oracle.jdbc.ReadTimeout을 설정할수 있습니다.
버젼이나 DB별로 변수명에 차이가 있으며 note 1078420을 참조하면 도움이 될것 같습니다. 내용을 보면 DB연결 시간이 오래 걸리는 현상에 해결을 위한 설정방법인데.. driver: 접두사 포함해서 셋팅을 해야합니다.
MS-SQL은 loginTimeout, socketTimeout MY-SQL은 connectTimeout, socketTimeout 인데 실제 SAP PO의 채널에 설정 후 실행이 될지는 궁금하군요.
마무리
CONNECT_TIMEOUT, ReadTimout에 대한 테스트를 못했지만 뒤늦게 taskTimeout의 설정값이 초단위인걸 알게되어 60초로 설정후 테스트를 해보았습니다. JDBC Sender채널을 실행 후 60초뒤에 아래와 같은 에러가 발생되더군요.
"Timeout occurred during message processing. For more information, see SAP Note 1083488. The message is set for rollback"
보통 5분에서 6분사이로 정상처리되던 인터페이스가 채널 실행 후 1분뒤에 taskTimeout 에러가 떨어지고 2분가까이 스레드가 RUNNABLE상태에서 사라지더군요. taskTimeout에러가 발생되면 SAP Management Console의 스레드상태도 Processing에서 바로 변환가 있을줄알았거든요..
JDBC Message size restriction
그외 사이즈 제한 관련파라메터인 msgLimit, masMsgSize, maxRowSize를 같이 설정하여 강제로 에러를 발생시켰을경우 taskTimeout 에러가 먼저 발생되고 그 이후에 사이즈에러가 발생되는데.. 채널의 설정된 값들이 스레드에 영향을 주는것 같아보이진 않는것 같습니다.
"Timeout occurred during message processing. For more information, see SAP Note 1083488. The message is set for rollback"
보통 5분에서 6분사이로 정상처리되던 인터페이스가 채널 실행 후 1분뒤에 taskTimeout 에러가 떨어지고 2분가까이 스레드가 RUNNABLE상태에서 사라지더군요. taskTimeout에러가 발생되면 SAP Management Console의 스레드상태도 Processing에서 바로 변환가 있을줄알았거든요..
JDBC Message size restriction
그외 사이즈 제한 관련파라메터인 msgLimit, masMsgSize, maxRowSize를 같이 설정하여 강제로 에러를 발생시켰을경우 taskTimeout 에러가 먼저 발생되고 그 이후에 사이즈에러가 발생되는데.. 채널의 설정된 값들이 스레드에 영향을 주는것 같아보이진 않는것 같습니다.
#Polling #notpossible #jdbc #sender #channel #adapter #SAP #PO7.5 #BLOCKED #Locked
댓글 없음:
댓글 쓰기