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

数据库异常后MDB中没有消息重新传递

於乐语
2023-03-14

场景:

    null
    null

代码段:

@MessageDriven(mappedName = JMSConstants.COMMAND_SPOOL_TOPIC_JNDI, activationConfig = {
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
    @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
    @ActivationConfigProperty(propertyName = "clientId", propertyValue = "PrinterCommandSpoolMessageBean"),
    @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "PrinterCommandSpoolMessageBean"),
    @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = JMSSelector.PRINT_COMMAND_SELECTOR)
})
public class PrinterCommandSpoolMessageBean implements MessageListener {

    private final static Logger LOGGER = Logger.getLogger(PrinterCommandSpoolMessageBean.class.getName());
    
    @EJB
    private CoreServiceRemote coreService;

    @Override
    public void onMessage(Message message) {
       
        LOGGER.info("*********************  message arrived ********************");
        if (message instanceof MapMessage) {

            CommandSpool cs = null;
            try {
                MapMessage mapMessage = (MapMessage) message;

                //missing code

                if (actualCopies >= copies) {
                    coreService.updateCommandSpool(cs.getId(), CommandSpoolStatus.EXECUTED);            
                    coreService.setSensorIssued(ps.getSensorUUID());    
                } else {
                    coreService.updateCommandSpool(cs.getId(), CommandSpoolStatus.NOT_EXECUTED);
                }

            } catch (Exception ex) {
                LOGGER.log(Level.WARNING, "Exception", ex);
                if (cs != null) {
                    coreService.resetCommandSpool(cs.getId());
                }
            
        }
    }
}

共有1个答案

公孙阳文
2023-03-14

您确定coreservice.resetCommandSpool(cs.getID())没有引发另一个异常吗?

既然捕获了所有异常,那么是否希望MDB是事务性的?您总是可以在ejb方法上启动一个新事务。

 类似资料:
  • 问题内容: 我正在使用.NET Web窗体和数据库作为数据源来构建一个简单的站点。 问题是:我有一个正常工作的后台槽,可以创建,修改和删除新页面。 虽然我可以创建和删除,但是编辑功能不起作用。 我意识到问题可能出在查询中,因为代码对于其他功能运行正常。 这是查询: 我不太喜欢SQL,我做错什么了吗? 先感谢您 编辑N掳2。目前,该查询无法正常工作,基本上,某些内容和标题中带有撇号,并且当我更新该特

  • 我正在读一条来自Solace的信息。我能够成功地阅读信息。假设我正在阅读一条消息,在侦听器线程上读取/处理消息时,应用程序崩溃。那我怎么能在那上面再读一遍那条信息呢。使用下面的代码,我无法再次阅读该消息。下面是我的配置

  • 前言 在封装创建request的时候会调用handleProduceResponse(),这个里面会调用 有异常并且可以重试,执行第一个分支,会调用 有异常但是不可以重试,执行第二个分支,会调用

  • 问题内容: 这是我正在尝试做的事情, 并且大多数时候我都成功了:基本上,我在网站上登录,然后等待一个类出现在源代码中,然后处理源代码。 我得到的例外: 这是代码: 我也尝试过这个: 我得到同样的例外。 我目前正在尝试: 我还没到失败的地步,我还在测试它。 抱歉,这很长。但是我想为这些随机超时找到一个pythonic干净的解决方案。 另一个可能也有帮助的信息:登录过程有时会很长,但是即使等待几分钟,

  • 是否可以在MDB(消息驱动Bean)中为“目的地”动态分配运行时值? 我还尝试了ejb-jar.xml方法,但是“activation-config-property-name”=“destination”的值被理解为队列的文字物理名称。因此我无法对资源进行JNDI查找。 从属性读取和分配目标或使用-d参数传递值的正确方法是什么?

  • 我们有一个camel路由,在这里我们从输入队列读取消息,处理它,设置一些JMS头(使用exchange.getin().setheader(...)),然后将消息路由到某个输出队列。在MQ故障转移方案期间,将重新传递消息。但是,当重新传递消息时,我前面放置的JMS头丢失了。是否有任何方法可以在重新交付后保留JMS头?