GXS Korea 문의 결과 해당 기능과 관련한 공식 가이드/메뉴얼 문서는 없는 상황.

BizManager Library 디컴파일 해보면 참고가 될만한 샘플을 볼수가 있어서 해당 내용을 기반으로 첨부와 같이 가이드 문서를 작성


1. 기능 설명

- Parties -> Processing Rule -> Action 에 해당 하는 기능임

- Provides the capability to configure the system to invoke a Java class.



2. 설정 세부 항목 설명

   1) Name 

       -  실행될 Processing Rule Action 명칭 정의


   2) Java Class 

       - 실행할 Java Class에 대한 Class Qualified Name

       - Class 생성과 관련한 현재까지 공개된 내용(현재 BizManager측의 해당 Class 생성관련한 공식 가이드 없음)


       (1) 주요 Interface or Class            - com.ipnetsolutions.msgsrv.script.ScrBean 

              => 생성할 Class에서는 이 Interface를 Implement 해야만 함

            - com.ipnetsolutions.msgsrv.script.ScrResults

              => 생성한 Class내에서의 처리결과를 저장하는데 사용되는 클래스

            - com.ipnetsolutions.msgsrv.script.ScrBean.Context

              => 생성하는 Class내에서 BizManager 프로세싱 단계에 저장된 각 Object에 접근할수 있는 통로


       (2) 생성 Class의 적용위치

            - BizManager의 ClassPath상에 위치하면 될것으로 추정됨

            - 현재 C:\BizConnect\Application\app3.3.0\lib\common 경로에 생성한 클래스를 위치히야 정상동작

              하는것으로 확인됨

            - 생성 Class 적용시 서버 재기동 과정이 필요함


       (3) 샘플 소스

            - 첨부의 샘플소스 확인


package kr.co.inspien.bizmanager;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import com.ipnetsolutions.config.itf.Configurator;
import com.ipnetsolutions.logger.Logger;
import com.ipnetsolutions.msgsrv.script.ScrBean;
import com.ipnetsolutions.msgsrv.script.ScrResults;

public class SampleJavaAction implements ScrBean{

	@Override
	public ScrResults run(Context context) throws Exception {
		// TODO Auto-generated method stub
		
		Logger oLog = context.getLog();
				
		//Action Script 실행 결과 객체 생성
		ScrResults oResult = new ScrResults(oLog);
		
		//Context 객체에서 Parameter String 추출
		String sParam = context.getParam();
		
		//Context 객체에서 현재 처리중인 데이터 파일명 추출하기 
		Input oInput = context.getInput();
		String outFnm = oInput.logicalFilename;
		
		//Context 객체에서 현재 처리중인 데이터 추출하기
		InputStream is = oInput.getInputStream();
		String sProcData = convertStreamToString(is);
		
		
		//Context 객체에서 Output 출력하기
		String sOutFile = "TRANS_JAVA_OUTPUT";
		FileWriter wtr = new FileWriter(sOutFile);
		StringBuffer sb = new StringBuffer();
		sb.append("");
		sb.append("");	
		sb.append("");
		sb.append("YUMI_DUNS");
		sb.append("lswDUNS");
		sb.append("YUMI_XML_DOC");
		sb.append("123123");
		sb.append("");
		sb.append("");
		sb.append("");
		sb.append("444");
		sb.append("10");
		sb.append("Test");
		sb.append("");
		sb.append("");
		sb.append("");
		
        wtr.write(sb.toString());
        wtr.close();
        
      //Context 객체에서 Output 출력하기
        oResult.addOutput(sOutFile);
	
		//Configuration 정보
		Configurator cf = context.getConfigurator();
		String sCF = null;
		if(cf != null){
			sCF = cf.getDatabaseConnectionName();
		}

		//==> Test Output File 
		FileWriter fstream = new FileWriter("C:/temp/BizManagerTestOutput_0724.txt");
		BufferedWriter out = new BufferedWriter(fstream);
		out.write("Logger Level="+oLog.getLevel()+"\r\n");
		out.write("Logger Name="+oLog.getName()+"\r\n");
		out.write("Parameter String = "+sParam+"\r\n");
		out.write("logicalFileName = "+outFnm+"\r\n");
		out.write("Configuration DB Connection Name="+sCF+"\r\n");
		out.write("============================== Contents Start =============================\r\n");
		out.write(sProcData);
		out.write("============================== Contents End =============================\r\n");
		out.close();
		
		if(sParam.equals("ERROR")){
			oResult.addError("Custom Error Message");    //처리결과 에러상태로 지정
		}else if(sParam.equals("WARNING")){
			oResult.addWarning("Custom Warning Message");
                        //처리결과는 Success이나 지정한 메시지가  Operation 모니터링내에 Error Message 항목에 출력됨
		}
		
		
		return oResult;
	}
	
