JMS消息re

我有一个JMS客户端,可以在接收到消息时远程访问系统(并在那里做各种事情 - 与问题无关)。 数百个这样的消息可能会在短时间内到达,需要尽快处理。

但是,收到消息时某些远程系统也可能不可用,因此应该推迟到稍后(例如1小时左右)。 最好的解决方案是将消息放回到队列中,设置一些“延迟”值,这将告诉JMS代理不要在一个小时内再次传递消息。

什么是不好的:在接收线程中睡觉,一小时后醒来。 由于消息消费池是有限的(例如,8个可用的连接),具有8个不可到达的系统会不必要地阻塞整个处理,这是不可接受的。

对于这样的“延迟”值,我没有找到消息或队列本身的设置,它是否存在?

解决方法是使用第二个队列将消息存储到不可访问的系统,并分别处理这些消息。 但它不是一个非常优雅的解决方案,并且需要额外的编程。 也许有更好的办法。


在JMS 2.0之前,这不可能通过JMS API。 作为一般规则,消息传输经过优化以尽可能快地传递消息,并且缺少调度程序以便在某些任意间隔内保存重传消息。 假设有一个传输提供者具有这样的功能,那么你写的任何东西都会被绑定到该传输提供者,因为虽然代码可能符合JMS,但应用程序本身依赖于这个特定于供应商的行为。

请参阅@Shashi的答案,该答案适用于支持JMS 2.0的MQ版本。


JMS 2.0规范定义了一个“传递延迟”,客户端可以为其发送的每条消息指定一个以毫秒为单位的传递延迟值。 该值定义了消息传递时间,它是消息的传递延迟与它发送的GMT(对于事务发送,这是客户端发送消息的时间,而不是事务提交的时间)的总和。

消息的交付时间是JMS提供商可以使消息在目标目标上可见并可用于交付给消费者的最早时间。 在达到交付时间之前,提供商不得传递消息。

对于上述场景,此功能非常方便。


在这种情况下,使用容器管理事务。 事务在容器调用onMessage方法时启动,如果onMessage方法成功完成(当抛出RuntimeException或从MessageDrivenBean上下文中调用setRollBackOnly时,它将失败)。 您还可以配置重新发送间隔和最大重新发送次数。

如果您将OpenMQ与Glassfish服务器配合使用,则可以在ejb-jar.xml描述符中配置它。 在ejb-jar.xml描述符中,设置属性endpointExceptionRedeliveryInterval(以毫秒为单位)和endpointExceptionRedeliveryAttempts(将消息发送到死信息队列之前重新传递的次数)。 这里是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar  xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
    version="3.1">    
    <enterprise-beans>
        <message-driven>
            <ejb-name>EjbName</ejb-name>
            <ejb-class>com.example.MyMessageDrivenBean</ejb-class>
            <messaging-type>javax.jms.MessageListener</messaging-type>
            <transaction-type>Container</transaction-type>
            <activation-config>
                <activation-config-property>
                    <activation-config-property-name>destination</activation-config-property-name>
                    <activation-config-property-value>someQueue</activation-config-property-value>
                </activation-config-property>
                <activation-config-property>
                   <activation-config-property-name>destinationType</activation-config-property-name>
                   <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
                </activation-config-property>

                <activation-config-property>
                    <activation-config-property-name>endpointExceptionRedeliveryInterval</activation-config-property-name>
                    <activation-config-property-value>5000</activation-config-property-value>
                </activation-config-property>
                <activation-config-property>
                    <activation-config-property-name>endpointExceptionRedeliveryAttempts</activation-config-property-name>
                    <activation-config-property-value>4</activation-config-property-value>
                </activation-config-property>
            </activation-config>
        </message-driven>
    </enterprise-beans>
</ejb-jar>

并且在消息驱动bean内部抛出一个RuntimeException,将其标记为失败,并且该消息将返回到队列中。

以下是WebLogic Server的配置属性:http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/pagehelp/JMSjmstemplatesjmstemplateconfigredeliverytitle.html

链接地址: http://www.djcxy.com/p/34061.html

上一篇: JMS message re

下一篇: rendering to texture