获得的经验:ActiveMQ,Apache Camel和连接池

每隔一段时间,我会遇到一个与ActiveMQ的连接和池相关的有趣问题,而今天,我想讨论一些并不总是很清楚的问题,并且在使用ActiveMQ和Camel JMS时可能会导致您大量饮酒。 并不是说您无论如何都不会在使用ActiveMQ和Camel时大量喝酒……以庆祝使用它们时集成和消息传递变得多么令人愉快。

所以首先。 连接池。

当然,您总是听说过要建立连接。 这到底是什么意思,为什么要这么做?

与创建会话或使用方等其他操作相比,打开与ActiveMQ代理的连接是一项相对昂贵的操作。 因此,在发送或接收消息并通常与代理进行交互时,如果可能的话,您希望重用现有的连接。 您不需要做的就是依靠JMS库(例如Spring JmsTemplate),该库在每次发送或接收消息时都会打开和关闭连接……除非您可以合并/缓存连接。

因此,如果我们可以同意池化连接是一个好主意,请看一个示例配置:

<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop"><property name="maxConnections" value="10" /><property name="maximumActiveSessionPerConnection" value="10" /><property name="connectionFactory" ><bean class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL" value="tcp://127.0.0.1:61616" /></bean></property></bean>

您甚至可能要使用Apache Camel及其出色的camel-jms组件,因为否则这样做很愚蠢。 因此,也许您想要设置类似于以下内容的JMS配置:

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"><property name="connectionFactory" ref="pooledConnectionFactory" /><property name="transacted" value="true" /><property name="concurrentConsumers" value="15" /><property name="deliveryPersistent" value="true" /><property name="requestTimeout" value="10000" /><property name="cacheLevelName"  value="CACHE_CONSUMER" /></bean>

此配置基本上对消费者意味着,设置15个并发消费者,使用事务(本地),对生产者使用PERSISTENT消息,将超时设置为10000以进行请求答复等。

值得注意的是 :如果您想更全面地了解jms组件的配置,尤其是在缓存使用者,事务等方面,请参考Torsten关于Camel JMS 的出色的博客, 其中包含交易-经验教训 。 也许您还应该花一些时间在他的博客上闲逛,因为他也有很多很好的Camel / ActiveMQ东西!

到目前为止很棒。 我们有一个包含10个连接的连接池,我们希望每个连接10个会话(如果需要,总共100个会话…),以及15个并发使用者。 我们应该能够应付一些沉重的负担,对不对?

在这里看看这条路线。 这很简单,公开了activemq组件(它将使用上面的jmsConfig,因此有15个并发使用者)并仅执行一些日志记录:

from("activemq:test.queue").routeId("test.queue.routeId").to("log:org.apache.camel.blog?groupSize=100");

尝试运行此程序。 您会发现您的消费者立即被封锁,堆栈跟踪将显示出这种美丽:

"Camel (camel-1) thread #1 - JmsConsumer[test.queue]" daemon prio=5 tid=7f81eb4bc000 nid=0x10abbb000 in Object.wait() [10abba000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <7f40e9070> (a org.apache.commons.pool.impl.GenericKeyedObjectPool$Latch)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1151)
- locked <7f40e9070> (a org.apache.commons.pool.impl.GenericKeyedObjectPool$Latch)
at org.apache.activemq.pool.ConnectionPool.createSession(ConnectionPool.java:146)
at org.apache.activemq.pool.PooledConnection.createSession(PooledConnection.java:173)
at org.springframework.jms.support.JmsAccessor.createSession(JmsAccessor.java:196)
....

怎么可能呢? 我们有连接池...我们将每个连接的会话数设置为每个连接10个,那么我们如何阻止创建新会话呢?

答案是,您正在耗尽会话数,就像堆栈跟踪所期望的那样。 但是如何? 我需要喝多少才能解决这个问题?

好吧,现在等等。 喝啤酒,听我说。

首先了解一下。 ActiveMQ的池实现使用commons-pool ,而maxActiveSessionsPerConnection属性实际上已映射到基础池的maxActive属性。 从文档中这意味着:

maxActive controls the maximum number of objects (per key) that can allocated by the pool (checked out to client threads, or idle in the pool) at one time.