	public String convertStreamToString(InputStream is) throws IOException {
		
		if (is != null) {
            StringBuilder sb = new StringBuilder();
            String line;

            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                while ((line = reader.readLine()) != null) {
                    sb.append(line).append("\n");
                }
            } finally {
                is.close();
            }
            return sb.toString();
        } else {      
            return "";
        }
	}
	

}

    3) System ID

       - 서버 이중화 구성의 경우 해당 Class가 실행될 특정 서버를 지정할 수 있음


   4) Parameter String

       - 생성한 Java Class 내부로 전달할 Parmeter String 지정

       - //Context 객체에서 Parameter String 추출 String sParam = context.getParam();


   5) Stop Default Transmission

       - Java Class 호출후 수신자(Receipt)의 Default Trandport를 실행할지 여부임 

       - 하나의 Processing Rule에 등록된 Acition 모두 동일하게 셋팅해야 적용된다         

          예) 모두 해당 옵션을 선택해제해야 각 Action의 처리상태와 상관없이 수신지 Default Transport 수행함 


   6) Cascade Multiple Actions

       - 현재 등록하는 Action의 처리상태에 따라 후속 Action을 실행여부 결정 

       - 해당 옵션선택시 현재 단계의 Action이 실패할경우 후속 Action이 실행되지 않음 


   7) Schedule

       - immediately : 즉시 실행

       - 그외 스케쥴 지정시 지정된 시간만큼의 Delay를 가진후 실행되는 모습을 취함

         ※ 특정시간 실행 지정가능


3. 해당 기능 활용 방안

    - 각 Processing Rule에서 지정한 Document 처리시 BizManager에서 제공하지 않는 기능들에 대해서

      Custom Java 소스를 활용하여 극복이 가능 할것으로 보임


    - Java Class의 처리상태가 Error인경우 Operation 메뉴에서 Retry 처리도 가능함


    - Java Class에서 문서의 변환 및 외부 작업 수행후 후속 프로세스로의 연계도 가능함     

      예) 아래와 같이  ACT_JAVACALL2 단계에서 문서를 변환하고 이후 후속 프로세스가 진행됨

Schedule 지정시 Operation 옵션에서 아래와 같이 Delay 처리되는 상황을 확인할수 있다. 




Posted by INSPIEN
,

0. 관련 webMethods 버전 8.0.1


1. 에러 발생 사항

    - IntegrationServer 에 Devleloper로 접속 시도시 아래와 같은 에러 메시지가 Developer상에서 나타나는 현상 발생

    - IntegrationServer 를 재기동하면 정상적으로 다시 정상적으로 접속할수 있는 상황

<관련 에러 로그 캡쳐>

 

 

 

2. 관련사항에 대한 SAG 문의 관련 회신내용

It is actually a JIT bug in IBM's jvm. Please have a look at IBM APAR http://www-01.ibm.com/support/docview.wss?uid=swg1IZ96847.

As per the APAR, the defect would be fixed permanently in 6.0.0 SR10. I am not sure whether this fix has been released by now, you could open a ticket with IBM to verify. In the meantime the problem could be worked around by setting -Xjit:disableIdiomRecognition option.

I suggest Customer can try the option now to confirm it would resolve the problem, then apply the fix suggested by IBM and remove the option to resolve the issue permanently. Please inform me the results.

3. 관련현상 해결방안 검토

- 관련 에러 현상관련하여 SAG Tech Forum 검색 결과 아래와 같은 내용의 게시물이 확인되었습니다.
   http://tech.forums.softwareag.com/techjforum/posts/list/22858.page

- 해당 내용은.. IBM AIX용 Java 1.6 SR9 버전 이하에서 Bug가 존재하며, 해당 Bug는 SR10버전 이후 조치된것으로 최종 확인됨

- JVM 업그레이드를 진행하기에 무리가 있는 경우 SAG 회신내용과 같이 server 구동쉘에 (server.sh) -Xjit:disableIdiomRecognition 의 JVM 옵션을 추가하였으며 옵션추가후 동일현상 재발 되지 않음


 

