我想将一批 20k JMS 消息发送到同一个队列。我使用 10 个线程将任务拆分,因此每个线程将处理 2k 条消息。我不需要交易。
我想知道是否推荐使用一个连接、一个 session 和 10 个生产者?
如果我有一个由所有线程共享的生产者呢?我的消息会损坏还是同步发送(没有性能提升)?
如果我总是连接到同一个队列,决定是否创建新连接或 session 的一般准则是什么?
谢谢你,很抱歉一次问了很多。
(这是一个类似的问题,但它并没有完全回答我正在寻找的内容。Long lived JMS sessions. Is Keeping JMS connections / JMS sessions allways open a bad pratice?)
最佳答案
如果某些消息重复或丢失,是否可以?当 JMS 客户端通过网络连接到 JMS 代理时,任何 API 调用都分为三个阶段。
考虑一下制作人。如果在第一步中连接中断,那么代理永远不会收到消息,应用程序需要再次发送它。如果在第三步中连接断开,则消息已成功发送,再次发送将产生重复消息。该应用程序无法分辨这些之间的区别,因此唯一安全的选择是在出错时重新发送消息。如果 session 被处理,则在所有情况下都可以安全地重新发送消息,因为如果原始消息已发送到代理,它将被回滚。
考虑消费者。如果在第三步中连接丢失,则消息将从队列中删除,但从未返回客户端。但是如果 session 被处理,消息将在应用程序重新连接时重新传递。
在事务之外,可能会丢失或重复消息。在事务内部存在相同的模糊窗口,但它在 COMMIT 调用而不是 PUT 或 GET 上。通过事务 session ,可以两次发送或接收消息,但不会丢失一次。
JMS 规范识别出这种不明确的窗口并提供以下指导:
If a failure occurs between the time a client commits its work on a Session and the commit method returns, the client cannot determine if the transaction was committed or rolled back. The same ambiguity exists when a failure occurs between the non-transactional send of a PERSISTENT message and the return from the sending method.
It is up to a JMS application to deal with this ambiguity. In some cases, this may cause a client to produce functionally duplicate messages.
A message that is redelivered due to session recovery is not considered a duplicate message.
应始终处理 JMS session ,但丢失消息确实可以的情况除外。如果 session 被处理,那么由于 JMS 线程模型,您需要每个线程的 session 和连接。
任何关于性能影响的建议都将是特定于供应商的,但一般来说,同步点之外的持久消息会在 API 调用返回之前被固化到磁盘上。但是事务调用可以在持久消息写入磁盘之前返回只要消息在 COMMIT 返回之前保持。如果供应商基于此进行优化,那么将几条消息写入磁盘然后分批提交它们的性能要高得多。这允许代理通过磁盘 block 而不是每个消息来优化写入和磁盘刷新。放入事务中的消息数量随着消息的大小而减少,超过一定的消息大小会减少到一个。
如果您的 20k 消息相对较小(以 k 而非 mb 为单位),那么您可能希望使用每个线程的事务处理 session 并调整提交间隔。
关于java - JMS 连接、 session 和生产者/消费者之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4741713/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下