这里的键是“键”(字面意思是……文档中的“每个键”子句)。 因此,在ActiveMQ实现中,关键是一个对象,它表示1)是否事务处理模式,以及2)确认模式是() ,如此处所示 。 简而言之,对于该连接上使用的每个密钥,您最终都会获得一个“ maxActive”会话。.因此,如果您有使用事务的客户端,则不进行任何事务,client-ack,auto-ack,transacted-session, dups-okay,等等,您可以开始看到对于每个排列,您最终都将获得“ maxActive”会话。 因此,如果将maxActiveSesssionsionsPerConnection设置为10,则最终可能会得到10 x 2 x 4 == 80个会话。 这是藏在你脑海中的东西。

这里的第二个关键是,当camel-jms组件设置使用者时,它最终会在并发消费者会话指定的所有使用者之间共享一个连接。 这是一个有趣的观点,因为camel-jms使用了底层Spring框架的DefaultMessageListenerContainer,不幸的是,此限制来自该库。 因此,如果您有15个并发使用者,那么他们将共享一个连接(即使是池化……它也会从池中获取一个连接并保持它)。 因此,如果您有15个使用者,每个使用者共享一个连接,每个使用者共享一个事务处理模式,每个使用者共享一个ack模式,那么您最终将尝试为该连接创建15个会话。 最后,您得到了上述结果。

因此,我避免这些情况的经验法则是:

  • 确切了解您的每个生产者和消费者正在做什么,他们的TX和ACK模式是什么
  • 需要时,请始终调整最大会话参数(会话线程太多?我不知道..),但并发ConsumersConsumers + 1的值应至少为ATEST
  • 如果生产者和消费者正在生产/消费相同的目的地,则将连接池拆分:一个消费者池,一个生产者池

邓诺(Dunno)该信息将非常有价值,但我想亲自写下来。 如果其他人觉得它有价值或有疑问,请在评论中让我知道。

参考: 经验教训:ActiveMQ,Apache Camel和我们的JCG合作伙伴 Christian Posta在Christian Posta –软件博客博客上的连接池 。

翻译自: https://www.javacodegeeks.com/2014/03/lessons-learned-activemq-apache-camel-and-connection-pooling.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

羊车门问题

题目描述&#xff1a;有3扇关闭的门&#xff0c;一扇门后面停着汽车&#xff0c;其余门后是山羊&#xff0c;只有主持人知道每扇门后面是什么。参赛者可以选择一扇门&#xff0c;在开启它之前&#xff0c;主持人会开启另外一扇门&#xff0c;露出门后的山羊&#xff0c;然后允许…

webapp优化

1. 优化前提&#xff1a; 业务架构与数据库设计 2. 单页web应用 &#xff1a; ExtJs backbone ng avalon 框架&#xff1a; React Native &#xff0c; ionic &#xff0c; Mui, metror,WeeX,device one Meteor(版本: 1.0) 的另一个特点是它会通过手机内存中运行的 mi…

高版本Sqlserver数据库导入低版本Sqlserver

今天想跑一个关于java网站的demo&#xff0c;结果在附加数据库项这一块出现问题&#xff0c;例程的数据库用的是sqlserver2014&#xff0c;而我的是2008&#xff0c;添加数据库出现错误。经过一番查找&#xff0c;也找到某人写的一些博客上的解决方案&#xff0c;不过不是很清楚…

mysql删除bin-log_删除MYSQl BIN-LOG 日志

1.查找当前有哪些二进制日志文件&#xff1a;mysql> show binary logs;-----------------------------| Log_name | File_size |-----------------------------| mysql-bin.000001 | 1357315 || mysql-bin.000002 | 117 || mysql-bin.000003 | 404002 ||…

WildFly 8与GlassFish 4 –选择哪个应用服务器

自从我上一个博客以来已经有一段时间了。 我显然忙于其他事情&#xff0c;包括我的主要工作。 在对应用服务器的正确选择提出更多疑问之后&#xff0c;是时候再次讨论这个话题并分享我的想法。 该博客上最常阅读的文章之一是有关选择哪种Java EE 6应用程序服务器的文章 。 我一…

Vue--- 一点车项目

一点车项目 cli脚手架 组件化 数据交互路由指向存入数据库 前端页面 cli脚手架的安装与搭建 创建对应包 页面组件化编辑 &#xff08;共享组件&#xff1a;摘取出来一模一样的组件重用&#xff09;&#xff08;私有组件:在自己的组件写入 引入共享组件&#xff09; 数据交…

设计模式:模式或反模式,这就是问题