Posted by 알 수 없는 사용자
,

  : Insert

  • Insert ICON은 매핑할때 다른 서비스를 호출 할때 사용 한다. 


 : MAP

  • MAP은 같은 입력이 여러개의 서비스에서 사용한다면, MAP을 추가해 Pipeline TAB에서 Add Transformer로 서비스를 추가해서 입력 받을 수 있다.

  • Show Left-han Scroll Bar를 클릭하면 Input쪽과 Output쪽의 Scroll Bar가 각각 생기기 때문에 사용이 편리 하다.

  • MAP에서 Output쪽에 변수를 하나 둬서 임의의 값을 입력하면 다음 Step에서 그 값을 받을 수 있게 할 수 있다. 하지만 값을 입력하지 않으면 생성한 Datatype은 사라지게 된다

  



 : BRANCH

  • BRANCH는 if와 Switch문 이라고 생각 하면된다. Property창에 보면 Evaluate Lables를 False로 하면 Switch처럼 쓸 수 있는 것이고, True면 if처럼 사용 할 수 있다.

  • Switch는 Evaluate Labels를 False로 하고 검사할 DataType을 Property에 Switch에 DataType값을 넣는다. 그리고 밑에서 검사할 Step에서 Label에 값을 넣으면 위의 Switch DATA가 Label에 넣은 값과 같은 경우 그 Step을 실행하게 된다. 

    ※ Label에서 CoboBox를 클릭하면 $default와 $null이 있다. $null은 NULL값 일때 실행되고, $default는 아무 값도 충족되지 않을때 실행 된다


  • IF는 Evaluate Labels을 True로 수정하고 Swtich값은 비워둔다. 그리고 밑에 Label에서는 조건을 준다. 예를 들이 %A% >= 10 이렇게 주면 dataType이 10보다 크거나 같을때 그 step이 실행 된다. 

    ※ 꼭 datatype으로 조건을 검사 할 때는 datatype앞뒤에는 %를 붙어 주어야 한다. 그렇지 않으면 string으로 인식 한다.


 : LOOP

  • LOOP는 String List, String Table, Document List, Object List와 같은 여러개의 값이 있는 데이터들을 LOOP를 돌릴때 사용한다. Property TAB에서 INPUT Array에 datatype을 넣어주고 하위의 다른 Step에 넣어주면 list의 개수만큼 LOOP를 돌게 된다.

  • Input Array에 넣어주었던 List DataType은 LOOP를 돌때는 단일값 데이터 타입으로 변해서 그 값을 사용 할 수 있다.



※ Loop가 돌고 있을때 Loop안에 자체적으로 $iteration라는 Data가 있는데 LOOP가 몇번 돌았는지 count하는 변수이다.


 : REPEAT

  • REPEAT는 Loop와 같은 순환문인데 LOOP는 DataType으로 순환 하지만 repeat는 숫자 값을 넣어서 강제로 그 횟수만큼 순한 하게 된다.

  • 주의 점은 count값에 5를 주게 되면 0부터 시작해서 6번 돌게 된다.

  • 순한을 한 번 할려고 할때마다 Interval을 줄 수 있는데 repeat interval에 값을 주면 된다. 단위는 초다.

  • Repeat On을 SUCCESS로 설정 해주지 않으면 Error가 발생 한다.



 : SEQUENCE

  • SEQUENCE는 서비스의 묶음이다.. JAVA에서 { } 로 묶어 주는거 처럼... 만약 Branch문장에서 같은 조건으로 여러개의 Step을 수행해야 한다면 SEQUENCE로 묶어서 사용 하면 된다.


  • 위의 기능 말고도 중요한 기능인 예외처리 기능이 있다. 


구  분

내   용 

done 

 에러가 발생하여도 SEQUENCE안에 있는 step은 모두다 실행한다. 

failure 

 에러가 있을 시 에는 뒤에 step을 실행하지 않는다. 

success 

 성공할 시 뒤에 있는 step을 실행하지 않는다. 



 : EXIT

  • Exit는 어떤 문장을 빠져 나올때 사용하는데, 조건은 Properties창에 보면 Exit from 

구  분 

내   용 

$parent 

 현재 자신을 묶고 있는 부모 TAB에서 빠져 나오는 것 

$loop 

 현재 돌고 있는 LOOP를 빠져 나오는 것 

$flow 

 현재 실행 되고 있는 flow에서 빠져 나오는 것 






Posted by INSPIEN
,