JMS의 간단한 예로 인한 사고
5069 단어 jms
먼저 코드를 붙여라. 코드는 제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의 구현 디테일이기도 하다.또한 메시지에 대한 필터, 저장 등 세부 사항도 확장의 일부분이다.상기 채팅 프로그램과 같은 구독 모델은 사실 메시지 시스템에서 가장 많이 활용되는 방식이다. 이런 방식은 시스템 간의 비동기적인 조작을 실현할 수 있고 시스템 간의 결합을 실현할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
실효 연결의 검측만약 상술한 상황이 발생한다면, 이 자원들은 서버에 남아 정리되지 않을 것이다.이것은 자원 유출 현상을 초래하고 최종적으로 서버 메모리가 넘치거나 다른 자원의 넘침 오류를 초래할 수 있다. 따라서 서버에서는 자원의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.