2023년 4월 13일 목요일

[Linux] XRDP로 접속 후 프로그램 실행 오류 발생

 [ 출처 : https://github.com/ ]


xrdp로 접속 후 프로그램 실행시 cannot open display 1 오류 발생

# systemctl set-default multi-user.target
# reboot


2023년 4월 10일 월요일

[ABAP] RFC Destination 사용법(SAP RFC에서 외부 시스템 호출)

[ 원글 : https://blog.naver.com/dhysys/ ]


.NET [ https://blog.naver.com/dhysys/

http://help.sap.com 에서는 다음과 같이 나와있습니다.

In the SAP System, the ability to call remote functions is provided by the Remote Function Call (RFC) interface. This interface allows for remote calls between two SAP Systems (R/3 as of Release 2.1 and R/2 as of Release 5.0D), or between an SAP System and a non-SAP system.

 

server와 client에 대해서는..

RFC programs for non-SAP Systems can function as either the caller or the called program in an RFC communication.

There are two kinds of RFC programs: RFC client and RFC server programs:
The RFC client is the instance that calls up the RFC to execute the function which is provided by an RFC server. In the following, the functions that can be executed remotely will be called RFC functions, and the functions provided by the RFC API will be called RFC calls.

 

그렇다면! RFC Server를 이용하여 SAP 의 이벤트를 받고 싶다면 어떻게 하는지 알아보겠습니다.

 

시스템 구성

Windows Server 2003 Enterprise Edition with SP2

Visual Studio 2003

SAP .NET Connector 1.03

JAVA VM Version 5 Runtime engine

 

** SAP .NET Connecotr는 Visual Studio 2003, .NET Framework 1.1까지만 지원하고 있습니다. 더 이상 SAP에서는 SAP .NET Connector를 지원하지 않겠다고 합니다. 그 이상 버전에서 사용하고 싶으시면 WCF SAP Adapter를 이용하셔야 합니다.

 

사전 작업

SAP RFC Destination 설정과 RFC 함수 구현이 완료되어 있어야 됩니다.

 

실제 구현

SAP .NET Connector에는 RunTime과 Design Time으로 분리되며, Visual Studio 2003을 지원하기 위해서는 반드시 Design Time이 설치되어야 합니다. 설치 된 후 Visual Studio 2003에서 프로젝트를 추가 후 -> 새로운 항목 추가를 클릭하면 SAP Connector Class라는 항목을 확인할 수 있습니다.


SAP Connector Class를 선택 Name을 지정 후 Open을 클릭하면 SAP .NET Connector Wizard가 실행됩니다.



SAP Server를 선택 후 Next를 클릭합니다.



SAP 서버의 연결정보를 구성 후 Object TypeServer Stub으로 선택 후 Next를 클릭합니다.



RFC함수를 검색하여 ADD시킨 후 Next를 클릭합니다.


 


C#코드가 자동생성되는것을 확인할 수 있습니다.


 


Stub코드가 생성 된 후 Windows서버에서 SAP 이벤트를 수신받기 위해 Listener를 구성하여야 합니다. 일반적으로는 윈도우즈 서비스로 구성합니다.


 








프로젝트가 구성되었습니다.

프로젝트 구성이 완료되었으니 실제 소스를 구현합니다. 여기서는 콘솔 프로그램으로 작성하였습니다.

 

using문에 SAP.Connector를 추가합니다. (Wizard를 통해 Stub코드를 생성할때 SAP.Connector.dll은 자동 참조 됩니다.)



RFCServerConsole을 상속받아 구현하였습니다.








콘솔프로그램의 구현은 간단합니다. SAP의 Detination정보를 가지고 서비스를 대기하는 Listener입니다.

SAP에서 이벤트를 수신받았을때 수행되는 함수입니다. Wziard로 Stub을 생성 후 override하여 구현하면 됩니다.

여기서는 간단하게 X, Y값을 덧셈하는 로직입니다.

 

 

 

RFC Server와 (1) SAP .NET Connector C# Side에서 구성한 Listener와의 통신 접점 구성을 해주어야 합니다.

이 구성을 SAP는 RFC Destination을 생성한다고 합니다.

help.sap.com 참조: RFC Destination

 

트랜잭션 코드는 SM59입니다.



 Display and maintain RFC destinations 화면에서 "Create"버튼을 클릭하면 RFC Destination을 생성하는 화면이 나옵니다.



 Connection Type은 "T"를 선택합니다. 여기서 "T"는 TCP/IP 통신을 하겠다는 의미입니다.



 "Registration" 버튼을 클릭한 후 ProgramID를 구분할수 있는 값으로 지정합니다. 여기서는 "BIZTALK"으로 지정하였습니다.



 ProgramID를 지정후 툴바의 플로피 디스크 아이콘 (Save)을 클릭하여 저장합니다.



 BIZTALK이라는 이름으로 RFC Destination이 생성된것을 확인할 수 있습니다.



 RFC Destination이 생성되면 외부 시스템과의 통신이 원활하게 이루어지는지 테스트를 해보게 됩니다.

이때 SAP.NET Connector의 경우는 Console프로그램을 실행시켜 Listen을 하고 있는 상태이어야 합니다.

BizTalk SAP Adapter의 경우는 Receive Port를 생성하여 Enable 상태이어야 합니다.



 "Test Connection"을 클릭하였을때 정상적으로 서비스가 Listen 상태라면 통신이 원활하게 되고 있다는것을 확인하실수 있습니다.

연결 테스트가 되었다면 이제 RFC함수로가서 정상적으로 동작하는지 확인합니다.

 

RFC 개발화면 트랜잭션코드는 SE37입니다.



 여기서는 미리 생성한 RFC "Z_RFC_ADD"를 사용하도록 합니다.



 RFC함수의 내용은 보시는것 처럼 값(VALUE)를 전달하는 역할만 합니다.

툴바의 "Test or Execution" 아이콘을 클릭합니다.



 간단한 덧셈을 하는 내용입니다. 실제 덧셈을 하는 로직은 SAP.NET Connector로 구현한 Console 프로그램이나 BizTalk Server에서 구성된 로직이 되겠습니다. RFC함수는 값만 전달해주고 결과값을 돌려받습니다.

 

여기서 중요한것은 SAP에서 이벤트가 시작하여 그것이 외부시스템에서 수행 후 그 결과값을 받을 수 있다는것입니다.

 

간단한 값을 지정하고 어느 Destination을 통해 통신하는지를 지정 후 "Execute"를 클릭합니다.



 외부 시스템 서비스와 Destination 연결테스트가 정상적이며, 외부 서비스의 로직 구현이 정상이라면 결과물을 화면과 같이 받아 볼 수 있습니다.

 

(2) RFC Server SAP Side에서 구성한 RFC를 그대로 사용하도록 하겠습니다. 내용은 단순하게 덧셈을 하는것으로 잡았으며, MiniSAP이므로 실제 SAP와는 조금 차이 날 수 있습니다.



 SAP에서 RFC 구성이 완료되었으면 BizTalk Server측으로 넘어가도록 합니다.

BizTalk WCF SAP Adapter가 정상적으로 설치되었다면, Visual Studio를 실행하여 BizTalk 프로젝트를 생성합니다.

BizTalk 프로젝트에서 오른쪽 마우스 버튼을 클릭 Add -> Add Generated Items를 선택합니다.

 

Add Generated Items의 왼쪽 트리뷰에서 Consume Adapter Service을 선택합니다.


 







WCF Adapter Wizard화면이 나오면 BindingSAP로 지정합니다.

SAP로 지정 후 접근할 SAP의 주소 및 인증정보를 입력합니다.

 

SAP 접근 인증정보 입력







 

SAP 서버 정보 입력


 










 

설정이 완료된 후 Connect를 클릭하면 SAP 서버정보가 보입니다.



 Contract type Client로 지정 후 검색 또는 왼쪽 트리에서 필요한 RFC를 찾아서 추가합니다. OK를 클릭하면 Z_RFC_ADD 함수의 스키마가 생성됩니다.

 

RFC Server 방식은 수신 받은 이벤트를 가지고 로직을 실행 후 리턴값을 응답하는 구조입니다.

여기서는 Orchestration을 생성하여 C#으로 구성된 모듈(로직)을 호출하여 응답값을 리턴하도록 합니다.



 Expression Shape를 사용하여 C# 모듈을 호출합니다.

응답값을 리턴하기 위해서는 WCF.Action값이 필요합니다. Action값은 Schema에서 확인할 수 있습니다.



 

C# 모듈은 간단한 덧셈을 수행 후 Response Schema에 맞는 XML을 생성합니다.

BizTalk 프로젝트가 생성이 완료되면 빌드하여 배포하도록 합니다.

 

이제 RFC Server 이벤트를 수신받을 Receive Port를 생성합니다.







 

RFC Server의 방식은 수신을 받은 후 응답을 주는 형태이므로 Request Response Recieve Port로 생성합니다.



 

포트이름은 알아볼수 있는 내용으로 지정하시면 됩니다.



 Receive Location에서 Type은 WCF-Custom으로 선택합니다.

Handler를 선택 후 파이프라인은 Default XML 파이프라인으로 지정합니다.

Configure...을 클릭합니다.

















 

WCF-Custom 어댑터 설정화면이 나오면 Binding 탭에서 SAPBinding을 선택합니다.

















 

SAP 서버에 접근하는 인증정보를 입력합니다.

General 탭으로 다시 돌아와서 Address를 입력합니다. 앞서서 SAP Counsum Wizard에서 생성한 Address를 사용해보았는데 연결이 되지 않습니다. 사용자가 수정을 해야합니다.

















 

주소는 다음과 같은 포멧으로 만들어주면 됩니다.

sap://CLIENT=00;LANG=EN;@A/MINISAP/00?ListenerGwHost=MINISAP&ListenerGwServ=SAPGW00&ListenerProgramId=BIZTALK

 

설정이 완료 된 후 Receive PortEnable 상태로 변경합니다.



 

(2) RFC Server SAP Side에서 했던 Connection Test를 해서 연결이 올바르게 이루어지는지 확인합니다.




 Connection Test가 완료되었다면, 이제 실제로 SAP 에서 이벤트를 주어 RFC Server가 동작하는지 테스트 해보도록 합니다.




BizTalk Server와 관련해서 WCF Adapter 샘플을 제공하고 있습니다. 샘플은 다음링크에서 다운로드 받을 수 있습니다.

BizTalk Server 2006 R2 Code Samples

여기서 사용한 샘플 역시 여기서 다운로드 받아 약간의 수정을 통해 이용하였습니다.

 

WCF SAP Adapter을 테스트 하면서 생각되어진 장단점은 다음과 같습니다.

 

장점

(1) 이전 BizTalk Adapter로는 지원되지 않는 부분들을 지원하고 있습니다.

- RFC Server 지원

- SAP ECC Version 지원

 

(2) 마이크로소프트에서 돈?을 받고 파는 제품이기 때문에 문제 발생시 기술지원을 받을 수 있습니다.

 

(3) 마이크로소프트에서 만들어 내기 때문에 앞으로도 꾸준히 업데이트 되면서 BizTalk 이외의 다른제품에서도 사용할 수 있도록 나오게 되었습니다 . SSIS (SQL Server Integration Service), IIS (Internet Information Service), MOSS (Microsoft Office Share Point Server), W/S (XML Web Service) 등등

 

단점

(1) 현재 나와있는 BizTalk WCF Adapter v1.0은 버그가 보이고 있습니다. SAP를 연결하는데 같은 버전의 SAP라도 오류가 그때그때 달라지니.. 좀 난감할때가 있습니다. 아무래도 첫번째 버전의 모습을 보이고 있지만, 내년에 v2.0 으로 몇가지 어댑터와 추가기능이 추가되어서 나오면 좀더 사용할만한 어댑터가 되지 않을까 싶습니다.

 

(2) BizTalk Adapter로는 BizTalk으로 구매시 라이센스가 같이 들어오지만 BizTalk이 없이 사용할려고 할때에는 라이센스를 구매하셔야 합니다. SAP와 연계는 하고 싶지만 BizTalk은 너무 비싸서 구매에 망설여 진다면 WCF Adapter Pack만 구매해서 사용하시는것도 방법입니다.

 

(3) 설치시 몇까지 지켜줘야 될 사항들이 있습니다. SAP GUI에서 dll 복사 설치라던가.. 아직까지는 원 클릭 설치가 되지 않습니다. SAP GUI 버전도 좀 가리는것 같습니다.

 

(4) 여러번 Consume Adapter Wizard를 실행할 경우가 생기면 매번 인증정보와 서버정보를 입력해야 합니다. 이거 매우 반복성 작업이 되어버리는군요... 서버정보는 Configure a URI를 복사해서 사용하면 약간이나마 줄일 수 있습니다.



자바 어플리케이션 원격 모니터링

[ 출처 : http://freegram.egloos.com/ ]

Jconsole, MC4J 를 사용한 자바 어플리케이션 원격 모니터링(JMX)

 

JMX(JavaManagement Extensions)는 실행중인 자바 어플리케이션을 외부에서 모니터링하고 관리하는 기능을 제공한다. 실제로 이 API는 웹서버에서 네트워크 디바이스, 웹폰에 이르기까지 자바로 이용 가능한 것은 어느 것이든 로컬 혹은 원격으로 처리 할수 있게 한다. JMX 기술은 JCP(Java Community Process)에 의해 개발된 밀접한 관계의 두 스펙, Java Specification Request (JSR) 3: Java Management Extensions (JMX) SpecificationJSR 160: Java Management Extensions (JMX) Remote API 1.0에 의해 정의된다.

J2SE platform 5.0 부터 JMX기술은 Java SE 플랫폼의 하나로 통합되었다. 이전 버전에서 JMX 기술의 구현은 해당문서를 참조하도록 한다.

 

이러한 JMX 프로토콜을 사용하여 실행중인 어플리케이션의 메모리 및 스레드등에 대한 그래피컬한 정보를 보여주는 툴로는 JDK에 기본 내장된 JConsole 과 오픈소스 프로젝트에 하나인 MC4J 가 있다.

MC4J는 여러개의 서버 및 JVM 리소스들을 동시에 관리할 수 있는 편리함이 있지만 JConsole 도 버전업이 되면서 그에 못지않게 편리해졌다. 개인적으로 일반적인 용도로 사용할때는 JConsole이 좀 더 직관적이고 편리한 것 같다.

 

Tomcat 5.5 버전 이후부터 JDK 1.5에서 기본지원하는 JMX 프로토콜을 사용함으로 추가적인 연결아답터를 설치할필요가 없다. 이전버전의 JMX 연결설정은 이 문서에서 설명하지 않는다.(일반적으로 5.5 이전 버전에서는 MX4J JMXConnector 를 사용하였다)

 

JDK 설정

원격 모니터링을 활성화하기 위해서 JDK 의 JMX 관련설정을 해주어야 한다.

1) JDK5 이후버전만 가능

2) "JAVA_HOME/jre/lib/management/" 폴더에 있는 "jmxremote.password.template" 파일을 복사해서 "jmxremote.password" 파일을 만든다.

3) "jmxremote.password" 파일을 열고 밑의 계정들에 달린 주석(#)을 제거한다.

monitorRole  QED

controlRole   R&D

4) "jmxremote.password" 파일을 읽기전용으로 만든다.

chmod 400 jmxremote.password

선택)"management.properties" 파일에 아래설정을 추가하면 해당 JDK로 실행되는 모든 프로그램에 해당 JMX 옵션이 디폴트로 일괄적용된다.

