6.3. 메시지 수신
이 예제는 JNDI 컨텍스트를 생성하고, 이를 사용하여 ConnectionFactory 및 Destination 을 찾고, 팩토리를 사용하여 연결을 생성 및 시작한 다음 세션을 생성합니다. 그런 다음 대상에 대해 MessageConsumer 가 생성되고 이를 사용하여 메시지를 수신하며 해당 콘텐츠가 콘솔에 출력됩니다. 그러면 연결이 닫히고 프로그램이 종료됩니다. 전송 예에서 와 동일한 JNDI 구성이 사용됩니다.
이 수신기 예제의 실행 가능한 변형은 이전에 3장. 시작하기 에서 다루는 Hello World 예제와 함께 클라이언트 배포의 예제 디렉터리에 포함되어 있습니다.
예: 메시지 수신
package org.jboss.amq.example;
import jakarta.jms.Connection;
import jakarta.jms.ConnectionFactory;
import jakarta.jms.Destination;
import jakarta.jms.ExceptionListener;
import jakarta.jms.JMSException;
import jakarta.jms.Message;
import jakarta.jms.MessageConsumer;
import jakarta.jms.Session;
import jakarta.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class Receiver {
public static void main(String[] args) throws Exception {
try {
Context context = new InitialContext();
ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup");
Destination destination = (Destination) context.lookup("myDestinationLookup");
Connection connection = factory.createConnection("<username>", "<password>");
connection.setExceptionListener(new MyExceptionListener());
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer messageConsumer = session.createConsumer(destination);
Message message = messageConsumer.receive(5000);
if (message == null) {
System.out.println("A message was not received within given time.");
} else {
System.out.println("Received message: " + ((TextMessage) message).getText());
}
connection.close();
} catch (Exception exp) {
System.out.println("Caught exception, exiting.");
exp.printStackTrace(System.out);
System.exit(1);
}
}
private static class MyExceptionListener implements ExceptionListener {
@Override
public void onException(JMSException exception) {
System.out.println("Connection ExceptionListener fired, exiting.");
exception.printStackTrace(System.out);
System.exit(1);
}
}
}
- 1
- JNDI
컨텍스트를 생성하여ConnectionFactory및Destination오브젝트를 조회합니다. 설정은 앞에서 설명한 대로jndi.properties파일에서 선택합니다. - 2
ConnectionFactory및Destination오브젝트는 조회 이름을 사용하여JNDI컨텍스트에서 검색됩니다.- 3
- 팩토리는
연결을생성하는 데 사용되며, 그러면ExceptionListener가 등록되고 시작됩니다. 연결을 생성할 때 제공되는 인증 정보는 일반적으로 적절한 외부 구성 소스에서 가져와 애플리케이션 자체와 별도로 유지되며 독립적으로 업데이트할 수 있습니다. - 4
- 비전송된 자동 확인 세션이
에서 생성됩니다.연결 - 5
MessageConsumer는대상에서 메시지를 수신하도록 생성됩니다.- 6
- 메시지를 수신하라는 호출은 5초의 시간 초과로 수행됩니다.
- 7
- 결과가 확인되고 메시지가 수신되면 해당 콘텐츠가 출력되거나 메시지가 수신되지 않았음을 알 수 있습니다. 결과는
Sender가 보낸 것을 알고 있기 때문에텍스트 메시지로명시적으로 캐스팅됩니다. - 8
연결이닫힙니다.세션및MessageConsumer는 암시적으로 닫힙니다.
이는 예제일 뿐입니다. 실제 애플리케이션은 일반적으로 긴 MessageConsumer 를 사용하고 시간이 지남에 따라 많은 메시지를 수신합니다. 각 메시지에 대한 연결,세션 및 MessageConsumer 를 열고 종료하는 것은 일반적으로 효율적이지 않습니다.