참조에 의해 메시지 페이로드 전달: 전달 애플리케이션에 대한 사용법 시나리오 및 예제 코드
JMS 전달자 애플리케이션은 메시지를 수신한 후(연결 팩토리를 통해, 또는 메시지가 활성화 스펙을 통한 메시지 구동 Bean인 경우), 메시지 오브젝트를 다른 대상으로 전송합니다. 여러 사용법 시나리오를 탐색한 후, 단일 서버에서 하나의 큐에서 다른 큐로 메시지를 전달할 때 참조에 의해 메시지 페이로드를 안전하게 전달할 수 있도록 JMS 전달 애플리케이션을 코드화하십시오.
대용량 오브젝트 메시지 또는 바이트 메시지가 전송되면, 메시지 페이로드를 직렬화, 직렬화 해제 및 복사하는 데 사용하는 메모리 및 프로세서의 비용이 커질 수 있습니다. 연결 팩토리 또는 활성화 스펙에서 참조에 의한 메시지 페이로드 전달 특성을 사용하면, 기본 메시징 제공자가 JMS 1.1 스펙을 대체하고 이 데이터의 복사를 줄이거나 생략하도록 합니다.
다음 그림에서, 메시지가 이용자 활성화 스펙 또는 연결 팩토리를 통해 메시징 엔진의 queue1에서 JMS 전달 애플리케이션으로 전달됩니다. 그런 다음, 메시지가 생성자 연결 팩토리를 통해 동일한 메시징 엔진에 있는 queue2로 전달됩니다.

- 전달 애플리케이션은 메시지 오브젝트를 바꾸지 않습니다. 이는 애플리케이션이 로깅하거나, 메시지를 전달하기 전에 기록(예: 인쇄)할 때 유용하며, 또한 전달된 메시지가 JMSCorrelationID, JMSReplyTo 및 JMSType 특성과 같은 일부 유용한 메시지 특성을 유지함을 의미합니다.
- 전달 애플리케이션은 메시지 페이로드를 수정하거나 바꿀 수 있습니다. 페이로드를 바꾸는 경우, 메시지 오브젝트에 있는 새 페이로드를 설정하고 새 메시지 페이로드를 나타내도록 페이로드 참조를 변경합니다.
- 전달 애플리케이션의 경우, 전달된 메시지가 이용자 연결 팩토리 또는 활성화 스펙에 의해 "작성"되고 구성됩니다. 생성자 연결 팩토리는 전달된 메시지를 라우트하는 데만 사용되며 전달된 메시지의 내용에 영향을 주지 않습니다.
다음 표는 "참조에 의한 메시지 페이로드 전달" 특성을 설정하는 방법에 영향을 주는 네 가지 전달 애플리케이션 사용법 시나리오에 대해 설명합니다. 생성자 연결 팩토리가 전달된 메시지의 내용에 영향을 주지 않기 때문에, 이용자 연결 팩토리 또는 활성화 스펙에 이용자 특성 및 생성자/전달자 특성을 설정합니다.
전달 애플리케이션 사용법 시나리오 | consumerDoesNotModify |
producerDoesNotModify forwarderDoesNotModify |
---|---|---|
시나리오 1: 애플리케이션이 메시지를 수신하고 페이로드를 살펴보지만 수정은 하지 않으며, 페이로드를 수정하거나 바꾸지 않고 메시지를 전달합니다. | 사용 가능 | 필요하지 않지만 사용 가능하게 할 수 있음 |
시나리오 2: 애플리케이션이 메시지를 수신하고 페이로드를 살펴보지만 수정은 하지 않으며, 메시지의 페이로드를 새 페이로드로 바꾸고, 페이로드를 메시지에 설정하도록 호출한 후 페이로드를 수정하지 않고 메시지를 전달합니다. | 사용 가능 | 사용 가능 |
시나리오 3: 애플리케이션이 메시지를 수신하고, 페이로드를 살펴보고 수정한 후, 수정된 페이로드 또는 기타 데이터를 메시지로 다시 설정하며, 페이로드를 메시지에 설정하도록 호출한 후 페이로드를 추가 수정하지 않고 메시지를 전달합니다. | 사용 가능하지 않음 | 사용 가능 |
시나리오 4: 애플리케이션이 메시지를 수신하고, 페이로드를 살펴보고 수정한 후, 수정된 페이로드 또는 기타 데이터를 메시지로 다시 설정하며, 페이로드를 메시지에 설정하도록 호출한 후 페이로드를 추가 수정합니다. | 사용 가능하지 않음 | 사용 가능하지 않음 |
시나리오 1, 2 및 3에서 전달 애플리케이션이 시나리오에 설명된 대로 작동하도록 보장할 수 있는 경우, 하나 이상의 "참조에 의한 메시지 페이로드 전달" 특성을 사용할 수 있습니다. 이를 수행하도록 지원하기 위해, 여기에 애플리케이션에서 사용하도록 적용할 수 있는 예제 코드가 있습니다.
전달 애플리케이션: 시나리오 1
애플리케이션이 메시지를 수신하고, 페이로드를 살펴보지만 이를 수정하지 않으며, 페이로드를 수정 또는 바꾸지 않고 메시지를 전달합니다.
public void onMessage (Message message)
{
ObjectMessage oMessage = (ObjectMessage) message;
DataObject data = oMessage.getObject();
System.out.print(data.getXXX());
System.out.print(data.getYYY());
// get a session to forward on the received message
producer.send(message);
session.close();
}
전달 애플리케이션: 시나리오 2
애플리케이션이 메시지를 수신하고 페이로드를 살펴보지만 수정은 하지 않으며, 메시지의 페이로드를 새 페이로드로 바꾸고, 페이로드를 메시지에 설정하도록 호출한 후 페이로드를 수정하지 않고 메시지를 전달합니다.
public void onMessage (Message message)
{
ObjectMessage oMessage = (ObjectMessage) message;
DataObject data = oMessage.getObject();
System.out.print(data.getXXX());
System.out.print(data.getYYY());
// get a session to forward on the received message
message.setObject(newData);
producer.send(message);
session.close();
}
바이트 메시지의 경우, 또한 애플리케이션에서 단일의 전체 바이트 배열만 메시지로 작성하도록 보장해야 합니다. byte [] data = myByteData;
BytesMessage message = session.createBytesMessage();
message.writeBytes(data);
data = null;
producer.send(message);
전달 애플리케이션: 시나리오 3
애플리케이션이 메시지를 수신하고, 페이로드를 살펴보고 수정한 후, 수정된 페이로드 또는 기타 데이터를 메시지로 다시 설정하며, 페이로드를 메시지에 설정하도록 호출한 후 페이로드를 추가 수정하지 않고 메시지를 전달합니다.
public void onMessage (Message message)
{
ObjectMessage oMessage = (ObjectMessage) message;
DataObject data = oMessage.getObject();
System.out.print(data.getXXX());
System.out.print(data.getYYY());
// get a session to forward on the received message
data.setXXX(xxx);
data.setYYY(yyy);
message.setObject(data);
producer.send(message);
session.close();
}
바이트 메시지의 경우, 또한 애플리케이션에서 단일의 전체 바이트 배열만 메시지로 작성하도록 보장해야 합니다. byte [] data = myByteData;
BytesMessage message = session.createBytesMessage();
message.writeBytes(data);
data = null;
producer.send(message);