참조용으로 메시지 페이로드 전달: 애플리케이션 전달을 위한 사용법 시나리오 및 예제 코드

JMS 전달자 응용프로그램은 메시지를 수신한 후(연결 팩토리를 통해, 또는 메시지가 활성화 스펙을 통한 메시지 구동 Bean인 경우), 메시지 오브젝트를 다른 대상으로 전송합니다. 다른 사용법 시나리오를 탐색한 후 단일 서버 내의 한 큐에서 다른 큐로 메시지를 전달할 때 참조로 메시지 페이로드를 안전하게 전달할 수 있도록 JMS 전달 애플리케이션을 코딩하십시오.

대용량 오브젝트 메시지 또는 바이트 메시지가 전송되면, 메시지 페이로드를 직렬화, 직렬화 해제 및 복사하는 데 사용하는 메모리 및 프로세서의 비용이 커질 수 있습니다. 연결 팩토리 또는 활성화 스펙에서 pass message payload by reference 특성을 사용하는 경우, 기본 메시징 제공자에게 JMS 1.1 스펙을 대체하고 잠재적으로 이 데이터 복사를 줄이거나 생략하도록 지시합니다.

다음 그림에서 이용자 활성화 스펙 또는 연결 팩토리를 통해 메시징 엔진의 queue1에서 JMS 전달 애플리케이션으로 메시지가 전달됩니다. 그런 다음 생성자 연결 팩토리를 통해 동일한 메시징 엔진의 queue2로 전달됩니다.

주의:
이러한 특성에 의해 생략된 JMS 스펙의 파트는 메시징 데이터의 무결성을 보장하도록 정의됩니다. 이러한 특성을 사용하는 모든 JMS 애플리케이션은 설명된 규칙을 엄격히 따라야 합니다. 그렇지 않으면 데이터 무결성을 잃게 됩니다.
그림 1. 메시지 전달
이 그림은 한 큐에서 다른 큐로의 메시지 플로우를 보여줍니다. queue1에서 메시지는 이용자 활성화 스펙 또는 연결 팩토리 특성을 통해 JMS 전달 애플리케이션으로
전달됩니다. JMS 전달 응용프로그램에서 메시지는 생성자 연결 팩토리 등록 정보를 통해 queue2 로 전달됩니다.
사용법 시나리오 및 이 주제에서 제공되는 연관된 예 코드를 이해하려면 JMS 전달 애플리케이션의 이 중요한 특성을 알아야 합니다.
  • 전달 애플리케이션은 메시지 오브젝트를 대체하지 않습니다. 이는 애플리케이션이 단순히 로깅만하거나 전달 전에 메시지를 기록(예: 인쇄)하는 경우에는 유용하며 전달된 메시지가 JMSCorrelationID, JMSReplyTo, JMSType 특성과 같이 일부 유용한 메시지를 보유하는 것도 의미합니다.
  • 전달 애플리케이션은 메시지 페이로드를 수정하거나 대체할 수 있습니다. 페이로드를 대체하는 경우 메시지 오브젝트에 새 페이로드를 설정하고 페이로드 참조를 새 메시지 페이로드를 지시하도록 변경합니다.
  • 전달 애플리케이션의 경우 전달된 메시지는 이용자 연결 팩토리 또는 활성화 스펙으로 작성되고 구성됩니다. 생성자 연결 팩토리는 전달된 메시지를 라우트하는 데만 사용되며 전달된 메시지의 컨텐츠에는 영향을 주지 않습니다.

다음 표에서는 pass message payload by reference 특성을 설정하는 방법에 영향을 주는 네 가지 전달 애플리케이션 사용법 시나리오에 대해 설명합니다. 생성자 연결 팩토리는 전달 메시지 컨텐츠에 아무런 영향을 주지 않기 때문에 이용자 특성 및 생성자/전달자 특성을 이용자 연결 팩토리 또는 활성화 스펙 모두에 설정합니다.

표 1. 전달 애플리케이션 사용 시나리오에서 pass message payload by reference 특성 설정의 영향. 테이블의 첫 번째 열은 네 개의 전달 애플리케이션 사용법 시나리오를 나열합니다. 두 번째 열은 시나리오에 대한 이용자 특성 설정을 표시합니다. 세 번째 열은 시나리오에 대한 연결 또는 활성화 스펙 특성 설정을 표시합니다.
전달 애플리케이션 사용법 시나리오 consumerDoesNotModify PayloadAfterGet 속성 설정 producerDoesNotModify PayloadAfterSet(for 연결 팩토리) 또는 forwarderDoesNotModify PayloadAfterSet (활성화 사양의 경우) 속성 설정
시나리오 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);