58.2. 메시지 처리
58.2.1. 개요
일반적인 메시지 처리에서는 인터셉터의 handleMessage()
메서드가 호출됩니다. 메시지 데이터를 Message 오브젝트로 수신합니다. Message 개체는 메시지의 실제 내용과 함께 메시지 또는 메시지 처리 상태와 관련된 여러 속성을 포함할 수 있습니다. Message 오브젝트의 정확한 내용은 체인의 현재 인터셉터 앞의 인터셉터에 따라 달라집니다.
58.2.2. 메시지 콘텐츠 가져오기
Message 인터페이스는 메시지 내용을 추출하는 데 사용할 수 있는 두 가지 메서드를 제공합니다.
-
public <
T> T
getContent
java.lang.Class<T
>형식
getContent()
메서드는 지정된 클래스의 오브젝트에 있는 메시지의 내용을 반환합니다. 콘텐츠를 지정된 클래스의 인스턴스로 사용할 수 없는 경우 null이 반환됩니다. 사용 가능한 콘텐츠 유형 목록은 인터셉터 체인의 인터셉터 위치와 인터셉터 체인의 방향에 따라 결정됩니다. public
Collection<
Attachment>
메서드는 메시지와 연결된 바이너리 첨부 파일이 포함된 JavagetAttachments
()Collection
오브젝트를 반환합니다. 첨부 파일은 org.apache.cxf.message.Attachment 오브젝트에 저장됩니다. attachment 오브젝트는 바이너리 데이터를 관리하는 방법을 제공합니다.중요첨부 파일은 첨부 처리 인터셉터가 실행된 후에만 사용할 수 있습니다.
58.2.3. 메시지의 방향 확인
메시지 교환을 쿼리하여 메시지 방향을 결정할 수 있습니다. 메시지 교환은 인바운드 메시지와 아웃바운드 메시지를 별도의 속성에 저장합니다.[3]
메시지와 연결된 메시지 교환은 메시지의 getExchange()
메서드를 사용하여 검색됩니다. 예 58.1. “메시지 교환 가져오기” 에 표시된 대로 getExchange()
는 매개변수를 사용하지 않고 메시지 교환을 org.apache.cxf.message.Exchange 오브젝트로 반환합니다.
예 58.1. 메시지 교환 가져오기
Exchange
getExchange
교환 오브젝트에는 교환과 관련된 메시지를 받기 위해 예 58.2. “메시지 교환에서 메시지 가져오기” 에 표시된 네 가지 방법이 있습니다. 각 메서드는 메시지를 org.apache.cxf.Message 오브젝트로 반환하거나 메시지가 없는 경우 null을 반환합니다.
예 58.2. 메시지 교환에서 메시지 가져오기
message
getInMessage
Message
getInFaultMessage
Message
getOutMessage
Message
getOutFaultMessage
예 58.3. “메시지 체인의 방향 확인” 현재 메시지가 아웃바운드인지 확인하기 위한 코드를 표시합니다. 이 메서드는 메시지 교환을 가져오고 현재 메시지가 교환의 아웃 바운드 메시지와 동일한지 확인합니다. 또한 아웃바운드 오류 오류 메시지를 아웃바운드 오류 가로채기 체인의 오류 메시지에 대해 현재 메시지를 확인합니다.
예 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 } } ... }