Java 我可以直接向队列发送消息请求吗?

Java 我可以直接向队列发送消息请求吗?,java,queue,jms,activemq,Java,Queue,Jms,Activemq,我有一个从队列接收消息的客户端。我目前有一个MessageListener,它实现了onMessage() 收到消息后,将对其进行进一步处理,然后将其保存到onMessage()方法上的数据库中;然后,客户端确认消息接收 只要数据库还在运行,就没有问题。但是如果数据库关闭,客户端将不会确认 为了解决这个问题,我希望客户端以预定的间隔向队列发送任何未确认消息的预定请求 事实上,我做这件事的唯一方法就是重新启动客户端,这并不理想。是否有方法触发队列在不重新启动的情况下重新发送未确认的消息 我在onM

我有一个从队列接收消息的客户端。我目前有一个
MessageListener
,它实现了
onMessage()

收到消息后,将对其进行进一步处理,然后将其保存到
onMessage()
方法上的数据库中;然后,客户端确认消息接收

只要数据库还在运行,就没有问题。但是如果数据库关闭,客户端将不会确认

为了解决这个问题,我希望客户端以预定的间隔向队列发送任何未确认消息的预定请求

事实上,我做这件事的唯一方法就是重新启动客户端,这并不理想。是否有方法触发队列在不重新启动的情况下重新发送未确认的消息

我在
onMessage()中的内容


我认为标准行为已经在做您想要做的事情:如果MessageBroker正在使用同一个数据库,而数据库不可用,它将不接受消息,因此客户端将假脱机消息,直到MessageBroker再次准备就绪

如果它们不共享同一个数据库,并且MessageBroker处于启用状态,则如果
onMessage
引发异常,它将假脱机消息并重试。
message broker将根据其可配置策略尝试重新发送。

经过进一步研究,我偶然发现了会话.recover(),我可以使用它触发重新发送。我已经看到了RedeliveryPolicy类,我可以使用它设置消息重发选项。现在,我的代码如下所示:

ConnectionFactory factory = new ActiveMQConnectionFactory(url);
RedeliveryPolicy policy = new RedeliveryPolicy();
policy.setBackOffMultiplier((short) 2);
policy.setRedeliveryDelay(30000);
policy.setInitialRedeliveryDelay(60000);
policy.setUseExponentialBackOff(true);
((ActiveMQConnectionFactory)factory).setRedeliveryPolicy(policy);

final Session session = connection.createSession(false,
                Session.CLIENT_ACKNOWLEDGE);
...
...
...
..


//inside onMessage()
try {
    if (DB is available){
        //process message
        //save required details to DB
        msg.acknowledge();
    }
    else{
        session.recover();
    }
    } catch (Exception e) {}

如果数据库已关闭,为什么不等到它启动后再尝试继续。这样就不需要重播消息在DB启动之前你是说阻塞吗?我不确定这是好的。。。除非我误解了你的评论。如果你在数据库打开之前阻止,会发生什么?那个线程有更重要的事情要做吗?;)如果是这样,我会在另一个线程、会话或连接中运行更重要的东西。谢谢。我想我的问题是如何以及在哪里配置activeMQ来重新发送未确认的消息,而不是初始化来自客户端的重新发送请求。我该怎么做?
ConnectionFactory factory = new ActiveMQConnectionFactory(url);
RedeliveryPolicy policy = new RedeliveryPolicy();
policy.setBackOffMultiplier((short) 2);
policy.setRedeliveryDelay(30000);
policy.setInitialRedeliveryDelay(60000);
policy.setUseExponentialBackOff(true);
((ActiveMQConnectionFactory)factory).setRedeliveryPolicy(policy);

final Session session = connection.createSession(false,
                Session.CLIENT_ACKNOWLEDGE);
...
...
...
..


//inside onMessage()
try {
    if (DB is available){
        //process message
        //save required details to DB
        msg.acknowledge();
    }
    else{
        session.recover();
    }
    } catch (Exception e) {}