JMS의 간단한 예로 인한 사고

5069 단어 jms
자바 메시지 서비스의 제2장에서는 선이 제공하는 JMS API로 간단한 채팅 장면을 실현했다.이 실현 자체는 어렵지 않다. 이러한 실현은 랜에서 socket으로 실현할 수 있고 웹 실현에서는session이나 다른 웹 socket 등 방식을 사용할 수 있다.메신저 시스템으로 채팅 프로그램을 실현하는 것도 교묘한 방법이다.
먼저 코드를 붙여라. 코드는 제2장에서 나온다.
package ch02.chat;

import java.io.*;
import javax.jms.*;
import javax.naming.*;

public class Chat implements javax.jms.MessageListener {
	private TopicSession pubSession;
	private TopicPublisher publisher;
	private TopicConnection connection;
	private String username;

	/* Constructor used to Initialize Chat */
	public Chat(String topicFactory, String topicName, String username)
			throws Exception {
		// Obtain a JNDI connection using the jndi.properties file
		InitialContext ctx = new InitialContext();
		// Look up a JMS connection factory and create the connection
		TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx
				.lookup(topicFactory);
		TopicConnection connection = conFactory.createTopicConnection();
		// Create two JMS session objects
		TopicSession pubSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);
		TopicSession subSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);
		// Look up a JMS topic
		Topic chatTopic = (Topic) ctx.lookup(topicName);
		// Create a JMS publisher and subscriber. The additional parameters
		// on the createSubscriber are a message selector (null) and a true
		// value for the noLocal flag indicating that messages produced from
		// this publisher should not be consumed by this publisher.
		TopicPublisher publisher = pubSession.createPublisher(chatTopic);
		TopicSubscriber subscriber = subSession.createSubscriber(chatTopic,
				null, true);
		// Set a JMS message listener
		subscriber.setMessageListener(this);
		// Intialize the Chat application variables
		this.connection = connection;
		this.pubSession = pubSession;
		this.publisher = publisher;
		this.username = username;
		// Start the JMS connection; allows messages to be delivered
		connection.start();
	}

	/* Receive Messages From Topic Subscriber */
	public void onMessage(Message message) {
		try {
			TextMessage textMessage = (TextMessage) message;
			System.out.println(textMessage.getText());
		} catch (JMSException jmse) {
			jmse.printStackTrace();
		}
	}

	/* Create and Send Message Using Publisher */
	protected void writeMessage(String text) throws JMSException {
		TextMessage message = pubSession.createTextMessage();
		message.setText(username + ": " + text);
		publisher.publish(message);
	}

	/* Close the JMS Connection */
	public void close() throws JMSException {
		connection.close();
	}

	/* Run the Chat Client */
	public static void main(String[] args) {
		try {
			if (args.length != 3)
				System.out.println("Factory, Topic, or username missing");
			// args[0]=topicFactory; args[1]=topicName; args[2]=username
			Chat chat = new Chat(args[0], args[1], args[2]);
			// Read from command line
			BufferedReader commandLine = new java.io.BufferedReader(
					new InputStreamReader(System.in));
			// Loop until the word "exit" is typed
			while (true) {
				String s = commandLine.readLine();
				if (s.equalsIgnoreCase("exit")) {
					chat.close();
					System.exit(0);
				} else
					chat.writeMessage(s);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

물론 이 코드에는 서버가 필요합니다. 이 서버는 JMS 규범에 부합되는 MQ를 임의로 시작할 수 있습니다.이 코드 자체는 메시지의 발송단과 수용단만 실현했을 뿐이다. 우리는 코드 자체의 실현에 관심을 두지 않고 실현의 방향을 이해한다.
이것은 전형적인sub/pub 모델로 소비자는 자신이 관심을 가지는 topic를 선택하여 메시지를 구독할 수 있다. 제품도 특정한 메시지를 특정한 topic에 보낼 수 있다. 그러면 일반적으로 서버로 메시지가 오면 서버는 데이터를 각 구독자에게 나누어 주는 것을 책임진다.이렇게 말하면 이것이 바로 우리가 매우 잘 아는 인터넷 채팅방이다.
그러나 우리도 그중의 몇 가지 문제를 생각해야 한다. 첫째, 가장 중요한 소식의 순서 문제이기도 하다.특히 채팅 프로그램이 순서에 대한 요구가 높다면 JMS가 메시지의 순서를 보증할 수 있을까.이 부분은 서버가 보증해야 합니까? 아니면 송신자나 수신자가 보증해야 합니까?만약 보증할 수 없다면, 그 원인은 무엇입니까?메시지 시스템의 구축은 분포식 시스템을 지탱하는 데 많이 사용된다. 만약에 거래 등 사무성에 대한 요구가 높은 시스템과 관련된다면 JMS가 어떻게 사무를 보증할 수 있는지, 물론 정보의 중복성 처리가 어떻게 실현되는지도 있다.그 다음에 코드에 두 개의session이 사용되었는데 왜 발송자와 수용자가 같은session을 공용할 수 없습니까?세션을 공유하면 라인이 안전합니까?또한, 우리는 전체 채팅의 과정이 비동기적이라는 것을 알고 있다. 그러면 JMS 밑바닥은 어떻게 소식의 감청을 실현했는지, 왜 소식을 받자마자 반응을 보였는지, 이 이벤트 모델은 어떻게 실현되었는지.이어서 수신단이pull로 갈까요, 폴이나 서버로push를 할까요? 이 몇 가지 방식의 서로 다른 응용 장면은 무엇입니까?
이 문제들은 모두 다음 글에서 소개할 것이다. 이것도 JMS 디자인에서 일부 핵심적인 문제이다. 다시 예 자체로 돌아가면 우리는 이 예에 대한 확장과 응용을 고려할 수 있다.확장에 관해서는 단일 송신단이나 수신단을 가로로 확장하여 집단을 형성한 다음에 부하의 균형을 맞추는 방법을 쉽게 생각할 수 있다. 물론 서버 측도 이렇게 해야 한다.사업화 MQ의 구현 디테일이기도 하다.또한 메시지에 대한 필터, 저장 등 세부 사항도 확장의 일부분이다.상기 채팅 프로그램과 같은 구독 모델은 사실 메시지 시스템에서 가장 많이 활용되는 방식이다. 이런 방식은 시스템 간의 비동기적인 조작을 실현할 수 있고 시스템 간의 결합을 실현할 수 있다.

좋은 웹페이지 즐겨찾기