com.sun.management.jmxremote
com.sun.management.jmxremote.port=8999
com.sun.management.jmxremote.ssl=false

 

JAVA 프로그램 실행(톰캣 등)

자바 어플리케이션을 실행할때 해당 옵션을 추가한다.

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false ...

 

톰캣의 경우도 마찬가지로 JAVA_OPTS 환경변수에 위의 옵션을 추가하여 실행시 반영되도록 설정한다.

예-윈도우) 톰캣 bin폴더에 run.bat 파일을 생성하고 아래의 내용을 추가한다.

setJAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false

startup.bat

예-리눅스) 톰캣 bin폴더에 run.sh 파일을 생성하고 아래의 내용을 추가한다.

JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false"

export JAVA_OPTS

./startup.sh

 

관련옵션

-Dcom.sun.management.jmxremote.port=8999 : 8999는 포트번호로 시스템에서 사용하지 않는 포트를 임의로 지정하면 된다.

-Dcom.sun.management.jmxremote.ssl=false : ssl를 비활성화 한다. ssl을 활성화하여 보안연결을 사용하고자 한다면 몇가지 추가적인 설정들을 필요로 한다. 이 문서에서는 설명하지 않는다.

-Dcom.sun.management.jmxremote.authenticate=false : JMX연결과정에서 인증을 요청하지 않는다.(누구나 접근가능)

