异步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之外什么都没有.谢谢!
在开始尝试跑步之前,你需要学会走路.
阅读/编写Java编程教程.这应该解释(除其他外)如何从命令行编译和运行Java程序.
阅读/做一个关于JMS的教程.
阅读有关如何创建可执行JAR文件的Oracle资料.
弄清楚你要做的是什么......并设计你的应用程序.
看看你展示的内容并告诉我们:
您可以向该类添加main方法,但是要创建可执行的 JAR文件,您必须创建一个带有manifest条目的JAR文件,该条目使用main方法指定类的名称.
在代码运行之前,您还需要做更多的事情:
添加代码(至少)记录您捕获的异常
添加代码来处理消息
添加代码以初始化连接工厂和连接对象
就像我上面所说的那样,你可能需要某种设计......这样你就不会在"厨房水槽"课程中找到所有东西.
如果我添加main方法,我应该简单地在main中调用receiveMessages()吗?
这是一种方法.但就像我说的,你真的需要设计你的应用程序.
然后运行后,监听器会继续运行吗?
目前尚不完全清楚.只要main线程处于活动状态,它就应该继续运行,但是当main方法返回时会发生什么并不是很明显.(这取决于JMS线程是否作为守护程序线程创建,并且未指定.)
如果有消息,它会在onMessage方法中自动检索吗?
这样看来,每个消息被检索(从套接字读取)之前,你onMessage被调用的方法.
另外,如果监听器正在连续监听,是不是需要CPU ???
如果它被正确实施则不行.
在线程的情况下,当我们创建一个线程并将其置于休眠状态时,CPU利用率为零,如果是监听器,它是如何工作的?
在某个级别,侦听器线程将进行系统调用,等待数据到达网络套接字.我不知道它是如何实现的,但这可能就像read()在网络套接字上调用一样简单InoutStream.在阻塞系统调用中等待线程时,线程不使用CPU.
| 归档时间: |
|
| 查看次数: |
4125 次 |
| 最近记录: |