JMS 클라이언트 개발

이 태스크를 사용하여 엔터프라이즈 애플리케이션과 통신하기 위해 메시지를 사용하는 JMS 클라이언트 애플리케이션을 개발하십시오.

이 태스크 정보

이 주제는 JMS 클라이언트 애플리케이션을 개발하는 데 필요한 단계에 대한 개요를 제공합니다. 이 주제에서는 JMS 관련 사례에 대해서만 설명합니다. 사용자가 이미 잘 알고 있어야 하는 일반적인 클라이언트 프로그래밍에 대해서는 설명하지 않습니다. 이들 단계에 대한 상세한 정보 및 JMS 클라이언트 개발의 예에 대해서는 IBM MQ Information Center의 Java™ 메시지 서비스 문서Java 사용 절을 참조하십시오.

JMS 클라이언트는 JMS 자원(예: 큐 연결 팩토리 및 큐 대상)이 이미 존재한다고 가정합니다. 클라이언트 애플리케이션은 JNDI 검색 또는 JNDI를 사용하지 않는 프로그램 방식으로 적절한 JMS 자원을 가져올 수 있습니다.

임베드 가능한 기술로, WebSphere® Application Server 기본 메시징 제공자 메시징 엔진에 대한 JMS V1.1 연결을 제공하는 WebSphere Application Server가 포함된 JMS용 씬 클라이언트에 대한 자세한 정보는 JMS를 사용하여 WebSphere Application Server 기본 메시징 제공자 메시징 엔진에 연결의 내용을 참조하십시오.

클라이언트 애플리케이션을 개발하고 이에 맞춰 JMS 자원을 구성하는 과정에 대한 자세한 정보는 J2EE 애플리케이션 클라이언트 코드 개발 및 관련 태스크를 참조하십시오.

JMS를 사용하기 위해 일반 JMS 클라이언트 프로그램은 다음과 같은 일반 단계를 완료합니다. 이 예에서는 기본적으로 JNDI 검색을 사용하여 JMS 자원을 가져옵니다.

프로시저

  1. JMS 패키지를 가져오십시오. JMS를 사용하는 엔터프라이즈 애플리케이션은 JMS에 대한 여러 개의 import 문으로 시작됩니다. 예:
    import javax.naming.Context;  
    import javax.naming.InitialContext;
    import javax.rmi.PortableRemoteObject;
    import javax.jms.*;
  2. 초기 컨텍스트를 가져옵니다.
       try     {
            ctx = new InitialContext(env);
    ...
  3. 클라이언트가 사용할 매개변수를 정의하십시오(예를 들어, 큐 연결 팩토리 식별 및 전송할 메시지 어셈블).
    public class JMSppSampleClient
    {
      public static void main(String[] args)
      throws JMSException, Exception
    
      {
        String  messageID                 = null;
        String  outString                 = null;
        String  qcfName                   = "java:comp/env/jms/ConnectionFactory";
        String  qnameIn                   = "java:comp/env/jms/Q1";
        String  qnameOut                  = "java:comp/env/jms/Q2";
        boolean verbose                   = false;
    
        QueueSession           session    = null;
        QueueConnection        connection = null;
        Context                ctx        = null;
    
        QueueConnectionFactory qcf        = null;
        Queue                  inQueue    = null;
        Queue                  outQueue   = null;
    
    ...
  4. JNDI 네임 스페이스에서 관리되는 오브젝트를 검색하십시오. InitialContext.lookup() 메소드는 관리된 오브젝트를 검색하는 데 사용됩니다(큐 연결 팩토리 및 큐 대상).
           qcf = (QueueConnectionFactory)ctx.lookup( qcfName );
    ...
           inQueue = (Queue)ctx.lookup( qnameIn );
           outQueue = (Queue)ctx.lookup( qnameOut );
    ...
  5. 메시지 전달 서비스 제공업체에 대한 연결을 작성하십시오. 연결은 기초가 되는 전송에 대한 액세스를 제공하고 세션을 작성하는 데 사용됩니다. 팩토리 오브젝트에서 createQueueConnection() 메소드는 연결을 작성하는 데 사용됩니다.
           connection = qcf.createQueueConnection();
    JMS 스펙은 중지된 상태에서 연결이 작성되도록 정의합니다. 연결이 시작될 때까지 연결과 연관된 MessageConsumer는 어떤 메시지도 수신할 수 없습니다. 연결을 시작하려면 다음 명령을 실행하십시오.
           connection.start();
  6. 메시지를 보내고 받을 세션을 작성하십시오. 세션은 MessageProducers 및 MessageConsumers를 작성하는 데 사용되는 메소드를 포함하여 메시지 생성 및 소비를 위한 컨텍스트를 제공합니다. createQueueSession 메소드는 연결에서 세션을 얻는 데 사용됩니다. 메소드에는 다음과 같은 두 개의 매개변수가 있습니다.
    • 세션이 더 이상 사용되지 않는지 여부를 결정하는 부울
    • 수신확인 모드를 결정하는 매개변수
           boolean transacted = false;
           session = connection.createQueueSession( transacted,
                                                   Session.AUTO_ACKNOWLEDGE);

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

  7. 메시지를 보냅니다.
    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);
  8. 응답을 수신하십시오.
    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();
  9. 중지 애플리케이션이 세션 레벨이나 더 하위 레벨에서 단기간 동안 유지되는 다수의 JMS 오브젝트를 작성해야 하는 경우, 사용된 모든 JMS 자원을 닫아야 합니다. 그러기 위해서는 자원이 더 이상 필요하지 않을 때 여러 클래스(QueueConnection, QueueSession, QueueSender 및 QueueReceiver)에서 close() 메소드를 호출합니다.
           queueReceiver.close();
    ...
           queueSender.close();
    ...
           session.close();
           session = null;
    ...
            connection.close();
           connection = null;
  10. 메시지 공개 및 등록 지점간 메시징 대신 공개/등록 지원을 사용하는 경우 일반적인 클라이언트 조치는 같습니다(예: 세션 및 연결 작성). 그러나 메시지를 공개하는 다음 예에서 보여주는 것과 같이 큐 자원 대신 주제 자원을 사용하는 경우는 예외입니다(예를 들어, QueueSender 대신 TopicPublisher).
    // Creating a TopicPublisher
           TopicPublisher pub = session.createPublisher(topic);
    ...
           pub.publish(outMessage);
    ...
           // Closing TopicPublisher
           pub.close();
  11. 오류 핸들링 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);
           }
        }

다음에 수행할 작업

특정 원격 서버에 대해 클라이언트를 실행하는 정보에 대해서는 launchClient로 Java EE 클라이언트 애플리케이션 실행의 내용을 참조하십시오.


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



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