关键词: ActiveMQ Liferay
下载:http://www.activemq.org/site/download.html
ActiveMQ FAQ(使用中遇到的问题,大多在这里可以找到): http://goopen.org/confluence/display/ACTIVEMQ/FAQ
红眼web观察: http://www.uuki.com/blog/index.php?2005/11/30/64-activemq
ActiveMQ中的消息持久性: http://blog.iecn.net/blog/html/do-showone-tid-889.html
结合spring使用ActiveMQ进行异步消息调用: http://blog.iecn.net/blog/html/do-showone-tid-892.html
ActiveMQ中的安全机制: http://blog.iecn.net/blog/html/do-showone-tid-890.html
结合Spring2.0和ActiveMQ进行异步消息调用: http://blog.iecn.net/blog/html/do-showone-tid-1035.html
ActiveMQ(ver 3.2.1)的jndi支持:http://blog.donews.com/foxgem/archive/2006/05/09/861535.aspx
Liferay 使用activemq时,每次启动都会重新生成derby,无法重发因为服务停止时,滞留在消息队列的消息。首先就要配置activemq每次从同一个数据库存取,增加一个broker(详见《红眼web观察》)
<bean id="broker" class="org.activemq.spring.BrokerFactoryBean">
<property name="config" value="classpath:/activemq.xml"/>
</bean>
但此时仍然无法保证因为网络问题、服务器繁忙、邮件服务器问题等引起的无法正确投递的问题。
因为session没有使用事务,在出错抛出异常时没有回滚。
QueueSession session = con.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
即使使用事务,并且出错回滚的话仍然有问题。假如是因网络问题无法连接到邮件服务器等大问题时,
回滚后会继续发送本条消息,此时因网络问题不可能一时解决,jms就持续不断的发送该消息,会导致CPU 100%。
这样看来事务回滚也不是好的方法,只有在出错时记录到自己的DB中,然后写一个job或是task,每隔一段时间对因错没有发送的消息重新发送,也就是将其放置重新到队列当中。
同样的问题也存在将消息放置到队列中的情况,无法保证放置时出错后消息的重发,也要在出错时将消息保存到自己的DB中。
activemq derby的脚本:
ALTER TABLE ACTIVEMQ_TXS DROP CONSTRAINT SQL070117092033990;
ALTER TABLE ACTIVEMQ_MSGS DROP CONSTRAINT SQL070117092033260;
ALTER TABLE ACTIVEMQ_ACKS DROP CONSTRAINT SQL070117092034180;
DROP INDEX SQL070117092033260;
DROP INDEX SQL070117092033990;
DROP INDEX SQL070117092034180;
DROP INDEX ACTIVEMQ_MSGS_CIDX;
DROP INDEX ACTIVEMQ_ACKS_CIDX;
DROP INDEX ACTIVEMQ_MSGS_MIDX;
DROP TABLE ACTIVEMQ_MSGS;
DROP TABLE ACTIVEMQ_ACKS;
DROP TABLE ACTIVEMQ_TXS;
CREATE TABLE ACTIVEMQ_MSGS (
ID INTEGER NOT NULL,
CONTAINER VARCHAR(250),
MSGID VARCHAR(250),
MSG BLOB(1048576),
EXPIRATION BIGINT,
SENT_TO_DEADLETTER CHAR(1)
);
CREATE TABLE ACTIVEMQ_ACKS (
SUB VARCHAR(250) NOT NULL,
CONTAINER VARCHAR(250) NOT NULL,
LAST_ACKED_ID INTEGER,
SE_ID INTEGER,
SE_CLIENT_ID VARCHAR(250),
SE_CONSUMER_NAME VARCHAR(250),
SE_SELECTOR VARCHAR(250)
);
CREATE TABLE ACTIVEMQ_TXS (
XID VARCHAR(250) NOT NULL
);
CREATE UNIQUE INDEX SQL070117092033260 ON ACTIVEMQ_MSGS (ID ASC);
CREATE UNIQUE INDEX SQL070117092033990 ON ACTIVEMQ_TXS (XID ASC);
CREATE UNIQUE INDEX SQL070117092034180 ON ACTIVEMQ_ACKS (SUB ASC, CONTAINER ASC);
CREATE INDEX ACTIVEMQ_MSGS_CIDX ON ACTIVEMQ_MSGS (CONTAINER ASC);
CREATE INDEX ACTIVEMQ_ACKS_CIDX ON ACTIVEMQ_ACKS (CONTAINER ASC);
CREATE INDEX ACTIVEMQ_MSGS_MIDX ON ACTIVEMQ_MSGS (MSGID ASC);
ALTER TABLE ACTIVEMQ_TXS ADD CONSTRAINT SQL070117092033990 PRIMARY KEY (XID);
ALTER TABLE ACTIVEMQ_MSGS ADD CONSTRAINT SQL070117092033260 PRIMARY KEY (ID);
ALTER TABLE ACTIVEMQ_ACKS ADD CONSTRAINT SQL070117092034180 PRIMARY KEY (SUB, CONTAINER);
注:用mysql 的话,表ACTIVEMQ_TXS的字段SUB和CONTAINER 长度改为150.详见《ActiveMQ中的消息持久性》
自己数据库存取消息的POJO:
public class MailMessage implements Serializable {
private Long id;
private Blob message;
private Serializable serialiableMsg;
public Serializable getSerialiableMsg() throws SQLException {
InputStream is = getMessage().getBinaryStream();
serialiableMsg = (is == null) ? null : (Serializable) SerializationUtils.deserialize(is);
return serialiableMsg;
}
public void setSerialiableMsg(Serializable serialiableMsg) {
this.serialiableMsg = serialiableMsg;
byte[] b = SerializationUtils.serialize(serialiableMsg);
setMessage(b == null ? null : Hibernate.createBlob(b));
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
protected Blob getMessage() {
return message;
}
protected void setMessage(Blob message) {
this.message = message;
}
分享到:
相关推荐
ActiveMQ因其强大的功能、灵活的配置以及广泛的兼容性,在企业级应用中被广泛使用。 #### 二、ActiveMQ应用场景 ##### 2.1 业务解耦 在实际业务场景中,系统之间的交互往往需要通过复杂的调用来完成。使用消息...
总结来说,ActiveMQ是Java世界中广泛使用的消息中间件,通过JMS接口提供可靠的消息传递功能。了解其工作原理和API,对于构建健壮的、分布式的Java应用程序至关重要。无论是简单的点对点通信还是复杂的发布/订阅模式...
ActiveMQ中间件面试总结
**标题:“ActiveMQ问题总结”** 在分布式系统中,消息队列扮演着至关重要的角色,它作为组件间通信的一种高效手段,确保了系统的解耦、异步处理和高可用性。ActiveMQ是Apache软件基金会开发的一款开源消息中间件,...
在IBM AIX操作系统上部署Websphere与ActiveMQ是一项复杂的工作,涉及到多个步骤和技术细节。以下是对这个过程的详尽解析: 首先,我们要了解环境背景: 1. Aix Version5:这是一个基于UNIX的操作系统,由IBM开发,...
【ActiveMQ 学习总结】 在现代网络通讯中,HTTP 请求通常采用同步方式,基于请求-响应模式。这意味着客户端调用服务端接口后,必须等待服务端返回结果才能继续执行,这种方式称为同步调用。然而,同步调用的缺点...
本文总结了消息中间件ActiveMQ的学习要点,涵盖了为什么使用消息中间件、消息中间件的组成、JMS规范、ActiveMQ简介、消息中间件的应用场景等方面。 一、为什么使用消息中间件 使用消息中间件可以解决分布式系统...
### ActiveMQ 安装与使用详解 #### 一、ActiveMQ简介 ActiveMQ 是Apache出品的一款优秀的开源消息中间件,支持多种消息传输协议,并且具备良好的扩展性。它基于Java语言开发,支持JMS标准,同时也支持AMQP、STOMP...
总结来说,ActiveMQ是一个强大的消息中间件,它的易用性、灵活性和可靠性使其成为企业级应用的首选。通过理解并熟练掌握ActiveMQ的使用,开发者可以构建出高效、可扩展的应用系统,并通过其丰富的管理工具来监控和...
总结来说,使用ActiveMQ的JDBC持久化需要合适的jar包支持,包括ActiveMQ自身的JDBC相关库、数据库驱动和连接池库。正确配置这些组件并设置好数据源,才能确保ActiveMQ能有效地利用JDBC进行消息持久化。
总结 ActiveMQ作为JMS的一个实现,提供了一种标准化的消息传递解决方案,适用于构建高并发、高可靠性的分布式系统。其点对点和发布/订阅模式满足了不同场景下的需求,而丰富的特性和广泛的语言支持使其成为许多企业...
本篇文章将深入探讨如何使用ActiveMQ进行JMS开发,以及ActiveMQ的核心特性。 一、Java消息服务(JMS) JMS是一种为分布式环境设计的消息传递规范,它定义了生产、存储和消费消息的标准接口。通过JMS,应用程序可以...
- **非阻塞IO**:通过配置ActiveMQ使用非阻塞IO,可以减少线程的使用,从而支持更多并发连接。 - **消息分发线程池**:通过设置 `org.apache.activemq.UseDedicatedTaskRunner` 为 `false`,可以让ActiveMQ使用一个...
3. **网络传输优化**:ActiveMQ使用高效的网络协议,降低延迟,提高消息传递效率。 4. **多种协议支持**:除了JMS,还支持STOMP、AMQP、MQTT等协议,适应不同应用场景。 5. **消息筛选和分组**:通过消息选择器,...
总结来说,Apache ActiveMQ是Linux环境下的强大消息中间件,提供了丰富的特性和高度的灵活性,对于构建分布式系统和实现微服务架构有着重要的作用。通过理解和掌握ActiveMQ的使用,可以提升系统的可扩展性和稳定性,...
总结来说,Apache ActiveMQ客户端提供了与ActiveMQ服务器通信的工具和接口,允许开发者构建可靠、高效的分布式消息系统。通过理解和使用这个客户端,你可以构建出能够处理大量并发消息、支持多种消息模式的应用程序...
总结,ActiveMQ v6.0.1是一个强大且灵活的消息中间件,适用于各种分布式环境中的消息传递需求。通过其丰富的特性和广泛的支持,开发者可以构建出高效、可靠的系统架构。对于毕业设计论文和计算机案例研究,ActiveMQ...
标题 "activemq入门总结" 暗示了本文将主要围绕Apache ActiveMQ,一个流行的开源消息代理和队列中间件进行讲解。ActiveMQ是基于Java Message Service (JMS) API 的,它允许应用程序在分布式环境中发送和接收消息,...
需要注意的是,使用消息连接池需要引入额外的依赖 `activemq-pool.jar`。 #### 存储数据库配置 ActiveMQ 支持多种持久化方式,包括 KahaDB 和 LevelDB 等。如果需要将消息存储到关系型数据库中,则需要进行相应的...
在使用ActiveMQ消息中间件时,我们常常需要考虑如何在多个实例之间实现高可用性(HA)。其中一种常用的方式是采用**Failover(故障转移)**模式来确保即使一个节点出现问题,另一个节点也能接管服务,从而维持系统的...