2013-09-27 3 views
0

Я только начинаю получать знания и использовать JMS (activemq). Псевдокод выглядит как нижеКак часто я должен создавать тему подключения JMS и сеанс

// 1. TopicConnectionFactory tcf = (TopicConnectionFactory) ctx.lookup ("XXConnFactory");

// 2. ConnectionConnection connection = tcf.createTopicConnection();

// 3. Тема темыSession = connection.createTopicSession (false, Session.AUTO_ACKNOWLEDGE);

then using topicSession я создаю издатель и вызываю метод publish().

Вопрос, когда я инициализирую темуСоединение/Тема. Возможно ли, что TopicConnection инициализируется один раз и использует одно и то же соединение для получения сеанса для каждого вызова?

В принципе, я хочу знать, который может быть создан один раз и который должен быть создан для каждого вызова.

ответ

1
  • TopicConnection Обычно управляет соединением TCP с поставщиком JMS. Поэтому обычно одного соединения достаточно.
  • TopicSession - это однопоточный контекст (для управления транзакциями), поэтому он необходим для каждого потока. Это легкий вес.

Вы можете найти более подробную информацию в Javadoc:

Цитата из Javadoc от Connection:

JMS клиента, как правило, создает соединение n, один или несколько сеансов, а также ряд производителей и потребителей сообщений.

1

В основном я хочу знать, какие могут быть созданы один раз и который должен быть создан для каждого вызова.

Чтобы ответить на этот вопрос, вы можете выполнить инициализацию столько раз, сколько захотите. Пока вы правильно освобождаете каждый сеанс и правильно закрываете соединение, это не проблема.

Но с точки зрения перспективы, каким должен быть путь?

Ну, ответ зависит от того, как часто вы взаимодействуете с очередью. Предположим, что вы хотите время от времени читать/записывать в очередь/тему, идите для ввода всего кода инициализации в метод, который инициализирует сеанс, считывает/записывает данные и закрывает его.

Но скажите, что вы должны часто выполнять чтение/запись, рекомендуется инициализировать сеанс и сохранять ссылку в переменной экземпляра, а затем вы просто используете этот сеанс для размещения данных.

Держите операцию в try-catch, чтобы поймать любое исключение (во всех случаях). И используйте блок finally, чтобы закрыть сеанс/соединение.

После завершения чтения и записи завершите сеанс и соединение через блок finally.

0

Достаточно вызвать комментарий ниже, если вы хотите создать только одно соединение.

 Context ctx = new InitialContext(); 

     // lookup the topic connection factory 
     TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx 
       .lookup("/RemoteConnectionFactory"); 

     // lookup the topic object 
     Topic topic = (Topic) ctx.lookup("java:/"+prop.TOPIC); 

     // create a topic connection 
     TopicConnection topicConn = connFactory.createTopicConnection(prop.USERPUB,prop.PASSPUB); 

      //create topic session 
     TopicSession topicSession = topicConn.createTopicSession(true, Session.AUTO_ACKNOWLEDGE); 

     //create topic publisher 
     MessageProducer topicPublisher = topicSession.createPublisher(topic); 
     topicPublisher.setDeliveryMode(DeliveryMode.PERSISTENT); 

Позвонить каждый раз, когда вы хотите опубликовать новое сообщение в теме. // создаем сообщение message = topicSession.createTextMessage(); message.setText (this.publishMsg);

 // publish the messages 
     Long timeLng = System.currentTimeMillis(); 
     message.setJMSCorrelationID(timeLng.toString()); 
     topicPublisher.send(message); 
     topicSession.commit(); 

Если вы хотите создать новую тему, вызов ниже с названием темы

 MessageProducer topicPublisher = topicSession.createPublisher(topic); 
     topicPublisher.setDeliveryMode(DeliveryMode.PERSISTENT); 
Смежные вопросы