`
wildwind
  • 浏览: 100231 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

ActiveMQ 使用总结

阅读更多
关键词: 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;
    }
3
2
分享到:
评论

相关推荐

    ActiveMq总结.docx

    ActiveMQ因其强大的功能、灵活的配置以及广泛的兼容性,在企业级应用中被广泛使用。 #### 二、ActiveMQ应用场景 ##### 2.1 业务解耦 在实际业务场景中,系统之间的交互往往需要通过复杂的调用来完成。使用消息...

    ActiveMQ使用入门.pdf

    总结来说,ActiveMQ是Java世界中广泛使用的消息中间件,通过JMS接口提供可靠的消息传递功能。了解其工作原理和API,对于构建健壮的、分布式的Java应用程序至关重要。无论是简单的点对点通信还是复杂的发布/订阅模式...

    ActiveMQ中间件面试总结.xmind

    ActiveMQ中间件面试总结

    activemq问题总结

    **标题:“ActiveMQ问题总结”** 在分布式系统中,消息队列扮演着至关重要的角色,它作为组件间通信的一种高效手段,确保了系统的解耦、异步处理和高可用性。ActiveMQ是Apache软件基金会开发的一款开源消息中间件,...

    aix上websphere activemq部署总结.doc

    在IBM AIX操作系统上部署Websphere与ActiveMQ是一项复杂的工作,涉及到多个步骤和技术细节。以下是对这个过程的详尽解析: 首先,我们要了解环境背景: 1. Aix Version5:这是一个基于UNIX的操作系统,由IBM开发,...

    ActiveMQ学习总结.docx

    【ActiveMQ 学习总结】 在现代网络通讯中,HTTP 请求通常采用同步方式,基于请求-响应模式。这意味着客户端调用服务端接口后,必须等待服务端返回结果才能继续执行,这种方式称为同步调用。然而,同步调用的缺点...

    工作学习-消息中间件activeMQ学习总结

    本文总结了消息中间件ActiveMQ的学习要点,涵盖了为什么使用消息中间件、消息中间件的组成、JMS规范、ActiveMQ简介、消息中间件的应用场景等方面。 一、为什么使用消息中间件 使用消息中间件可以解决分布式系统...

    ActiveMQ安装和使用

    ### ActiveMQ 安装与使用详解 #### 一、ActiveMQ简介 ActiveMQ 是Apache出品的一款优秀的开源消息中间件,支持多种消息传输协议,并且具备良好的扩展性。它基于Java语言开发,支持JMS标准,同时也支持AMQP、STOMP...

    activeMQ使用软件,以及初始化页面

    总结来说,ActiveMQ是一个强大的消息中间件,它的易用性、灵活性和可靠性使其成为企业级应用的首选。通过理解并熟练掌握ActiveMQ的使用,开发者可以构建出高效、可扩展的应用系统,并通过其丰富的管理工具来监控和...

    activeMQ使用JDBC所需要的jar包

    总结来说,使用ActiveMQ的JDBC持久化需要合适的jar包支持,包括ActiveMQ自身的JDBC相关库、数据库驱动和连接池库。正确配置这些组件并设置好数据源,才能确保ActiveMQ能有效地利用JDBC进行消息持久化。

    activeMQ总结

    总结 ActiveMQ作为JMS的一个实现,提供了一种标准化的消息传递解决方案,适用于构建高并发、高可靠性的分布式系统。其点对点和发布/订阅模式满足了不同场景下的需求,而丰富的特性和广泛的语言支持使其成为许多企业...

    ActiveMQ高并发处理方案

    - **非阻塞IO**:通过配置ActiveMQ使用非阻塞IO,可以减少线程的使用,从而支持更多并发连接。 - **消息分发线程池**:通过设置 `org.apache.activemq.UseDedicatedTaskRunner` 为 `false`,可以让ActiveMQ使用一个...

    activeMq in action 使用activeMq开发JMS的简单讲述

    本篇文章将深入探讨如何使用ActiveMQ进行JMS开发,以及ActiveMQ的核心特性。 一、Java消息服务(JMS) JMS是一种为分布式环境设计的消息传递规范,它定义了生产、存储和消费消息的标准接口。通过JMS,应用程序可以...

    ActiveMQ的安装与使用

    3. **网络传输优化**:ActiveMQ使用高效的网络协议,降低延迟,提高消息传递效率。 4. **多种协议支持**:除了JMS,还支持STOMP、AMQP、MQTT等协议,适应不同应用场景。 5. **消息筛选和分组**:通过消息选择器,...

    apache-activemq Linux版本

    总结来说,Apache ActiveMQ是Linux环境下的强大消息中间件,提供了丰富的特性和高度的灵活性,对于构建分布式系统和实现微服务架构有着重要的作用。通过理解和掌握ActiveMQ的使用,可以提升系统的可扩展性和稳定性,...

    ActiveMQ客户端

    总结来说,Apache ActiveMQ客户端提供了与ActiveMQ服务器通信的工具和接口,允许开发者构建可靠、高效的分布式消息系统。通过理解和使用这个客户端,你可以构建出能够处理大量并发消息、支持多种消息模式的应用程序...

    activemq入门总结

    标题 "activemq入门总结" 暗示了本文将主要围绕Apache ActiveMQ,一个流行的开源消息代理和队列中间件进行讲解。ActiveMQ是基于Java Message Service (JMS) API 的,它允许应用程序在分布式环境中发送和接收消息,...

    activemq activeMq笔记

    需要注意的是,使用消息连接池需要引入额外的依赖 `activemq-pool.jar`。 #### 存储数据库配置 ActiveMQ 支持多种持久化方式,包括 KahaDB 和 LevelDB 等。如果需要将消息存储到关系型数据库中,则需要进行相应的...

    ActiveMQ_使用failover模式进行连接切换时,线程断开

    在使用ActiveMQ消息中间件时,我们常常需要考虑如何在多个实例之间实现高可用性(HA)。其中一种常用的方式是采用**Failover(故障转移)**模式来确保即使一个节点出现问题,另一个节点也能接管服务,从而维持系统的...

    activemq

    ### ActiveMQ-CPP 开发手册知识点详述 ...掌握了 CMS 的基本原理和 ActiveMQ-CPP 的使用方法后,开发者就能够更高效地构建复杂的应用系统,并利用消息队列的强大功能来优化应用程序的性能和可靠性。

Global site tag (gtag.js) - Google Analytics