- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个要求,目前我不知道是否可能。如果消息包含指定的属性,我想暂时禁用 JMS 消息的开发。目前我使用 HornetQ 作为消息提供程序。
让我们举个例子:
队列包含以下三个条目:
{1, "foo", "A_CATEGORY"}
{2, "bar", "B_CATEGORY"}
{9, "bof", "A_CATEGORY"}
在某个时刻,应用程序必须能够告诉 HornetQ 消息服务器此时不应传递属于 B_CATEGORY 的消息(例如,因为 B_CATEGORY 对象的基础数据库已更新)。因此,ID 为 2 的消息目前不会被传递,而 1 和 9 将会被传递,因为它们对于类别对象具有不同的值。
它必须在 Java 代码之外发生,根本不需要重新启动应用程序。这可能吗?
感谢您的帮助!
<小时/>只是考虑了解决此问题的替代设计方法。我们假设第一个队列包含各种类别的消息(顺便说一句,不可能为每个类别创建一个队列,因为可能有很多类别)。这个“正常”队列是正常配置的(例如,没有过期时间,但有 DLQ)。
现在,如果监听器使用此类消息并发现它无法处理属于特定类别的消息,则会将其放入第二个队列中。该队列配置了重新传递延迟和到期时间。如果现在将到期时间设置得足够高(当然不是队列溢出)并且重新传递时间不太短,那么如果上述问题没有解决方案,这应该可以解决。
当然,必须计算在无法处理某个类别的时间内可以创建多少个队列条目。以及某个类别的不可用可能需要多长时间,以便可以相应地调整重新交付。
最佳答案
据我所知,消息驱动的 Bean 是不可能的。
使用标准 JMS 使用者可以实现类似的功能:
MessageConsumer c = session.createConsumer(destination);
while ( b-category-can-be-processed ) {
Message m = c.receive();
// process messages until b category is OK to be processed
}
c.close();
// now create a different consumer with message selector ignoring "B_CATEGORY"
MessageConsumer c1 = session.createConsumer(destination, "Category <> 'B_CATEGORY'");
while ( b-is-locked ) {
Message m = c1.receive();
// process messages until b category is locked
}
c1.close();
// go to start
此示例假设您能够根据收到的消息判断何时再次处理 B。如果没有,那么您可以在一段时间后恢复正常的日常生活。该示例还仅呈现单个执行线程。
进一步探索这条路径,您可以看看 Spring 的 DefaultMessageListenerContainer
— Spring 消息驱动 bean。它可以完全按照我所描述的方式进行操作,但方式要高级得多。它可以通过消息选择器提供,并且它是实时的,您可以随时更改它。如果您将 concurrentConsumers 设置为大于 1,它也会处理多个线程中的消息。
至于您在无法处理消息时将消息重定向到另一个队列的解决方案,请注意它会产生额外的流量;您确实希望最终处理所有消息,对吧?为什么不把它们留在原处并在适当的时候取回它们呢?您不必提前估计重新投递延迟,这可能很困难。
关于java - 根据消息属性暂时禁用 JMS 消息的传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7705077/
我正在读这个 question和 corresponding answer并被答案第一行中的术语 JMS broker 弄糊涂了: MS (ActiveMQ is a JMS broker imple
我正在学习 API 中的 Reactive Streams,我对它与 JMS 之间的相似性感到震惊。在 JMS 中,我们也有异步处理、发布者和订阅者。我在进行这种等效时缺少什么观点? 最佳答案 Rea
假设生产者向 JMS 主题“新闻”发送一条消息。消费者 1 读取了消息,但消费者 2 处于离线状态,因此他还没有读取消息。 是否有任何内置(针对规范或实现)的方式来通知生产者消费者 1 已阅读他的消息
目前我正在开发一个 JMS 应用程序。但我使用普通的 JMS API 和属性文件进行配置。我的应用程序在 Weblogic 中运行并连接到我客户端的 MQ 系列服务器。 最近我知道我可以使用 Webl
我正在尝试使用 Solace 中可用的异步发送功能,但我打算使用 JMS 进行抽象,而不是直接使用 JCSMP 使用它。 JMS 2.0 支持异步发送以及其他新功能:http://www.oracle
我无法获得 javax.jms.ConnectionFactory注入(inject)我的独立 JMS 客户端。 我得到一个 java.lang.NullPointerException在 conne
保持 JMS 连接/ session /消费者始终打开是一种不好的做法吗? 代码草稿示例: // app startup code ConnectionFactory cf = (Connection
我有几个作业,每个作业都有多条消息排队。每个作业的消息随机交错。如果用户决定取消作业,我想从队列中删除属于该作业的所有消息。我已经能够使用 browse() 找到所有要删除的消息,但一直无法弄清楚如何
是否可以将主题配置为仅存储最后一条消息的副本并将其发送到新连接而不知道客户端标识符或其他信息? 更新: 从 Shashi 提供的信息中,我发现这两页使用 retroactive consumer 描述
目前正在使用 WebLogic 和分布式队列。我从文档中了解到,分布式队列允许您使用全局 JNDI 名称检索到集群中任何队列的连接。分布式队列为您提供的主要功能之一似乎是跨多个托管服务器的负载平衡连接
再见,我的基本要求是有一个可以发送消息的路由,并将其放在 JMS 队列中。 camel 上下文在 JavaEE 6 容器中运行,即 JBoss AS 7.1.1,因此它是 HornetQ for JM
我正在阅读 JMS 2.0 规范,其中提到(相关摘录下方)如果客户端尝试修改 Message 对象,则 JMS 提供程序可能会抛出异常。 我的问题是 JMS 提供者如何知道客户端是否试图修改 Mess
我的 spring 上下文文件中有以下设置。 "PowerEventQueue" “${
我正在尝试使用 JSP 连接到 ActiveMQ。但是,当我运行该程序时,它给了我以下类型的异常: NoClassDefFoundError: javax/jms/Destination . 我不确定
我刚看了CORBA和JMS,他们好像都是用来实现的代理架构/模式。 我对他们有几个问题 1.他们之间的区别我还不是很清楚,谁能解释一下? 2.CORBA 是否用于当今的 IT 解决方案?还是正在失去魅
我正在更新现有的 Mule 配置,任务是增强它以根据消息的某些属性将消息路由到不同的端点,因此最好对我手头的两个选项有一些利弊: 在消息上添加属性,使用“message-properties-tran
我有一个订阅 JMS 主题应用程序的 Java 应用程序,该应用程序偶尔会出现以下异常: javax.jms.JMSException: Connection has been terminated
我知道 Camel 的 JMS 组件用于接收消息,使用 Springs DefaultMessageListenerContainer。它可以配置为使用 CLIENT_ACKNOWLEDGE 模式来确
通常不鼓励使用从 JMS 提供者返回的消息 ID 作为相关 ID,将消息发布到队列中。人们如何为请求/响应架构生成相关 ID? 最佳答案 客户端可以使用唯一的 ID 标准,如 UUID生成新的 ID。
我有一个简单的代码可以将 2 条消息放入队列中。 1) 我用两台服务器设置了 connectionNameList。 2) 这两个服务器是独立的,但有相同的队列管理器和定义相同名称的队列,例如“QMg
我是一名优秀的程序员,十分优秀!