【问题标题】:How JMS work in Java?JMS 如何在 Java 中工作?
【发布时间】:2012-02-05 03:35:40
【问题描述】:

异步 ​​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 方法中使用消息。但我不知道它是如何工作的。

我需要在 JmsAdapter 类中添加 main 方法吗?添加 main 方法后,是否需要创建一个 jar,然后以“java -jar abc.jar”的形式运行该 jar?

非常感谢任何帮助。

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

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

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

【问题讨论】:

  • 我不确定您的问题与 JMS 有什么关系。您似乎在问“如何在 Java 中运行程序”。
  • 您无需创建 main 方法,一旦部署在服务器上,onMessage() 方法就会处理发送到您的班级正在观看的队列的任何消息。 onMessage() 将包含您想要在消息到达队列时执行的逻辑。
  • 你用什么来实现 JMS?
  • @Logan,所以,我的 JMSAdapter 类不会有任何 main 方法,对吧?所以,我应该把这个类打包在一个 jar 中,然后使用“java -jar JMSAdapter &”来部署它,对吧?编译器将如何调用 receiveMessages() 方法?
  • @Dave,我已经设置了 Oracle 队列并且我们有一些工作正在这个队列中创建消息。我只想写一个程序,它会不断地监听消息并在它们可用时立即处理它们,

标签: java jms


【解决方案1】:

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

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

  • 阅读/编写有关 JMS 的教程。

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

  • 弄清楚你想要做什么......然后设计你的应用程序。


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

  • 可以向该类添加一个 main 方法,但要制作一个 可执行 JAR 文件,您必须使用清单创建 JAR 文件使用 main 方法指定类名称的条目。

  • 在该代码生效之前,您还需要做很多事情:

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

    • 添加代码来处理消息

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

  • 就像我上面说的,你可能需要某种设计......这样你就不会把所有东西都放在“厨房水槽”类中。


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

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

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

还不完全清楚。只要main 线程还活着,它就应该继续运行,但是当您的main 方法返回时会发生什么并不是很明显。 (这取决于是否将 JMS 线程创建为守护线程,并且未指定。)

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

似乎每条消息都被检索(从套接字读取)你的onMessage方法被调用。


另外,如果监听器一直在监听,难道不占用CPU???

如果实施得当,则不会。

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

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

【讨论】:

  • 如果我添加 main 方法,我应该在 main 中简单地调用 receiveMessages() 吗?然后在运行之后,监听器会继续运行吗?如果有消息,会在onMessage方法中自动检索吗?
【解决方案2】:

这个链接看起来是一个非常好的地方,其中包含使用 Oracle AQ 的示例。有一个示例部分告诉您如何设置示例并运行它们。希望这能有所帮助。

Link to Oracle Advanced Queueing

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2023-03-16
    • 2012-02-09
    • 1970-01-01
    • 2016-10-29
    • 2013-01-05
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多