JMS를 사용하는 엔터프라이즈 애플리케이션 개발

이 태스크를 사용하여 비동기 메시징을 위해 JMS API를 직접 사용하는 엔터프라이즈 애플리케이션을 개발하십시오.

이 태스크 정보

이 주제에서는 비동기 메시징을 위해 JMS API를 직접 사용하는 엔터프라이즈 애플리케이션(서블릿 또는 엔터프라이즈 Bean)을 개발하는 데 필요한 단계에 대한 개요를 제공합니다.

이 주제에서는 JMS 관련 사례에 대해서만 설명합니다. 사용자가 이미 잘 알고 있어야 하는 일반적인 엔터프라이즈 애플리케이션 프로그래밍에 대해서는 설명하지 않습니다. 이 단계 및 JMS 사용을 위한 엔터프라이즈 애플리케이션 개발 예제에 대한 자세한 정보는 Java™ Message Service 문서를 참조하십시오.

엔터프라이즈 애플리케이션에서 사용하는 JMS 자원의 세부사항은 WebSphere® Application Server에 정의되고 WebSphere Application Server 관리 지원에 의해 JNDI 네임스페이스로 바인드됩니다.

JMS를 사용하려면 다음과 같은 일반 단계를 완료하십시오.

프로시저

  1. JMS 패키지를 가져오십시오. JMS를 사용하는 엔터프라이즈 애플리케이션은 JMS을 위한 수많은 import 문으로 시작하며, 다음 명령문을 적어도 포함해야 합니다.
    import javax.jms.*;       //JMS interfaces 
    import javax.naming.*;    //Used for JNDI lookup of administered objects
  2. 초기 컨텍스트를 가져오십시오.
       try     {
            ctx = new InitialContext(env);
    ...
  3. JNDI 네임 스페이스에서 관리되는 오브젝트를 검색하십시오. InitialContext.lookup() 메소드는 관리된 오브젝트(JMS 연결 팩토리와 JMS 대상)를 검색하는데 사용됩니다. 다음 예제는 큐로부터 메시지를 받는 방법을 표시합니다.
           qcf = (QueueConnectionFactory)ctx.lookup( qcfName );
    ...
           inQueue = (Queue)ctx.lookup( qnameIn );
    ...
    JNDI 찾아보기를 통해 관리적으로 정의된 JMS 대상 오브젝트를 확보하기 위한 대체(보다 제어하기 힘듬) 접근법은 Session.createQueue(문자열) 메소드나 Session.createTopic(문자열) 메소드를 사용하는 것입니다. 예를 들어, 다음과 같습니다.
    Queue q = mySession.createQueue("Q1");
    는 기존 대상 Q1을 참조하는 데 사용될 수 있는 JMS 대기열 인스턴스를 작성합니다.

    가장 간단한 양식으로 된 이들 작성 메소드에 대한 매개변수는 기존 목적지의 이름입니다. 상황이 보다 복잡한 경우 애플리케이션은 임의의 수 이름 값 쌍을 제공하여 JMS 목적지 오브젝트의 다양한 등록 정보를 설정하는 URI 기반 형식을 사용할 수 있습니다.

  4. 메시지 전달 서비스 제공업체에 대한 연결을 생성하십시오. 연결은 기초가 되는 전송에 대한 액세스를 제공하고 세션을 작성하는 데 사용됩니다. 팩토리 오브젝트에서 createQueueConnection() 메소드는 연결을 작성하는 데 사용됩니다.
           connection = qcf.createQueueConnection();
    JMS 스펙은 중지된 상태에서 연결이 작성되도록 정의합니다. 연결이 시작될 때까지 연결과 연관된 MessageConsumer는 어떤 메시지도 수신할 수 없습니다. 연결을 시작하려면 다음 명령을 실행하십시오.
           connection.start();
  5. 메시지 송수신 세션을 작성합니다. 세션은 MessageProducers 및 MessageConsumers를 작성하는 데 사용되는 메소드를 포함하여 메시지 생성 및 소비를 위한 컨텍스트를 제공합니다. createQueueSession 메소드는 연결에서 세션을 얻는 데 사용됩니다. 메소드에는 다음과 같은 두 개의 매개변수가 있습니다.
    • 세션이 더 이상 사용되지 않는지 여부를 결정하는 부울
    • 수신확인 모드를 결정하는 매개변수
           boolean transacted = false;
           session = connection.createQueueSession( transacted,
                                                   Session.AUTO_ACKNOWLEDGE);

    이 예에서, 세션은 더 이상 사용되지 않으므로 수신된 메시지를 자동으로 수신 확인해야 합니다. 이러한 설정을 사용하면 시스템 오류가 발생한 후 또는 애플리케이션이 갑자기 종료되는 경우에만 메시지가 취소됩니다.

    EJB 스펙에 정의된 대로 다음의 사항이 이러한 플래그에 적용됩니다.
    • createQueueSession에 전달된 트랜잭션 플래그는 글로벌 트랜잭션 내에서 무시되고, 모든 작업은 트랜잭션의 일부로 수행됩니다. 트랜잭션 외부에서 트랜잭션 플래그는 사용되고, true로 설정된 경우 애플리케이션은 session.commit() 및 session.rollback()을 사용하여 작업 완료를 제어합니다. EJB2.0 모듈에서 트랜잭션 플래그가 true로 설정되어 있고 XA 트랜잭션 외부에 있으면 세션은 WebSphere 로컬 트랜잭션에 포함되고, 애플리케이션에 의해 커미트되거나 롤백되지 않은 경우에는 메소드의 분석되지 않은 조치 속성이 JMS 작업에 적용됩니다.
    • 클라이언트는 수신 확인 메시지에 Message.acknowledge()를 사용할 수 없습니다. CLIENT_ACKNOWLEDGE의 값이 createxxxSession 호출 시 전달되는 경우, Application Server에서 자동으로 메시지를 수신확인하며 Message.acknowledge()는 사용되지 않습니다.
  6. 메시지를 전송합니다.
    1. MessageProducers를 생성하여 메시지를 작성하십시오. 지점간 메시징의 경우, MessageProducer는 출력 큐 오브젝트(이전에 검색됨)를 세션의 createSender 메소드로 전달함으로써 작성되는 QueueSender입니다. QueueSender는 대개 특정 큐에 대해 작성되어 해당 전송자에 의해 전송된 모든 메시지가 같은 대상으로 전송되도록 합니다.
             QueueSender queueSender = session.createSender(inQueue);
    2. 메시지를 작성합니다. 비어 있는 메시지를 작성하고 전달된 데이터를 추가하려면 세션을 사용하십시오.

      JMS는 여러 가지 메시지 유형을 제공하며, 각 유형은 해당 컨텐츠의 몇 가지 정보를 포함합니다. 메시지 유형에 대한 공급업체 특정 클래스 이름을 참조하지 않기 위해 메시지 작성을 위해 세션 오브젝트에 메소드가 제공됩니다.

      이 예에서, 텍스트 메시지는 outString 특성으로부터 작성됩니다.
             TextMessage outMessage = session.createTextMessage(outString);
    3. 메시지를 보냅니다.
      메시지를 전송하기 위해 메시지가 QueueSender의 send 메소드로 전달됩니다.
             queueSender.send(outMessage);
  7. 응답을 수신하십시오.
    1. 상관 ID를 작성하여 응답으로 전송된 메시지를 링크하십시오. 이 예에서, 클라이언트는 JMSCorrelationID에 있는 프로바이더 특정 메시지 ID를 사용하여 전송한 메시지와 관련된 응답 메시지를 수신합니다.
             messageID = outMessage.getJMSMessageID();
      그런 다음, 상관 ID는 메시지 선택기에서 사용되어 해당 ID를 갖는 메시지만 선택합니다.
             String selector = "JMSCorrelationID = '"+messageID+"'";
    2. MessageReceiver를 작성하여 메시지를 수신하십시오. 지점간 메시징의 경우, MessageReceiver는 입력 대기열 오브젝트(이전에 검색됨) 및 메시지 선택기를 세션의 createReceiver 메소드로 전달함으로써 작성되는 QueueReceiver입니다.
             QueueReceiver queueReceiver = session.createReceiver(outQueue, selector);
    3. 응답 메시지를 검색하십시오. 응답 메시지를 검색하기 위해 QueueReceiver의 receive 메소드가 사용됩니다.
             Message inMessage = queueReceiver.receive(2000);

      수신 호출의 매개변수는 제한시간 초과(밀리초)입니다. 이 매개변수는 즉시 사용할 수 있는 메시지가 없을 경우 메소드가 대기하는 기간을 정의합니다. 이 매개변수를 생략하면 호출이 무기한으로 차단됩니다. 지연되기를 원하지 않으면 receiveNoWait() 메소드를 사용하십시오. 이 예에서, 수신 호출은 메시지가 도달할 때 또는 2000ms 후 중 더 빠른 시간에 리턴됩니다.

    4. 수신된 메시지에 대한 작업을 수행하십시오. 메시지를 수신하면 클라이언트의 비즈니스 로직에 필요한 대로 메시지에 대해 작업을 수행할 수 있습니다. 일부의 일반적인 JMS 조치는 메시지 유형이 올바른지 점검하고 메시지 내용을 추출하는 것입니다. 메시지 본문에서 내용을 추출하려면 일반 메시지 클래스(수신 메소드의 선언된 리턴 유형)에서 TextMessage와 같은 더 구체적인 서브클래스로 캐스트해야 합니다. 예기치 않은 오류를 적절하게 처리할 수 있도록 메시지 클래스를 캐스트하기 전에 항상 테스트하는 것이 바람직합니다.

      다음 예에서 instanceof 연산자는 수신된 메시지가 TextMessage 유형인지 확인하는 데 사용됩니다. 그런 다음, TextMessage 서브클래스로 캐스트하여 메시지 컨텐츠가 추출됩니다.

             if ( inMessage instanceof TextMessage )
      
      ...
                 String replyString = ((TextMessage) inMessage).getText();
  8. 중지 애플리케이션이 세션 레벨이나 더 하위 레벨에서 단기간 동안 유지되는 다수의 JMS 오브젝트를 작성해야 하는 경우, 사용된 모든 JMS 자원을 닫아야 합니다. 그러기 위해서는 자원이 더 이상 필요하지 않을 때 여러 클래스(QueueConnection, QueueSession, QueueSender 및 QueueReceiver)에서 close() 메소드를 호출합니다.
           queueReceiver.close();
    ...
           queueSender.close();
    ...
           session.close();
           session = null;
    ...
            connection.close();
           connection = null;
  9. 메시지에 공개 및 등록 지점간 메시징 대신 JMS 공개/등록 지원을 사용하려는 경우 일반적인 조치는 같습니다(예: 세션 및 연결 작성). 그러나 메시지를 공개하는 다음 예에서 보여주는 것과 같이 큐 자원 대신 주제 자원을 사용하는 경우는 예외입니다(예를 들어, QueueSender 대신 TopicPublisher).
    // Creating a TopicPublisher
           TopicPublisher pub = session.createPublisher(topic);
    ...
           pub.publish(outMessage);
    ...
           // Closing TopicPublisher
           pub.close();
  10. 오류 핸들링 JMS 런타임 오류는 예외에 의해 보고됩니다. JMS에서 대부분의 메소드는 JMSExceptions를 발생시켜 오류를 나타냅니다. 이러한 예외를 캐치하여 적합한 출력에 표시하는 것도 좋은 프로그래밍 습관입니다.

    일반 Java 예외와는 달리, JMSException에는 임베드되는 다른 예외가 포함될 수 있습니다. JMSException 구현에는 toString() 메소드의 출력에 임베드되는 예외가 포함되지 않습니다. 그러므로 다음 예제에서처럼 임베디드 예외를 명시적으로 확인하여 인쇄해야 합니다.

        catch (JMSException je)
        {
           System.out.println("JMS failed with "+je);
           Exception le = je.getLinkedException();
           if (le != null)
           {
               System.out.println("linked exception "+le);
           }
        }

다음에 수행할 작업

애플리케이션을 패키지화한 후 다음으로 JMS를 사용하기 위해 엔터프라이즈 애플리케이션 배치에서 설명된 대로 애플리케이션을 WebSphere Application Server에 배치할 수 있습니다.

주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tmj_devap
파일 이름:tmj_devap.html