Java로 메시지 처리 또는 출력 노드 작성

시작하기 전에

WebSphere Message Broker에서는 두 개의 샘플 사용자 정의 노드, 즉 SwitchNode 및 TransformNode의 소스를 제공합니다. 현재 상태에서 이 노드를 사용하거나 수정할 수 있습니다.

개념 상, 메시지 처리 노드는 메시지를 특정 방식으로 처리하는 데 사용되고 출력 노드는 메시지를 비트스트림으로 출력하는 데 사용됩니다. 그러나, 메시지 처리 노드와 출력 노드는 코딩할 때 근본적인 공통점이 있습니다. 메시지 처리를 출력 노드 내에서 수행할 수 있으며 마찬가지로 메시지 처리 노드를 사용하여 메시지를 비트스트림으로 출력할 수 있습니다. 간단히 말해, 이 주제에서는 주로 메시지 처리 노드로서의 노드에 관해 언급하지만, 두 가지 유형의 노드의 기능성을 설명합니다.

새 Java 프로젝트 작성

Workbench 내에서 Java 노드를 작성할 수 있습니다. 이를 수행하려면 다음과 같이 새 Java 프로젝트를 작성해야 합니다.
  1. Java Perspective로 전환하십시오.
  2. 파일 > 새로 작성 > 프로젝트를 누르십시오. 왼쪽 메뉴에서 Java를 선택한 다음 오른쪽 메뉴에서 Java 프로젝트를 선택하십시오.
  3. 프로젝트에 이름을 제공하십시오.

    Java 설정 패널이 표시됩니다.

  4. 라이브러리 탭을 선택하고 외부 JAR 추가를 누르십시오.
  5. install_dir\classes\jplugin2.jar을 선택하십시오.
  6. 다른 빌드 설정값을 정의하려면 다른 탭의 프롬프트를 따르십시오.
  7. 완료를 누르십시오.
그 다음 이 프로젝트 내에서 Java 노드의 소스를 개발할 수 있습니다.

메시지 처리 노드 클래스 선언

MbNodeInterface를 구현하며 브로커의 LIL 경로에 들어 있는 모든 클래스는 브로커에 메시지 처리 노드로 등록됩니다. MbNodeInterface를 구현할 때는 이 클래스의 evaluate 메소드 또한 구현해야 합니다. 브로커는 플로우를 통과하는 각 메시지마다 evaluate 메소드를 호출합니다.

예를 들면, 메시지 처리 노드 클래스를 선언하는 코드는 다음과 같습니다.
package com.ibm.jplugins;

import com.ibm.broker.plugin.*;

public class BasicNode extends MbNode implements MbNodeInterface
다음과 같이 Workbench에서 이를 수행할 수 있습니다.
  1. 파일 > 새로 작성 > 클래스를 누르십시오.
  2. 패키지 및 클래스 이름 필드를 적절한 값으로 설정하십시오.
  3. Superclass 텍스트 필드에서 텍스트를 삭제하고 찾아보기 단추를 누르십시오.
  4. MbNode를 선택하고 확인을 누르십시오.
  5. 인터페이스 텍스트 필드 옆의 추가 단추를 누르고 MbNodeInterface를 선택하십시오.
  6. 완료를 누르십시오.

노드 구성자 정의

노드가 인스턴스화될 때, 사용자 노드 클래스의 구성자가 호출됩니다. 이때 노드의 터미널을 작성하고, 속성의 디폴트 값을 초기화해야 합니다.

한 메시지 처리 노드에는 여러 입력 터미널 및 출력 터미널이 연관되어 있습니다. 노드가 인스턴스화될 때 노드에 터미널을 추가할 때는 createInputTerminalcreateOutputTerminal 메소드가 사용됩니다. 예를 들면, 하나의 입력 터미널 및 두 개의 출력 터미널로 노드를 작성하는 코드는 다음과 같습니다.

public MyNode() throws MbException
{
		// create terminals here
		createInputTerminal ("in");
		createOutputTerminal ("out");
		createOutputTerminal ("failure");
}

메시지 데이터 액세스

많은 경우, 사용자 정의 노드는 해당 입력 터미널에서 수신된 메시지의 컨텐츠에 액세스해야 합니다. 메시지는 구문 요소의 트리로 표현됩니다. 메시지 관리, 메시지 버퍼 액세스, 구문 요소 탐색 및 구문 요소 액세스에 사용되는 evaluate 메소드에서 사용하기 위한 유틸리티 함수 그룹이 제공됩니다.

