참조에 의해 JMS 메시지 페이로드를 전달하는 이유 및 시기
대용량 오브젝트 메시지 또는 바이트 메시지가 전송되면, 메시지 페이로드를 직렬화, 직렬화 해제 및 복사하는 데 사용하는 메모리 및 프로세서의 비용이 커질 수 있습니다. 연결 팩토리 또는 활성화 스펙에서 참조에 의한 메시지 페이로드 전달 특성을 사용하면, 기본 메시징 제공자가 JMS 1.1 스펙을 대체하고 이 데이터의 복사를 줄이거나 생략하도록 합니다.
백그라운드
JMS 1.1 스펙은 오브젝트 메시지가 값에 따라 전달됨을 나타냅니다. 이는 클라이언트 애플리케이션이 오브젝트를 설정한 후 수정하는 경우, WebSphere® Application Server의 기본 메시징 제공자와 같은 JMS 제공자가 오브젝트가 메시지 페이로드로 설정될 때 ObjectMessage에 있는 오브젝트를 복사해야 함을 의미합니다. 실제로 이는 복사하는 것이 가장 안전한 방법이므로 오브젝트를 직렬화함을 의미합니다. 또한 스펙은 이용자 애플리케이션이 메시지에서 데이터를 가져올 때 JMS 제공자가 해당 데이터의 사본을 작성 및 리턴해야 함을 의미합니다.
"참조에 의해 메시지 페이로드 전달" 특성을 사용하는 경우, JMS 메시징을 위한 메모리 및 성능 향상 효과를 얻을 수 있습니다.
- 이러한 특성에 의해 생략된 JMS 스펙의 파트는 메시징 데이터의 무결성을 보장하도록 정의됩니다.
- 이러한 특성을 사용하는 JMS 애플리케이션은 이 절에서 나중에 나오는 세부사항에 설명된 규칙을 엄격히 준수해야 합니다. 그렇지 않으면 데이터 무결성을 잃을 수 있습니다.
- 이러한 특성을 사용하기 전에 전체 주제를 읽고 이해해야 합니다.
- producerDoesNotModifyPayloadAfterSet(연결 팩토리의 경우) 또는 forwarderDoesNotModifyPayloadAfterSet(활성화 스펙의 경우)
- 이 특성이 사용 가능하면 연결 팩토리에 의해 생성되거나 활성화 스펙을 통해 전달된 오브젝트 또는 바이트 메시지는 메시지로 설정된 경우 복사되지 않으며 꼭 필요한 경우에만 직렬화됩니다. 이와 같은 메시지를 전송하는 애플리케이션에서는 데이터가 메시지로 설정된 후 이를 수정해서는 안 됩니다.
- consumerDoesNotModifyPayloadAfterGet
- 이 특성이 사용 가능하면 연결 팩토리 또는 활성화 스펙을 통해 수신된 오브젝트 메시지가 꼭 필요한 경우에만 직렬화됩니다. 해당 메시지에서 얻어진 데이터는 애플리케이션에서 수정하지 않아야 합니다.
참조에 의한 메시지 페이로드 전달의 잠재적 이점
- JMS 애플리케이션은 이 주제의 다음 섹션에 설명된 규칙을 따라야 합니다.
- 메시지 생성자 및 이용자 애플리케이션은 이러한 애플리케이션에 의해 사용된 대상을 호스트하는 메시징 엔진과 함께 동일한 JVM(서버)에서 실행됩니다.
- 애플리케이션이 여러 서버 또는 z/OS® 플랫폼(WebSphere Application Server가 다중 JVM에서 실행되는 위치)에서 실행되는 경우, 오브젝트 메시지가 직렬화되며 이러한 메시지에 대한 성능의 이점은 없습니다. 바이트 메시지의 이점은 여전히 존재합니다.
- 메시지를 직렬화할 수 있는 많은 내부 런타임 조건이 있어서 구성이 이 주제에 설명된 모든 조건을 충족시키는 경우에도 "참조에 의한 메시지 페이로드 전달" 특성을 사용하여 얻어지는 이점이 거의 없습니다.
잠재적 성능 이점의 정도 | 구성 및 런타임 이벤트 | 데이터 복사 시기 |
---|---|---|
잠재적 이점 없음 | "참조에 의한 메시지 페이로드 전달" 특성을 사용할 수 없습니다(기본 동작). |
오브젝트 메시지 데이터는 메시지로 설정되자마자 그리고 메시지에서 검색될 때 복사됩니다. 바이트 메시지 데이터는 메시지로 설정되자마자 그리고 메시지에서 검색될 때 복사됩니다. |
일부 잠재적 이점 | "참조에 의한 메시지 페이로드 전달" 특성을 사용할 수 있습니다. 다음 조건 중 하나 또는 모두 참입니다.
|
바이트 메시지 데이터는 필요할 때만 복사됩니다. |
최대의 잠재적 이점 | "참조에 의한 메시지 페이로드 전달" 특성을 사용할 수 있으며 다음 조건 모두가 참입니다.
|
바이트 메시지 데이터는 필요할 때만 복사됩니다. |
JMS 애플리케이션이 따라야 하는 규칙
"참조에 의해 메시지 페이로드 전달" 특성으로 생략되는 JMS 스펙의 파트는 메시지 데이터 무결성을 보장하도록 정의됩니다. JMS 애플리케이션이 다음 테이블에 주어진 규칙을 따르는 경우, 애플리케이션이 사용하는 연결 팩토리 및 활성화 스펙에서 "참조에 의한 메시지 페이로드 전달" 특성을 안전하게 사용할 수 있습니다.
해당 규칙을 따르지 않는 JMS 애플리케이션의 "참조에 의한 메시지 페이로드 전달" 특성을 사용하는 경우, 애플리케이션이 예외를 수신하거나 메시지 데이터의 무결성이 형성됩니다.
애플리케이션 유형 | 규칙 |
---|---|
JMS 생성자 애플리케이션 | 오브젝트 메시지를 전송하는 JMS 생성자 애플리케이션은 오브젝트가 메시지의 페이로드로 설정된 후 오브젝트를 변경해서는 안 됩니다. 바이트 메시지를
전송하는 JMS 생성자 애플리케이션은 다음과 같아야 합니다.
|
JMS 이용자 애플리케이션 | 오브젝트 메시지를 수신하는 JMS 이용자 애플리케이션은 메시지에서 얻어지는 페이로드를 변경해서는 안 됩니다. |
JMS 전달자 애플리케이션 참고: JMS 전달자 애플리케이션은 메시지를 수신한 후(연결 팩토리를 통해, 또는 메시지가 활성화 스펙을 통한 메시지 구동 Bean인 경우), 메시지 오브젝트를 다른 대상으로 전송합니다.
|
수신된 메시지의 페이로드를 새 페이로드로 대체하는 JMS 전달자
애플리케이션은 다음과 같아야 합니다.
|
오브젝트 메시지를 직렬화할 수 있도록 보장
보통 JMS 메시징 조건(즉, "참조에 의해 메시지 페이로드 전달" 특성이 사용 가능하지 않은 경우)에서 오브젝트 메시지의 데이터는 오브젝트가 예를 들어, 설정 또는 전송 시 메시징 시스템으로 전달되면 바로 직렬화됩니다. 메시지 페이로드를 직렬화할 수 없는 경우, 예외 메시지가 즉시 클라이언트 애플리케이션으로 리턴됩니다.
"참조에 의한 메시지 페이로드 전달" 특성을 사용할 수 있는 경우, 메시지 페이로드가 직렬화 시도 없이 클라이언트 애플리케이션에서 허용됩니다. 시스템에서 나중에 데이터를 직렬화할 수 없음이 발견되면, 시스템이 클라이언트 애플리케이션에 더이상 메시지가 전송되었음을 알릴 수 없습니다. 데이터가 직렬화할 수 없기 때문에 시스템에서는 완전한 메시지를 보존하거나 전송할 수 없습니다. 메시지 및 해당 특성이 저장되지만, 메시지 안의 사용자 데이터(페이로드)는 저장할 수 없고 폐기합니다. 시스템에서 오브젝트 메시지를 중개의 데이터 그래프로 변환할 때 직렬화 문제가 있는 경우, 메시지 페이로드가 버려지고 중개가 널(null)로 설정된 데이터 값 세트가 있는 메시지를 수신합니다.
데이터를 직렬화할 수 없는 경우, 손실됩니다. 따라서 "참조에 의한 메시지 페이로드 전달"을 사용하지 않고 먼저 구성을 테스트하여 시스템에 전송된 모든 데이터가 직렬화 가능한지 확인해야 합니다.
- CWSIK0200E: "{0}" 클래스의 오브젝트는 메시지 페이로드로 설정되어 있지만 직렬화할 수 없습니다.
- 설명: 연결 팩토리에서 사용 가능한 producerDoesNotModifyPayloadAfterSet 플래그와 함께 전송된 오브젝트 메시지는 시스템에서 직렬화할 수 없는 페이로드와 함께 전송됩니다. 이 메시지 데이터가 손실됩니다.
- 조치: 연결 팩토리에서 producerDoesNotModifyPayloadAfterSet를 사용 불가능하게 하십시오. 사용 가능한 플래그가 없는 경우, 오브젝트를 메시지로 설정하는 JMS 애플리케이션이 직렬화 예외를 즉시 수신합니다.
- JMS_IBM_ExceptionReason
- SIRCConstants.SIRC0200_OBJECT_FAILED_TO_SERIALIZE
- JMS_IBM_ExceptionTimestamp
- System.currentTimeMillis() 양식에서 오브젝트가 직렬화하는 데 실패한 시간입니다.
- JMS_IBM_ExceptionMessage
- 이전에 설명된 메시지 CWSIK0200E입니다.
- SI_ExceptionReason
- SIRC0200_OBJECT_FAILED_TO_SERIALIZE
- SI_ExceptionTimestamp
- System.currentTimeMillis() 양식에서 오브젝트가 직렬화하는 데 실패한 시간입니다.
- SI_ExceptionInserts
- 하나의 항목이 포함된 문자열 배열입니다. 항목이 오브젝트의 클래스 이름입니다.