참조에 의해 메시지 페이로드 전달: 생성자 및 이용자 애플리케이션의 예제 코드
단일 서버에서 생성자와 이용자 애플리케이션 사이의 비동기식 메시징을 위해 참조에 의해 메시지 페이로드를 안전하게 전달할 수 있도록 JMS 애플리케이션을 코드화하십시오.
대용량 오브젝트 메시지 또는 바이트 메시지가 전송되면, 메시지 페이로드를 직렬화, 직렬화 해제 및 복사하는 데 사용하는 메모리 및 프로세서의 비용이 커질 수 있습니다. 생성자 및 이용자 애플리케이션이 동일한 JVM에 있고 연관된 연결 팩토리 및 활성화 스펙에서 참조에 의한 메시지 페이로드 전달 특성을 사용할 수 있는 경우, 메시지 페이로드는 참조에 의해 생성자 애플리케이션에서 이용자 애플리케이션으로 전달될 수 있습니다. 이렇게 하면 데이터 복사를 줄이거나 생략하여 성능 및 메모리 사용을 향상시킬 수 있습니다.
다음 그림에서, 메시지가 생성자 연결 팩토리를 통해 JMS 생성자 애플리케이션에서 메시징 엔진의 큐로 전달됩니다. 그런 다음, 메시지가 큐에서 이용자 연결 팩토리 또는 활성화 스펙을 통해 JMS 이용자 애플리케이션으로 전달됩니다.
경고:
이러한 특성에 의해 생략된 JMS 스펙의 파트는 메시징 데이터의 무결성을 보장하도록 정의됩니다. 이러한 특성을 사용하는 모든 JMS 애플리케이션은 설명된 규칙을 엄격히 따라야 합니다. 그렇지 않으면 데이터 무결성을 잃게 됩니다.
그림 1. 메시지 생성 및 이용

생성자 연결 팩토리에 producerDoesNotModifyPayloadAfterSet
특성을 사용하면, 생성자 애플리케이션은 페이로드 오브젝트가
오브젝트 또는 바이트 메시지로 설정된 후 이를 수정하지 않도록
보장해야 합니다. 이를 수행하도록 지원하기 위해, 다음과 같이 애플리케이션에서 사용하도록
적용할 수 있는 몇 가지 예제 코드가 있습니다.
DataObject data = new DataObject();
data.setXXX("xxx");
data.setYYY(yyy);
ObjectMessage message = session.createObjectMessage();
message.setObject(data);
data = null;
producer.send(message);
또한 바이트 메시지의 경우, 생성자 애플리케이션이 단일의 전체
바이트 배열만 메시지로 작성하도록 보장해야 합니다. 이를 수행하도록 지원하기 위해, 다음과 같이 애플리케이션에서 사용하도록
적용할 수 있는 몇 가지 예제 코드가 있습니다.byte [] data = myByteData;
BytesMessage message = session.createBytesMessage();
message.writeBytes(data);
data = null;
producer.send(message);
이용자
연결 팩토리 또는 활성화 스펙에 consumerDoesNotModifyPayloadAfterGet
특성을 사용하면, 이용자 애플리케이션은 오브젝트 메시지에서 가져온
페이로드를 수정하지 않도록 보장해야 합니다. (바이트 메시지의 이용은
consumerDoesNotModifyPayloadAfterGet 특성의 영향을 받지 않습니다.)
이를 수행하도록 지원하기 위해, 다음과 같이 애플리케이션에서 사용하도록
적용할 수 있는 몇 가지 예제 코드가 있습니다.
public void onMessage (Message message)
{
ObjectMessage oMessage = (ObjectMessage) message;
DataObject data = oMessage.getObject();
System.out.print(data.getXXX());
System.out.print(data.getYYY());
}