JMS如何在Java中工作?

Mik*_*ike 1 java jms

异步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()
    }
}
Run Code Online (Sandbox Code Playgroud)

}

但我是Java和JMS的新手.我可能会在onMessage方法中使用消息.但我不知道它是如何工作的.

我是否需要在JmsAdapter类中添加main方法?添加main方法后,是否需要创建一个jar然后以"java -jar abc.jar"运行jar?

任何帮助深表感谢.

更新:我想知道的是,如果我添加main方法,我应该简单地在main中调用receiveMessages()吗?然后运行后,监听器会继续运行吗?如果有消息,它会在onMessage方法中自动检索吗?

另外,如果监听器正在连续监听,是不是需要CPU ??? 在线程的情况下,当我们创建一个线程并将其置于休眠状态时,CPU利用率为零,如果是监听器,它是如何工作的?

注意:我只有Tomcat服务器,我不会使用任何jms服务器.我不确定监听器是否需要任何特定的jms服务器,如JBoss?但无论如何,请假设我除了tomcat之外什么都没有.谢谢!

Ste*_*n C 5

在开始尝试跑步之前,你需要学会走路.

  • 阅读/编写Java编程教程.这应该解释(除其他外)如何从命令行编译和运行Java程序.

  • 阅读/做一个关于JMS的教程.

  • 阅读有关如何创建可执行JAR文件的Oracle资料.

  • 弄清楚你要做的是什么......并设计你的应用程序.


看看你展示的内容并告诉我们:

  • 可以向该类添加main方法,但是要创建可执行的 JAR文件,您必须创建一个带有manifest条目的JAR文件,该条目使用main方法指定类的名称.

  • 在代码运行之前,您还需要做更多的事情:

    • 添加代码(至少)记录您捕获的异常

    • 添加代码来处理消息

    • 添加代码以初始化连接工厂和连接对象

  • 就像我上面所说的那样,你可能需要某种设计......这样你就不会在"厨房水槽"课程中找到所有东西.


如果我添加main方法,我应该简单地在main中调用receiveMessages()吗?

这是一种方法.但就像我说的,你真的需要设计你的应用程序.

然后运行后,监听器会继续运行吗?

目前尚不完全清楚.只要main线程处于活动状态,它就应该继续运行,但是当main方法返回时会发生什么并不是很明显.(这取决于JMS线程是否作为守护程序线程创建,并且未指定.)

如果有消息,它会在onMessage方法中自动检索吗?

这样看来,每个消息被检索(从套接字读取)之前,onMessage被调用的方法.


另外,如果监听器正在连续监听,是不是需要CPU ???

如果它被正确实施则不行.

在线程的情况下,当我们创建一个线程并将其置于休眠状态时,CPU利用率为零,如果是监听器,它是如何工作的?

在某个级别,侦听器线程将进行系统调用,等待数据到达网络套接字.我不知道它是如何实现的,但这可能就像read()在网络套接字上调用一样简单InoutStream.在阻塞系统调用中等待线程时,线程不使用CPU.