问题标签 [nms]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 内存泄漏活动 MQ NMS
我在 ac# 控制台应用程序中遇到内存泄漏,我不知道是什么原因造成的。
我在不同阶段对应用程序进行了转储,以比较堆的变化情况。我注意到那里有很多固定的对象引用和相当多的 ActiveMq 对象。下面是我的 ActiveMq 消费者、生产者和连接。我正在使用最新的 Apache.NMS.ActiveMQ nuget 包。
问题可能完全来自应用程序的另一部分,但此时似乎最有可能是 activeMq。
我想知道是否有人能在我的代码中发现任何可能导致内存泄漏的东西?让我知道我是否可以为您提供更多有用的信息!
.net - SpringFramework .NET - NMS 消息(ActiveMQ)事务的回滚/提交
我正在将现有的 Java/SpringBoot/ActiveMQ 控制台应用程序(它使用来自命名 ActiveMQ 消息队列的消息并处理消息)转换为类似的 C# .NET 控制台应用程序。对于成功案例,我已经让事情正常运行,但是对于消息处理程序无法成功处理消息的情况,我无法复制 Java 应用程序的行为。
当消息处理失败时,我试图复制的失败案例行为是消息的回滚和重新排队(回到接收消息的命名队列中)。
在 Java/SpringBoot 中,我通过将事务配置添加到发生消息处理的适当类/方法来做到这一点。对于失败情况,我抛出一个 RuntimeException(未选中)并允许在 Spring 事务框架中处理此类抛出的异常(使用所有 SpringBoot 默认值进行此类异常处理),并且基于框架的事务回滚处理,消息重新排队。我没有在我的 Java 应用程序代码逻辑中明确地进行任何回滚处理,而是允许框架默认流程来处理所有这些。
我不太熟悉用于在我的 C# 应用程序中实现这种自动回滚/重新排队行为的 Spring .NET 模拟。而且,到目前为止,我还无法复制这一点。根据 Spring .NET 文档的第 31.5.5 节:
在事务中调用消息侦听器只需要重新配置侦听器容器。本地消息事务可以通过设置属性 SessionAcknowledgeMode 来激活,该属性对于 NMS 是枚举类型 AcknowledgementMode,设置为 AcknowledgementMode.Transactional。然后,每个消息侦听器调用将在一个活动的消息传递事务中运行,在侦听器执行失败的情况下回滚消息接收。
我在我的 C# 控制台应用程序的 Main 方法中遵循了上述规定:
但是,我不清楚如何在我的 C# 控制台应用程序中触发侦听器执行失败。我尝试抛出各种类型的异常(ApplicationException、Exception、NMSException),但我没有看到消息重新排队。
任何启示将不胜感激。
仅供参考,这是额外的相关代码逻辑和配置:
消息处理方式:
这是 RecordVideo 方法的一个版本,为了清楚起见,省略了很多不相关的代码逻辑:
而且,这里是控制台应用程序的相关 Spring .NET 配置:
更新:在重新阅读 Spring .Net 文档的第 31 章(并对我的控制台应用程序进行了更多修改)之后,我找到了解决方案/答案。默认侦听器容器 (Spring.Messaging.Nms.Listener.SimpleMessageListenerContainer) 不提供我试图从我的 Java/Spring/ActiveMQ 模型中模拟的行为(顺便说一句,这是在上下文中消息处理的默认行为使用 Java/SpringBoot 框架的事务)。具体来说,如第 31.5.2 节异步接收中所述:
在消息处理期间抛出的异常可以传递给 IExceptionHandler 的实现,并通过属性 ExceptionListener 向容器注册。如果异常是 NMSException 类型(或其他提供程序的等效根异常类型),则将调用已注册的 IExceptionHandler。SimpleMessageListenerContainer 将在错误级别记录异常,并且不会将异常传播给提供者。确认和/或事务的所有处理都由侦听器容器完成。您可以重写方法 HandleListenerException 以更改此行为。
因此,为了获得所需的行为,我必须提供自己的 IExceptionHandler 和 IErrorHandler 实现,它们将异常传播给提供者。提供者(在我的例子中是 ActiveMQ)将看到异常并将消息重新排队。
这些接口的简单实现如下:
而且,如果想要/需要区分特定的异常类型(例如,其中一些应该触发重新排队,而另一些我们只想记录/吞下),当然可以在处理程序中添加代码逻辑来做到这一点.
activemq-artemis - 如何监控 ActiveMQ Artemis
我正在 Windows .NET 环境中使用 RabbitMQ、ActiveMQ "Classic" 和 ActiveMQ Artemis 进行一些测试。RabbitMQ 和 ActiveMQ “Classic” 带有一个 Web 界面,您可以在其中查看有关您的代理、队列、消息等的信息,但 ActiveMQ Artemis 没有。我真的希望能够在 Web 界面中或至少使用一些 cmd/PowerShell 命令来监控我的 ActiveMQ Artemis 代理。
我在此页面上阅读了一些可用于监视 ActiveMQ 实例的第三方工具,并且我认为它也适用于 Artemis。不幸的是,我无法让这些第三方工具正常工作。其中一些似乎在 Windows 上无法正常工作,而另一些则是旧的/不活动的。
我的客户通过 C# 中的 NMS(.NET 消息传递 API)与代理进行通信。如果有人能够监控他们的 Artemis 代理,尤其是在 Windows 机器上,请告诉我你是如何做到的!
编辑:
我现在已经设法与 Jolokia REST API 进行通信。请求GET
:
我可以看到有关我的队列的大量信息,例如添加和使用的消息。这是对我有帮助的好信息,但我想了解有关当前内存使用情况和磁盘使用情况的信息。
c# - 使用 Apache NMS STOMP 连接到 RabbitMQ
我正在尝试使用 STOMP 协议在 Rabbit MQ (3.6.5) 队列中读取和写入消息。我使用 Apache NMS Stomp (1.5.4) 作为客户端库。
使用 NMS 发送消息时出现以下异常:
输入字符串格式不正确。
原因是 NMS 期望归档的message-id在特定位置包含一个数字。
这是 NMS 库中的代码:
Rabbit MQ Broker 发送的 message-id 字段有以下值:
“T_ID:fig-52033-636066062974737556-1:0:1:1@@session-lOnNy1WnMfOTxEEVQmLHgg@@1”
NMS 尝试转换“1@@session -Bo6HXXTZFSh51Qy7X4wx9A@@1"到 Int64。
这是我的客户代码:
这个问题有解决方案吗?
- 一种配置 NMS 以不同方式处理 id 的方法?
- 一种告诉 Rabbit MQ 生成其他消息 ID 的方法?
c# - 由于以下原因无法提取正文:javax.jms.JMSException:无法从字节构建正文(无法将发送的 Zip 文件提取到 ActiveMQ)
我正在尝试使用我在 C# .NET 上编写的客户端应用程序向 ActiveMQ 服务器发送消息。我有已转换为 Zip 流并尝试发送的 XML 消息。
在服务器端解析数据时出现异常,例如:
JMS 消息侦听器的执行失败。原因:[org.apache.camel.RuntimeCamelException - 无法提取正文,原因是:javax.jms.JMSException:无法从字节构建正文。原因:java.io.StreamCorruptedException:无效的流标头:00010000。消息:ActiveMQObjectMessage。
当我调试代码并设置断点时,Bodylength 上出现异常,并且内容说“request.Content”引发了“Apache.NMS.MessageNotReadableException”类型的异常
在 ActiveMQ 服务器上发送消息是否有任何特殊的 zip 转换?请帮忙。谢谢
c# - 带有故障转移设置的 ActiveMQ 上未确认的消息不会重新传递给订阅者
我正在 c# 中实现 Active MQ 发布者和订阅者。我正在使用 Apache.NMS.ActiveMQ .net 客户端库与代理进行通信。
ActiveMQ 在 4 个服务器上配置了故障转移设置(.225、.226、.346、.347 - IP 的最后一部分供参考)。经纪人网址看起来像
故障转移://tcp://103.24.34.225:61616,tcp://103.24.34.226:61616,tcp://103.24.34.346:61616,tcp://103.24.34.347:61616
这是我发布的方式
这是我订阅该主题的方式。此代码设置为,多个共享订阅者可以侦听传入消息。有人告诉我,我必须使用虚拟主题来实现这一点。因此,我将订阅者配置为使用虚拟主题,并且它托管在 Windows 服务项目中。我使用确认模式作为 ClientAcknowledge,因此除非消息被确认,否则它应该不断返回。下面的代码片段仅代表 Windows 服务的重要订阅者部分。
我能够发布和订阅消息。我遇到了一个特定案例的问题。假设订户从故障转移服务器池中建立了到(.225 代理服务器)的连接。发布者发布了一条消息。订户收到它,它正在处理中。但由于一些服务器补丁维护,windows服务不得不关闭。结果,与代理的订阅者连接断开了。当 Windows 服务恢复时,这一次订阅者建立了与故障转移池中的不同代理服务器(.346 代理服务器)的连接。发生这种情况时,未确认的消息永远不会重新传递。但是,如果我重新启动 Windows 服务并且运气好的话,如果建立了与 .225 代理的连接(与订阅者最初连接的同一服务器),
我的假设是,当在故障转移设置中配置 ActiveMQ 时,无论订阅者能够与故障转移池中的哪个代理服务器建立连接,它都应该始终接收未确认的消息。
在某些情况下,故障转移设置似乎可以正常工作。假设订阅者从故障转移池连接到 .346 代理服务器。发布者从同一个池连接到不同的代理服务器(.225 代理)并发布消息,订阅者正在接收消息。这证明故障转移设置正在运行。
但是,一旦订阅者从代理服务器接收到消息,并且如果订阅者在确认消息之前断开连接,则它必须重新建立与同一代理服务器的连接才能接收未确认的消息。这对我来说听起来不对。
Active MQ 服务器设置是否需要任何其他配置才能使此用例正常工作?
java - 寻找 Iterable 的类以使用反射创建构造函数
再会,
我有一个关于 Java 反射的问题。PacketPlayOutPlayerInfo
我想使用以下构造函数实例化一个类的构造函数:
要构建构造函数,我使用此方法
第一个参数工作得很好,但我必须以某种方式获得接口 Iterable 的类才能让构造函数工作......(或者我可以吗?)
提前感谢,祝你有美好的一天,
rapt0r
java - 故障转移传输协议无法处理消费者控制消息
作为 AbortSlowConsumerStrategy 的一部分,如果 Active MQ 发现消费者速度很慢,它会发送关闭消费者的命令,但在消费者/客户端,故障转移传输协议实现似乎无法处理此消费者控制命令,它失败说,“错误: 未知命令 - ConsumerControl.."; 有没有更好的方法来中止消费者而不是接收错误?
请注意,消费者在 DotNet 中使用 Apache.NMS 库。
c# - NMS ActiveMQ 忽略代码中设置的预取限制
我正在使用当前的 Apache.NMS 1.7.1 和 Apache.NMS.ActiveMQ 1.7.2。我正在使用IndividualAcknowledge
,所以我试图将加载的消息的数量保持在很低的水平,因为如果我在没有 Acking 的情况下加载了 >>1000 条消息,它会变得非常慢(它每次都在搜索所有消息的链接列表)。
我有以下代码片段:
该队列testQueue
包含 >>20_000 条消息。等待几秒钟后,_collection
包含所有消息,而我没有确认任何消息。
如果我理解正确的文档,我应该最多得到 1000 个,直到我开始承认它们。
一旦代理向消费者发送了预取限制数量的消息,它就不会再向该消费者发送任何消息,直到消费者确认了它收到的至少 50% 的预取消息,例如 prefetch/2。当代理收到所述确认后,它将向消费者发送更多预取/2 条消息,以“充值”,就像它的预取缓冲区一样。
我还尝试了一些变体,例如仅QueuePrefetch
在 url 中设置或设置策略:
或在队列中:
关于 的缓慢IndividualAcknowledge
,我已经尝试了其他几个选项,但运气不佳:
虽然我并不完全清楚最后一个选项的区别。
c# - 使用 C# 和 Apache NMS 的 ActiveMQ - 计算队列的消费者
我正在尝试使用 C# 为 ActiveMQ 编写一个监控解决方案。作为其中的一部分,我需要监视队列中未决消息的数量以及该队列的活动消费者数量。你能帮我如何获得一个队列的消费者数量吗?我可以使用这个答案来计算没有待处理的消息