58.2. 메시지 처리

58.2.1. 개요

일반적인 메시지 처리에서 인터셉터의 handleMessage() 메서드가 호출됩니다. 메시지 데이터를 Message 개체로 수신합니다. 메시지 개체는 메시지의 실제 내용과 함께 메시지 또는 메시지 처리 상태와 관련된 여러 속성을 포함할 수 있습니다. Message 오브젝트의 정확한 내용은 체인에서 현재 인터셉터 이전의 인터셉터에 따라 달라집니다.

58.2.2. 메시지 콘텐츠 가져오기

Message 인터페이스는 메시지 콘텐츠를 추출하는 데 사용할 수 있는 두 가지 방법을 제공합니다.

  • public <T> TgetContentjava.lang.Class<T > format getContent() 메서드는 지정된 클래스의 개체에 메시지 내용을 반환합니다. 콘텐츠를 지정된 클래스의 인스턴스로 사용할 수 없는 경우 null이 반환됩니다.If the contents are not available as an instance of the specified class, null is returned. 사용 가능한 콘텐츠 유형 목록은 인터셉터 체인의 인터셉터 위치 및 인터셉터 체인의 방향에 따라 결정됩니다.
  • publicCollection<Attachment> getAttachments () 메서드는 메시지와 관련된 바이너리 첨부 파일이 포함된 Java Collection 오브젝트를 반환합니다. 첨부 파일은 org.apache.cxf.message.Attachment 오브젝트에 저장됩니다. attachment 개체는 바이너리 데이터를 관리하는 방법을 제공합니다.

    중요

    첨부 파일은 인터셉터 처리 후만 사용할 수 있습니다.

58.2.3. 메시지 방향 확인

메시지의 방향은 메시지 교환을 쿼리함으로써 결정될 수 있다. 메시지 교환은 인바운드 메시지와 아웃바운드 메시지를 별도의 속성에 저장합니다.[3]

메시지와 관련된 메시지 교환은 메시지의 getExchange() 메서드를 사용하여 검색됩니다. 예 58.1. “메시지 교환 받기” 에 표시된 대로 getExchange() 는 매개 변수를 사용하지 않고 메시지 교환을 org.apache.cxf.message.Exchange 오브젝트로 반환합니다.

예 58.1. 메시지 교환 받기

ExchangegetExchange

Exchange 개체에는 교환과 관련된 메시지를 받기 위해 예 58.2. “메시지 교환에서 메시지 가져오기” 에 표시되는 네 가지 방법이 있습니다. 각 메서드는 메시지를 org.apache.cxf.Message 개체로 반환하거나 메시지가 없는 경우 null을 반환합니다.

예 58.2. 메시지 교환에서 메시지 가져오기

getIn MessageMessagegetInFaultMessage메시지getOutMessage메시지getOutFaultMessage

예 58.3. “메시지 체인의 방향 확인” 현재 메시지가 아웃바운드인지 여부를 확인하는 코드를 표시합니다. 메서드는 메시지를 교환하고 현재 메시지가 교환의 아웃바운드 메시지와 동일한지 확인합니다. 또한 exchange 아웃바운드 fault 메시지와 아웃바운드 오류 메시지와 아웃바운드 fault 체인의 오류 메시지도 확인합니다.

예 58.3. 메시지 체인의 방향 확인

public static boolean isOutbound()
{
   Exchange exchange = message.getExchange();
        return message != null
               && exchange != null
               && (message == exchange.getOutMessage()
                   || message == exchange.getOutFaultMessage());
}

58.2.4. 예제

예 58.4. “메시지 처리 방법 예” zip 압축 메시지를 처리하는 인터셉터의 코드를 표시합니다. 메시지의 방향을 확인한 다음 적절한 작업을 수행합니다.

예 58.4. 메시지 처리 방법 예

import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;

import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;

public class StreamInterceptor extends AbstractPhaseInterceptor<Message>
{

  ...

  public void handleMessage(Message message)
  {

        boolean isOutbound = false;
        isOutbound = message == message.getExchange().getOutMessage()
               || message == message.getExchange().getOutFaultMessage();

        if (!isOutbound)
        {
          try
          {
             InputStream is = message.getContent(InputStream.class);
             GZIPInputStream zipInput = new GZIPInputStream(is);
             message.setContent(InputStream.class, zipInput);
          }
          catch (IOException ioe)
          {
             ioe.printStackTrace();
           }
        }
         else
        {
         // zip the outbound message
        }
    }
  ...
}


[3] 또한 인바운드 및 아웃바운드 오류를 별도로 저장합니다.