-Dcom.sun.management.jmxremote.password.file=파일경로: JMX 인증관련 설정파일을 따로 지정한다. 유닉스 등 멀티유저 환경에서 자바 어플리케이션을 실행할때 패스워드파일은관리자계정에게만 읽기전용의 속성을 가지고 있으므로 다른 사용자들은 권한문제로 어플리케이션 실행이 실패한다. 따라서 각 사용자마다자신만의 jmxremote.password 파일을 생성해서 명시적으로 사용할 수 있도록 지원한다.

 

프로그램을 실행한 뒤 JMX 포트가 정상적으로 열려있는지 확인하기 위해 아래 명령을 사용한다.

netstat -anp | grep LISTEN

 

원격 모니터링 접속

JConsole 의 경우 간단하게 아이피:포트 로 접속하면 된다. jmxremote.password 파일을 수정하지 않았다면 monitorRole:QED, controlRole:R&D 두가지 계정으로 접근할 수 있을것이다.


MC4J 는 연결을 생성할때 JDK5를 선택하고 localhost:포트번호 를 상황에 맞게 수정해서 접속하면 된다.

톰캣서버가 클러스터링 되어있는 경우라면 연결의 속성을 TOMCAT5.5+ 로 선택하여 접속하면 클러스터링 관련의 특화된 관리기능이 활성화된다.


