版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/fei33423/article/details/32723571
http://blog.csdn.net/jiao_fuyou/article/details/15499261
这篇文章讲的比較好.核心关键词: 幂等.
Message Queue ActiveMQ: redeliver,怎样做到重试机制不会导致一条消息被多次运行.
这里面提到了两个. 一个是可集成到Mq的camel的组件 Idempotent ConsumerIdempotent
Receiver http://camel.apache.org/idempotent-consumer.html 内含一个概念 Idempotent
Receiver  大致看了下,有 jpa. 老实说没看懂怎样实现 , 邮件组中也有人问,见以下附件),
一个是业务端实现方案(官方文档建议 http://activemq.apache.org/should-i-use-xa.html  ). 
另外一个是XA/jpa分布式事务.(http://activemq.apache.org/should-i-use-xa.html)
    答:   关键词
①消息不丢失 ,②消息不反复运行  是一个问题的两个方面. 不能顾此失彼.
            1.方案.业务端添加一张表存放,消息是否运行.每次业务事务commit后,告知server端已经处理该消息. 即使server
由于接受 timeout 重发,导致多个业务机器收到消息.也不会导致反复处理.
             想到一点,不须要去专门推断是 unique sqlException 还是其它的Exception.这个能够直接当作偶然Exception. 让Mq重试.
下次重试的时候遇到
   业务逻辑检查checkMessageExist(), 再丢弃这条消息,不再重试.
  这个方法做到了①消息不丢失
,②消息不反复运行 依赖消息反复发送.
消息不丢失,消息不反复运行.jpg

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVpMzM0MjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

            2,一种思路.让server记录.
当返回acknowledge时,进行推断是否已经运行,假设否,那么运行次数+1, 告知用户commit事务. 假设是就告知用户端,进行事务回滚.
            此方案缺陷,比如acknowledge接受成功,可是业务端事务commit失败(停电,硬盘出错),导致该消息丢失.
这个方法仅仅做到了②消息不反复运行,
没做到①消息不丢失 .某些情况下有可能消息丢失.
 
     

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVpMzM0MjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

第二个方案里涉及了偶发性故障的问题.
       数据库硬盘坏了,停电了没有持久化成功.和持久化成功了硬盘坏了有差别,前者数据丢失,全然无法恢复,后者也有概率会丢失,可是OP会通过机制尽可能不丢失,假设真的丢失了.那不不是人能控制的.比方未做异地容灾的备份,比方地球毁灭.
       对于前者我们业务端通过"编程自己主动重试"或者"同步返回错误让使用者又一次上传"能够避免前者的消息/数据丢失.  
     编程自己主动重试对异步框架而言更加重要,上面的activeMq就是通过重试避免消息的丢失.
      后者的数据无法恢复并非通过业务端的编程能够控制的.须要Op通过某些机制尽可能的保证.

 

See the background here...
http://activemq.apache.org/should-i-use-xa.html
 
Typically you either need to implement your own duplicate message
detector, use an idempotent consumer... 幂等消费者.  核心关键
http://activemq.apache.org/camel/idempotent-consumer.html
or use XA.
 
Another approach 方法 I've used with customers is that for JPA stuff that
might fail (由于jpa可能失败), use a JPA endpoint in Camel as part of your JMS send (so
it really just does a JPA insert under the covers using your
JpaTemplate object and using the same transaction), then in the
ActiveMQ broker bridge from your entity to a queue.
 
e.g. in your code send to destination
 
new CamelDestination("jpa:com.acme.MyEntity");
 
then in your activemq.xml have a rule...
 
<route>
  <from "jpa:com.acme.MyEntity"/>
  <to "activemq:MyQueue"/>
</route>
 
This then means rather than having the XA issue; you can stick to
simple JDBC operations and transactions; then get the broker to poll
the database and bridge it to a message queue in a separate
transaction (which typically will have less risk of creating
duplicates).
 
If you're not using XA you really should have some kinda duplicate
detection in there just in case though.
 
 
On 05/11/2007, dmd <dmd17@cornell.edu> wrote:
>
> Hi all,
>
> I am using JPA (currently with OpenJPA) to persist the execution state of a
> process.  I sometimes need to use the same transaction to consume a message,
> update the state of the process and persist it to disk, and generate some
> message.
>
> Essentially I have two services which communicate via JMS and both need to
> recover from failures and not lose their state or messages in transit.
>
> Now, I can't yet figure out how to configure the system in order to share
> the transactional context...  Furthermore, I don't know if that requires
> that both the ActiveMQ broker and the JPA must use the same DB.  (Obviously
> there is a requirement that the DB itself be highly available.  We are using
> MS SQL Server with a shared storage configuration.)
>
> Any help would be appreciated, including someone telling me that I'm on
> totally the wrong track and I should use some other technologies.
>
> Cheers,
> Dan
>
> --
> View this message in context: http://www.nabble.com/ActiveMQ-and-JPA-with-global-transactions-tf4752732s2354.html#a13590338
> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>
>
 

[异步][jms][activeMq]怎样做到重试机制不会导致一条消息被多次运行.的更多相关文章

  1. ActiveMQ基于JMS的pub/sub传播机制

    原文地址:[ActiveMQ实战]基于JMS的pub/sub传播机制 发布订阅模型 就像订阅报纸,我们可以选择一份或者多份报纸.比如:北京日报.人民日报.这些报纸就相当于发布订阅模型中的topic.如 ...

  2. JMS ActiveMQ研究文档

    1. 背景 当前,CORBA.DCOM.RMI等RPC中间件技术已广泛应用于各个领域.但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:(1)同步通信:客户发出调用后,必须等待服务 ...

  3. jms - activeMQ入门案例

    activeMQ入门案例 叨叨一波,很久没写博客了,最近比较慢,时间抽不出来,这个借口说的很尴尬...我知道作为一名合格的码农就必须养成每天一博客的习惯.希望友友们别像我这样懒,闲话不多时进入今天的主 ...

  4. Rocket重试机制,消息模式,刷盘方式

    一.Consumer 批量消费(推模式) 可以通过 consumer.setConsumeMessageBatchMaxSize(10);//每次拉取10条 这里需要分为2种情况 Consumer端先 ...

  5. RocketMQ(5)---RocketMQ重试机制

    RocketMQ重试机制 消息重试分为两种:Producer发送消息的重试 和 Consumer消息消费的重试. 一.Producer端重试 Producer端重试是指: Producer往MQ上发消 ...

  6. Java重试机制

    重试作用: 对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法.写操作等(要考虑写是否幂等)都不适合重试. 远程调用超时.网络突然中断可以重试.在微服务治理框架中,通常都有自己的重试与 ...

  7. springboot系列——重试机制原理和应用,还有比这个讲的更好的吗(附完整源码)

    1. 理解重试机制 2. 总结重试机制使用场景 3. spring-retry重试组件 4. 手写一个基于注解的重试组件 5. 重试机制下会出现的问题 6. 模板方法设计模式实现异步重试机制 如果有, ...

  8. ENode 1.0 - 消息的重试机制的设计思路

    项目开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架中消息队列的设计思路,本文介绍一下enode框架中关系消息的重试机制的设计思路 ...

  9. ActiveMQ之 TCP通讯机制

    ActiveMQ支持多种通讯协议TCP/UDP等,我们选取最常用的TCP来分析ActiveMQ的通讯机制.首先我们来明确一个概念:  客户(Client):消息的生产者.消费者对ActiveMQ来说都 ...

随机推荐

  1. 【IntelliJ Idea】idea快速创建maven spring项目

    想试试AOP在spring的web项目上的使用情况,所以想尽快使用idea快速的搭建一个spring的web项目,当然,是maven管理的项目 步骤如下: 1.打开idea 左上角file---> ...

  2. 关于Android方法数量限制的问题

    限制Android方法数量的原因是: Android应用以DEX文件的形式存储字节码文件,在Dalvik字节码规范里,方法引用索引method referenceindex只有16位,即65536个. ...

  3. PHP设置头部编码为UTF-8语句

    header("Content-type: text/html; charset=utf-8");

  4. 在dedecms后台发表文章显示外部连接栏目

    问题描述:客户的网站,有个顶级栏目,下面包含了几个子栏目,这个顶级栏目不想发布什么内容,点击后进入他的某个子栏目就可以了,这时候把这个顶级栏目设置为“外部连接”就可以了 但是设置顶级栏目为外部连接后, ...

  5. python __new__和__init__的区别

    http://www.cnblogs.com/tuzkee/p/3540293.html 继承自object的新式类才有__new__ __new__至少要有一个参数cls,代表要实例化的类,此参数在 ...

  6. 探秘 flex 上下文中神奇的自动 margin

    为了引出本文的主题,先看看这个问题,最快水平垂直居中一个元素的方法是什么? 水平垂直居中也算是 CSS 领域最为常见的一个问题了,不同场景下的方法也各不相同,各有优劣.嗯,下面这种应该算是最便捷的了: ...

  7. Oracle 在Drop表时的Cascade Constraints

    http://hi.baidu.com/rebooo/item/12b500b130022bf263388e69假设A为主表(既含有某一主键的表),B为从表(即引用了A的主键作为外键).则当删除A表时 ...

  8. NodeJS 安装cnpm命令行工具

    在安装之前,请确保已安装Git和NodeJS. cmd机内命令窗口,输入以下命令: git config --system http.sslcainfo /bin/curl-ca-bundle.crt ...

  9. TextView上的文字逐渐变淡直到消失

    给TextView加个动画效果,完了在个动画加个监听,里面有个动画执行完调用的方法在方法里面把TextView设置为gone,我觉得你直接加这个动画效果之后他就会不显示了,其实他还在那占有位置呢.想不 ...

  10. Runtime.getRuntime().exec()----记录日志案例

    Runtime.getRuntime().exec()方法主要用于运行外部的程序或命令. Runtime.getRuntime().exec共同拥有六个重载方法: 1.public Process e ...