MbElement 클래스는 구문 요소로의 인터페이스를 제공합니다. Java API에 대한 자세한 내용은 Javadoc을 참조하십시오.

예를 들면, 다음 코드와 같습니다.

  1. XML 메시지의 관련 구문 요소로 이동하는 코드는 다음과 같습니다.
            MbElement rootElement = assembly.getMessage().getRootElement();
            MbElement switchElement = 
    			rootElement.getLastChild().getFirstChild().getFirstChild();
  2. 이 요소의 값이 나타내는 터미널을 선택하는 코드는 다음과 같습니다.
            String terminalName;
          String elementValue = (String)switchElement.getValue();
            if(elementValue.equals("add"))
                terminalName = "add";
            else if(elementValue.equals("change"))
                terminalName = "change";
            else if(elementValue.equals("delete"))
                terminalName = "delete";
            else if(elementValue.equals("hold"))
                terminalName = "hold";
            else
                terminalName = "failure";
        
            MbOutputTerminal out = getOutputTerminal(terminalName);

메시지 오브젝트 변환

수신된 입력 메시지는 읽기 전용이므로, 메시지를 변환하려면 해당 메시지를 새 출력 메시지에 써야 합니다. 입력 메시지로부터 요소를 복사하거나, 출력 메시지에 새 요소를 작성할 수 있습니다. 일반적으로 새 요소는 구문 분석기 도메인에 있습니다.

MbMessage 클래스는 복사 구성자, 메시지의 루트 요소를 가져오는 메소드를 제공합니다. MbElement 클래스는 구문 요소로의 인터페이스를 제공합니다.

예를 들면, 임베드된 메시지가 있는 메시지 어셈블리가 수신될 때 사용자 정의 노드의 evaluate 메소드에 다음 코드가 있어야 합니다.
  1. 새 메시지 어셈블리 및 해당 임베드된 메시지 사본을 작성하는 코드는 다음과 같습니다.
            MbMessage newMsg = new MbMessage(assembly.getMessage());
            MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
  2. XML 메시지의 관련 구문 요소로 이동하는 코드는 다음과 같습니다.
            MbElement rootElement = newAssembly.getMessage().getRootElement();
            MbElement switchElement = 
    			rootElement.getFirstElementByPath("/XML/data/action");
  3. 기존 요소 값을 변경하는 코드는 다음과 같습니다.
        String elementValue = (String)switchElement.getValue();
            if(elementValue.equals("add"))
                switchElement.setValue("change");
            else if(elementValue.equals("change"))
                switchElement.setValue("delete");
            else if(elementValue.equals("delete"))
                switchElement.setValue("hold");
            else
                switchElement.setValue("failure");
  4. 스위치 태그의 하위 태그로서 새 태그를 추가하는 코드는 다음과 같습니다.
            MbElement tag = switchElement.createElementAsLastChild(MbElement.TYPE_NAME,
                                                                                                                          "PreviousValue",
                                                                                                                          elementValue);
  5. 이 새 태그에 속성을 추가하는 코드는 다음과 같습니다.
            tag.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE,
                                                                        "NewValue",
                                                                        switchElement.getValue());
    
            MbOutputTerminal out = getOutputTerminal("out");
변환의 일부로 새 메시지 본문를 작성해야 할 수도 있습니다. 새 메시지 본문를 작성하기 위해 다음 메소드를 사용할 수 있습니다.
createElementAfter(String) 
createElementAsFirstChild(String) 
createElementAsLastChild(String) 
createElementBefore(String) 
createElementAsLastChildFromBitstream(byte[], String, String, String, String, int, int, int) 
메시지 트리 폴더에 구문 분석기를 지정하는 데 특정하므로 이런 메소드를 사용해야 합니다.
다음 메소드는 소유하고 있는 구문 분석기를 폴더와 연관시키지 않으므로 메시지 본문을 작성할 때 사용하지 마십시오.
createElementAfter(int)
createElementAfter(int, String, Object) 
createElementAsFirstChild(int) 
createElementAsFirstChild(int, String, Object) 
createElementAsLastChild(int) 
createElementAsLastChild(int, String, Object) 
createElementBefore(int) 
createElementBefore(int, String, Object) 

메시지 전달