我最近遇到了Wiki页面“ Anti-pattern” &#xff0c;其中包含详尽的反模式列表。 其中一些对我来说很明显。 他们中的一些让我想了一下&#xff0c;其他的让我想了更多。 然后&#xff0c;我开始在页面上查找反模式“ singleton”&#xff0c;但找不到。 &#xff08;文本搜索…

Redis的散列类型

Redis是采用字典结构以key-value的形式存储数据的&#xff0c;在散列类型&#xff08;所谓的hash&#xff09;中的value也是一种字典结构。如果用关系表结构去理解&#xff0c;就是key为对象&#xff0c;value是属性和属性值。如下图&#xff1a; 所以使用散列&#xff08;hash…

python configparser 注释_使用configpar添加注释

如果您想去掉尾随的&#xff0c;可以按照atomopter的建议将ConfigParser.ConfigParser子类化&#xff0c;并实现自己的write方法来替换原来的方法&#xff1a;import sysimport ConfigParserclass ConfigParserWithComments(ConfigParser.ConfigParser):def add_comment(self, …

easy html css tree 简单的HTML css导航树

code: show: 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

使用Maven和WebLogic 12c开发Java EE应用程序

WebLogic Server 12c现在对Maven提供了很好的支持。 不过&#xff0c;此文档有点被隐藏&#xff0c;因此这里是直接链接http://docs.oracle.com/middleware/1212/core/MAVEN 总而言之&#xff0c;Oracle没有为其服务器工件提供公共的Maven存储库管理器托管。 但是&#xff0c;…

Java实现并发线程中线程范围内共享数据

---恢复内容开始--- 利用Map&#xff0c;HashMap键值对的数据结构&#xff0c;实现并发线程中线程范围内数据共享。 package cn.qy.heima2;import java.util.HashMap; import java.util.Map; import java.util.Random;public class ThreadScopeShareData {private static int …

Aspose 插件

百度&#xff1a;Aspose Aspose.Cells.dll Aspose.Slides.dll Aspose.Words.dll 转载于:https://www.cnblogs.com/Tpf386/p/10001814.html

mysql数据库version版本控制_MySQL数据库版本控制

你用什么方法来控制你的数据库&#xff1f;我已经将所有数据库表作为单独的.sql脚本提交到我们的respository(mercurial)。这样&#xff0c;如果团队中的任何成员对employee表进行了更改&#xff0c;比如说&#xff0c;当我更新我的存储库时&#xff0c;我会立即知道哪个表被修…

js生成二维码

1.引入js文件 https://blog-static.cnblogs.com/files/cengjingdeshuige/jquery.qrcode.js https://blog-static.cnblogs.com/files/cengjingdeshuige/qrcode.js 2.页面加入元素 <div id"qrcodeCanvas"></div>3.js里面生成二维码$(#qrcodeCanvas).qrc…

Java 8将默认使用传输级别安全性(TLS)1.2

传输级别安全性&#xff08;TLS&#xff09;1.2将默认设置为3月18日发布的标准Java的下一版本。TLS将提供加密的Internet通信&#xff0c;但不能完全解决Java的安全问题&#xff0c;因为Java的加密通信没有灵丹妙药有关安全问题的解释。 TLS版本1.2将在Java开发工具包&#xf…

18.11.16-高等数学-曲率计算

11.16 转载于:https://www.cnblogs.com/coder211/p/10005502.html

springboot干什么的_Spring Boot 项目的这些文件都是干啥用的?

上一讲我们用官网包或者 IDE 工具&#xff0c;快速构建了 Spring Boot 应用&#xff0c;并且看到了第一个程序的运行结果&#xff1a;Hello World&#xff01;本文我们了解下 Spring Boot 的目录结构&#xff0c;了解一个事物&#xff0c;清楚了它的结构&#xff0c;明白了内部…

微信小程序开发——点击按钮退出小程序的实现

微信小程序官方是没有提供退出的API的&#xff0c;但是在navigator这个组件中&#xff0c;是有退出这个功能的&#xff1a; 详情参考官方文档&#xff1a;navigator。 示例代码&#xff1a; 1 <navigator open-type"exit" target"miniProgram">关闭小…

使用RequestHandlerRetryAdvice重试Web服务操作

1.引言 有时在调用Web服务时&#xff0c;我们可能有兴趣在发生错误的情况下重试该操作。 使用Spring Integration时&#xff0c;我们可以使用RequestHandlerRetryAdvice类实现此功能。 此类将使我们在放弃并引发异常之前重试指定次数的操作。 这篇文章将向您展示如何完成此任务…