首页 > 代码库 > ActiveMQ

ActiveMQ

参考文章:http://blog.csdn.net/tommy_lgj/archive/2008/11/21/3348137.aspx

1. ActiveMQ的安装和使用

  在官网http://activemq.apache.org/ 下载压缩包,解压后双击activemq.bat。启动ActiveMQ以后,登陆http://localhost:8161/admin/,即可创建消息队列和收发消息。

2. ActiveMQ客户端代码

消息的同步和异步接收
  消息的同步接收是指客户端主动去接收消息,客户端可以采用MessageConsumer 的receive方法去接收下一个消息。
  消息的异步接收是指当消息到达时,ActiveMQ主动通知客户端。客户端可以通过注册一个实现MessageListener 接口的对象到MessageConsumer。MessageListener只有一个必须实现的方法onMessage,函数参数为Message。每当消息到达时,ActiveMQ会调用MessageListener中的onMessage 函数。在为每个发送到Destination的消息实现onMessage时,将调用该方法。

消息选择器

可靠性机制

  发送消息最可靠的方法就是在事务中发送持久性的消息,ActiveMQ默认发送持久性消息。结束事务有两种方法:提交或者回滚。当一个事务提交,消息被处理。如果事务中有一个步骤失败,事务就回滚,这个事务中的已经执行的动作将被撤销。

  低可靠性可以降低开销和提高性能,例如发送消息时可以更改消息的优先级或者指定消息的过期时间。性能和可靠性之间的折衷是设计时要重点考虑的一个方面。可以选择生成和使用非持久性消息来获得最佳性能。另一方面,也可以通过生成和使用持久性消息并使用事务会话来获得最佳可靠性。

消息签收模式

Session是一个发送或接收消息的线程。Session可以被事务化,也可以不被事务化,可以通过向Connection的创建方法传递一个布尔参数对此进行设置。其中transacted为使用事务标识,acknowledgeMode为签收模式。

  Session createSession(boolean transacted, int acknowledgeMode);

当transacted为true时, 表示session是带事务的,确认消息就通过确认和校正来自动地处理,需手动调用session.commit()。第二个参数是无效的。
当transacted为false时,表示session是不带事务的,此时有三种用于消息确认的选项:
  1)AUTO_ACKNOWLEDGE 自动确认。客户端接收到消息(receive或onMessage成功返回时),即为消费成功,不需要做额外的工作。
  2)CLIENT_ACKNOWLEDGE 客户端确认。客户端接收到消息后,必须调用message.acknowledge()方法。jms服务器才会删除消息。
  3)DUPS_OK_ACKNOWLEDGE 允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。Session不必确保对传送消息的签收。它可能引起消息的重复,但是降低了Session的开销。在需要考虑资源使用时,这种模式非常有效。

消息传递方式

  ActiveMQ支持两种消息传送模式:PERSISTENT和NON_PERSISTENT两种。
1.PERSISTENT(持久性消息)
  这是ActiveMQ的默认传送模式,此模式保证这些消息只被传送一次和成功使用一次。这意味着在持久性消息传送至目标时,消息服务将其放入持久性数据存储。如果消息服务由于某种原因导致失败,它可以恢复此消息并将此消息传送至相应的消费者。虽然这样增加了消息传送的开销,但却增加了可靠性。

2.NON_PERSISTENT(非持久性消息)
  保证这些消息最多被传送一次。对于这些消息,可靠性并非主要的考虑因素。此模式并不要求持久性的数据存储,也不保证消息服务由于某种原因导致失败后消息不会丢失。

有两种方法指定传送模式:
  1)使用setDeliveryMode方法,这样所有的消息都采用此传送模式;
  2)使用send方法为每一条消息设置传送模式;

 

  JMS有两种消息传递方式。标记为NON_PERSISTENT的消息最多传递一次,而标记为PERSISTENT的消息将使用暂存后再转发的机理投递。如果一个JMS服务离线,那么持久性消息不会丢失,但是得等到这个服务恢复联机的时候才会被传递。所以默认的消息传递方式是非持久性的,虽然使用非持久性消息可能降低内存和需要的存储器,但这种传递方式只有当你不需要接收所有消息时才使用。

消息列队有两种消息模式,一种是点对点的消息模式,还有一种就是订阅的模式.

 

 

An error occurred at line: 20 in the jsp file: /WEB-INF/tags/form/forEachMapEntry.tag 

:checkJava
rem set _JAVACMD=%JAVACMD%

rem if "%JAVA_HOME%" == "" goto noJavaHome
rem if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
rem if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe
set _JAVACMD=C:\Program Files\Java\jdk1.7.0_65\bin\java.exe

 

ActiveMQ