톰캣 이외에 웹로직, 웹스피어, 제우스등의 WAS들도 기본적으로 JDK5 이상버전에서 작동중이라면 위에서 설명한 JMX옵션을 통해 외부 모니터링이 가능하고 MC4J에서는 연결종류에 따라 특화된 관리기능을 제공한다.

 

리눅스에서 JMX 버그

이 글을 포스팅하게 만든 주 원인으로 리눅스상에서 JMX 포트가 열려있더라도 원격에서 접속이 실패하는 현상이 발생한다.리눅스의 호스트테이블을 JDK에서 잘못 인식하여 발생하는 버그로 추정된다. 해결방법은 /etc/hosts 파일을 편집하여

127.0.0.1      localhost.localdomain localhost

실제아이피   호스트명

형식으로 수정한다. 내 경우

127.0.0.1        smbServer localhost.localdomain localhost

::1                 smbServer

로 되어있던 것을 아래와 같이 수정해주었다. 127.0.0.1에 중복정의되어 있던 호스트명(smbServer)를 실제아이피에만 사상한것을 볼 수 있다.

127.0.0.1        localhost.localdomain localhost

192.168.1.40   smbServer


유동아이피라면 굳이 ::1 을 실제아이피로 수정하지 않더라도 localhost와 호스트명(smbServer)만 분리하여 사상하면 정상작동 하리라 본다(미확인)

 

또한 리눅스 방화벽이 JMX 포트에 대해 열려있는지도 확인해야 한다.(etc/rc.d/init.d/iptables --list) 역시나 본 문서에서는 설명하지 않는다.