当前位置: 首页 > 知识库问答 >
问题:

Spring JMS-通过将消息发送回相同队列而不是回滚事务来重新传递

曾皓
2023-03-14

这是我在这里的第一个帖子,所以如果我不尊重格式规则或其他一般规则,我提前道歉。

我有一个基于Spring JMS的客户机应用程序,它使用多个使用者从队列中读取。我的约束条件是:在失败的情况下保证重发和消息重复检测。

<bean id="jndiDestinationResolver" class="org.springframework.jms.support.destination.DynamicDestinationResolver" />


    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <constructor-arg ref="MyConnectionFactory" />
        <property name="destinationResolver" ref="jndiDestinationResolver" />
        <property name="receiveTimeout" value="100" />
    </bean>


    <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
            <property name="destinationResolver" ref="jndiDestinationResolver" />
            <property name="connectionFactory" ref="MyConnectionFactory" />
            <property name="destinationName" value="my_Queue" />
            <property name="messageListener" ref="MyListener" />
            <property name="maxConcurrentConsumers" value="10"/>
            <property name="sessionTransacted" value="true"/>
    </bean>

    protected void processTextMessage(TextMessage textMessage) {
        try {
            // process message
        } catch(Exception e) {
            try {
                sendTextMessage("my_Queue",correlationID, textMessage.getText());
            } catch (JMSException e1) {
                log.error("Error writing message back to the queue!");
                throw JmsUtils.convertJmsAccessException(e1);

            }
        }
    }


    protected void sendTextMessage(String queueName, final byte[] correlationID, String message) {
        jmsTemplate.convertAndSend(queueName, message, new MessagePostProcessor() {
            public Message postProcessMessage(Message message) throws JMSException {
                message.setJMSCorrelationIDAsBytes(correlationID);
                return message;
            }
        });
    }

我希望这对于我将要使用的JMS提供程序是透明的(在生产环境中使用Websphere MQ)。目前,我希望通过抛出一个异常来避免回滚事务:我希望重新调度失败的消息,就像队列中的新消息一样。对于重复检测,我认为插入一个业务存在检查就足够了。

事先表示感谢并致以最良好的问候

共有1个答案

华福
2023-03-14

是的,这是正确的做法。

 类似资料:
  • 我有一个向rabbitmq发送消息的服务,消费者对消息进行一些操作并重新排队。 我可以成功地将初始消息发送给rabbitmq,但问题是,如果消息需要修改,我无法将任何已使用的消息重新发送给rabbitmq。 我试图用new创建一个新类,但“MyService”始终为空

  • 我已经设置了Apache camel,在其中我使用来自一个队列的消息并对其进行某种操作,然后将其传输到其他队列。 现在,如果异常来了,我希望它应该回滚,然后在6次尝试后,它发送到死信队列,目前回滚发生5-6次,但我的消息没有转移到死信队列。 这里会发生什么-->Queue1->>(消耗)-->Operation(引发异常)-->Rollback-->Queue1->>(消耗)-->Operatio

  • 因此,我实现了自己的mpi库(简化版本),我需要在进程之间发送/接收一些数据。MPI_Send看起来像这样(void *buf,整数计数,数据类型数据等)。所以这意味着我需要发送数据类型(char,double或int)的计数元素,指向buf的地址。我需要通过消息队列(mq)发送它们。MPI_Recv采用大致相同的参数。目前,这是我在发送和Recv中所做的: 现在我只接收数组的第一个元素。我该如何

  • 我正在尝试为Web设置Firebase云消息传递。我成功地对其进行了正确初始化并获得了令牌: manifest.json与gcm_sender_id 我可以看到我在控制台中得到令牌,所以我试图验证它,并通过邮递员发送我的第一个通知-这里是留档。 发布网址:https://fcm.googleapis.com/v1/projects/PROJECTID/messages:发送授权:无授权 标题 Bo

  • 我在这里尽量简明扼要。我已经研究了网络上报告的许多类似问题,并根据这些问题评估了我的问题。但是,这并没有解决我的问题。所以我终于把这个放上去了。 我有一个带有默认值的spring注释的事务性服务(在实现的类方法上进行了注释)。该服务通过直接调用mybatis映射器方法(在服务中自动连线)来执行一些插入(在循环中)和无参数存储过程调用。 我在Tomcat和驱动程序管理器连接单元测试中使用JNDI连接

  • 我在我的代码中为我的机器人配置和一般的东西建立了一个类,我很整洁,所以,客户端不协调。Client()和bot。是我的类在我的bot类中我存储了一些通道ID,然后我注意到了客户端。发送消息(channelid,message)方式不再支持。但是,我将通道id变量编辑为 客户=不和谐。Client()位于我的类之上,它已定义。 我用这个发信息 我期待着那个频道的消息,但现实是: 简而言之,我的cha