메시지를 전달하기 전에 전달할 메시지 플로우 데이터, 데이터를 수신할 노드 터미널을 결정해야 합니다.

예를 들면,
  1. 메시지를 출력 터미널 "out"으로 전달하는 코드는 다음과 같습니다.
    MbOutputTerminal out = getOutputTerminal("out");
                    out.propagate(newAssembly);

메시지 트리에 할당된 메모리를 지우려면 최종 try/catch 블록에서 clearMessage() 함수를 호출하십시오.

노드 이름 선언

노드 이름은 Workbench에 의해 식별되기 때문에 노드 이름을 선언해야 합니다. 모든 노드 이름은 "Node"로 끝나야 합니다. 노드 이름을 선언하는 메소드는 다음과 같습니다.

public static String getNodeName()
{
      return "BasicNode";
}
이 메소드가 선언되지 않을 경우, Java API 프레임워크는 다음 규칙을 사용하여 디폴트 노드 이름을 작성합니다.
  • 클래스 이름이 패키지 이름에 추가됩니다.
  • 점이 제거되고, 각 패키지 및 클래스 이름 부분의 첫 번째 글자가 대문자로 바뀝니다.
예를 들면, 디폴트 값으로 다음 클래스에 노드 이름 "ComIbmPluginsamplesBasicNode"가 할당됩니다.
package com.ibm.pluginsamples;
public class BasicNode extends MbNode implements MbNodeInterface
{
   ...

속성 선언

Java Bean 등록 정보와 같은 방식으로 노드 속성을 선언하면 됩니다. 속성의 getter 및 setter 메소드를 작성해야 하며, API 프레임워크는 Java Bean 검토 규칙을 사용하여 속성 이름을 예상합니다. 예를 들면, 다음의 두 메소드를 선언할 경우,

private String attributeVariable;

public String getFirstAttribute()
{
    return attributeVariable;
}

publc void setFirstAttribute(String value)
{
    attributeVariable = value;
}

브로커는 노드가 firstAttribute라는 속성을 가진다고 예상합니다. 이 이름은 내부 클래스 구성원 변수 이름이 아닌 get 또는 set 메소드 이름으로부터 도출됩니다. 속성은 문자열로만 표현될 수 있으므로, get 또는 set 메소드에서 모든 숫자 유형을 문자열로(부터) 변환해야 합니다. 예를 들면, 다음 메소드는 timeInSeconds라는 속성을 정의합니다.

int seconds;

public String getTimeInSeconds()
{
    return Integer.toString(seconds);
}

public void setTimeInSeconds(String value)
{
    seconds = Integer.parseInt(value);
}

노드 기능 구현

앞에서 설명했듯이, 메시지 처리 또는 출력 노드에 대해 MbNodeInterface에 정의된 evaluate 메소드를 구현해야 합니다. 브로커는 메시지를 처리하기 위해 이 메소드를 호출합니다. 이 메소드는 노드의 모든 처리 기능을 제공합니다.

evaluate 메소드에는 브로커에 의해 전달되는 두 매개변수가 있습니다.
  1. 적절한 메소드를 통해 액세스되는 다음 오브젝트가 들어 있는 MbMessageAssembly
    • 수신되는 메시지
    • 로컬 환경
    • 전역 환경
    • 예외 목록
  2. 메시지가 도착하는 입력 터미널
예를 들면, 다음 코드 추출에서는 평가 메소드를 쓸 수 있는 방법을 보여줍니다.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException
  {
    // add message processing code here

        getOutputTerminal("out").propagate(assembly);
  }

메시지, 전역 환경, 로컬 환경 및 예외 목록으로 구성되는 메시지 플로우 데이터는 노드의 입력 터미널에서 수신됩니다.

노드의 인스턴스 삭제

다음과 같은 경우 노드 인스턴스가 삭제됩니다.
  • 브로커를 종료할 때
  • 노드 또는 노드가 포함된 메시지 플로우를 제거하고 구성을 재전개할 때
노드 삭제 중에는 소켓 닫기와 같은 삭제 조작을 수행할 수 있도록 노드에 알리는 것이 좋습니다. 노드가 선택적 onDelete 메소드를 구현할 경우, 노드가 삭제되기 바로 전에 브로커에서 이 메소드를 호출합니다.

onDelete 메소드는 다음과 같이 구현할 수 있습니다.

public void onDelete()
{
    // perform node cleanup if necessary
}
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
as09970_