Как JMS работает в Java? - PullRequest
       1

Как JMS работает в Java?

1 голос
/ 08 января 2012

Как работает асинхронная JMS?Ниже приведен пример кода:

public class JmsAdapter implements MessageListener, ExceptionListener
{
private ConnectionFactory connFactory = null;
private Connection conn = null;
private Session session = null;

public void receiveMessages() 
{
    try
    {
        this.session = this.conn.createSession(true, Session.SESSION_TRANSACTED);

        this.conn.setExceptionListener(this);

        Destination destination = this.session.createQueue("SOME_QUEUE_NAME");

        this.consumer = this.session.createConsumer(destination);

        this.consumer.setMessageListener(this);

        this.conn.start();
    } 
    catch (JMSException e) 
    {
        //Handle JMS Exceptions Here
    }
}

@Override
public void onMessage(Message message) 
{
    try
    {
        //Do Message Processing Here

        //Message sucessfully processed...  Go ahead and commit the transaction.
        this.session.commit();
    }
    catch(SomeApplicationException e)
    {
        //Message processing failed.
        //Do whatever you need to do here for the exception.

        //NOTE: You may need to check the redelivery count of this message first
        //and just commit it after it fails a predefined number of times (Make sure you
        //store it somewhere if you don't want to lose it).  This way you're process isn't
        //handling the same failed message over and over again.
        this.session.rollback()
    }
}

}

Но я новичок в Java и JMS.Я, вероятно, буду использовать сообщения в методе onMessage.Но я не знаю, как это работает точно.

Нужно ли добавить метод main в классе JmsAdapter?После добавления основного метода, мне нужно создать jar и затем запустить jar как «java -jar abc.jar»?

Любая помощь очень ценится.

ОБНОВЛЕНИЕ: Что я хочузнать, что если я добавлю метод main, я должен просто вызвать receiveMessages () в main?И потом, после запуска, продолжит ли слушатель бежать?И если есть сообщения, будет ли он извлекаться автоматически в методе onMessage?

Кроме того, если слушатель постоянно слушает, не требует ли он загрузки процессора ???В случае потоков, когда мы создаем поток и переводим его в спящий режим, загрузка ЦП равна нулю, как это работает в случае прослушивателя?

Примечание: у меня только сервер Tomcat, и я не будуиспользовать любой JMS-сервер.Я не уверен, что слушателю нужен какой-то конкретный jms-сервер, такой как JBoss?Но в любом случае, пожалуйста, предположите, что у меня не будет ничего, кроме кота.Спасибо!

Ответы [ 2 ]

5 голосов
/ 08 января 2012

Вам нужно научиться ходить, прежде чем вы начнете пытаться бежать.

  • Прочитайте / сделайте учебник по программированию на Java.Это должно объяснить (среди прочего), как скомпилировать и запустить программу Java из командной строки.

  • Прочитать / сделать учебник по JMS.

  • Прочтите материал Oracle о том, как создать исполняемый файл JAR.

  • Узнайте, что вы пытаетесь сделать ... и Дизайн Вашприложение.


Глядя на то, что вы показали и сказали нам:

  • Вы могли бы добавитьМетод main для этого класса, но для создания исполняемого JAR-файла вам необходимо создать JAR-файл с записью манифеста, которая задает имя класса с помощью метода main.

  • Перед тем, как этот код сработает, нужно сделать гораздо больше:

    • добавить код (как минимум) для регистрации исключений, которые вы перехватываете

    • добавить код для обработки сообщений

    • добавить код для инициализации фабрики соединений и подключения к объектуects

  • И, как я уже говорил выше, вам, вероятно, нужен какой-то дизайн ... так что вы не получите все в "кухонной раковине""class.


если я добавлю метод main, я должен просто вызвать receiveMessages () в main?

Это один подход.Но, как я уже сказал, вам действительно нужно разработать ваше приложение.

А потом, после запуска, продолжит ли слушатель работать?

Это не совсем понятно.Он должен продолжать работать до тех пор, пока поток main жив, но не сразу очевидно, что произойдет, когда ваш метод main вернется.(Это зависит от того, созданы ли потоки JMS как потоки демона, и это не указано.)

И если будут сообщения, будут ли они автоматически извлекаться в методе onMessage?

Может показаться, что каждое сообщение извлекается (считывается из сокета) до вызова вашего onMessage метода.


Кроме того, если слушатель постоянно слушает, не требует ли он процессора ???

Нет, если он реализован правильно.

В случае потоков, когдасоздать поток и перевести его в спящий режим, загрузка ЦП равна нулю, как это работает в случае прослушивателя?

На определенном уровне поток прослушивателя выполнит системный вызов, который ожидает поступления данных в сетевой сокет.Я не знаю, как именно это реализовано, но этот может быть таким же простым, как read() вызов на сетевом сокете InoutStream.Поток не использует ЦП, пока он ожидает системного вызова блокировки.

0 голосов
/ 08 января 2012

Эта ссылка выглядит довольно неплохо с примерами использования Oracle AQ.Есть раздел примеров, в котором рассказывается, как настроить примеры и запустить их.Надеюсь, это поможет.

Ссылка на Oracle Advanced Queuing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...