Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何捕获何时建立JMS连接?_Java_Jms_Activemq - Fatal编程技术网

Java 如何捕获何时建立JMS连接?

Java 如何捕获何时建立JMS连接?,java,jms,activemq,Java,Jms,Activemq,我有一些消息生产者正在使用ActiveMQ发送有关某些事件的JMS消息。 但是,到ActiveMQ的连接可能不会一直处于开启状态。因此,事件被存储,当连接建立时,它们被认为是被读取和发送的。这是我的密码: private void sendAndSave(MyEvent event) { boolean sent = sendMessage(event); event.setProcessed(sent); boolean saved = repository.saveE

我有一些消息生产者正在使用ActiveMQ发送有关某些事件的JMS消息。 但是,到ActiveMQ的连接可能不会一直处于开启状态。因此,事件被存储,当连接建立时,它们被认为是被读取和发送的。这是我的密码:

private void sendAndSave(MyEvent event) {
    boolean sent = sendMessage(event);
    event.setProcessed(sent);
    boolean saved = repository.saveEvent(event);
    if (!sent && !saved) {
        logger.error("Change event lost for Id = {}", event.getId());
    }
}

private boolean sendMessage(MyEvent event) {
    try {
        messenger.publishEvent(event);
        return true;
    } catch (JmsException ex) {
        return false;
    }
}
我想创建某种类型的ApplicationEventListener,在建立连接并处理未发送事件时将调用它。 我浏览了JMS、Spring框架和ActiveMQ文档,但找不到如何将侦听器与ConnectionFactory连接起来的任何线索

如果有人能帮我,我将不胜感激

下面是我的应用程序Spring上下文对JMS的描述:

<!-- Connection factory to the ActiveMQ broker instance.              -->
<!-- The URI and credentials must match the values in activemq.xml    -->
<!-- These credentials are shared by ALL producers.                   -->
<bean id="jmsTransportListener" class="com.rhd.ams.service.common.JmsTransportListener" 
      init-method="init" destroy-method="cleanup"/>
<bean id="amqJmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${jms.publisher.broker.url}"/>
    <property name="userName" value="${jms.publisher.username}"/>
    <property name="password" value="${jms.publisher.password}"/>
    <property name="transportListener" ref="jmsTransportListener"/>
</bean>

<!-- JmsTemplate, by default, will create a new connection, session, producer for         -->
<!-- each message sent, then close them all down again. This is very inefficient!         -->
<!-- PooledConnectionFactory will pool the JMS resources. It can't be used with consumers.-->
<bean id="pooledAmqJmsConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
    <property name="connectionFactory" ref="amqJmsConnectionFactory" />
</bean>

<!-- Although JmsTemplate instance is unique for each message, it is  -->
<!-- thread-safe and therefore can be injected into referenced obj's. -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <constructor-arg ref="pooledAmqJmsConnectionFactory"/>
</bean>

从您描述这个问题的方式来看,它听起来确实像是一个开放和封闭的JMS持久订阅案例。在走这条路之前,你可能需要考虑一个更传统的实现方式。除此之外,ActiveMQ还提供了您可以侦听并将针对各种事件(包括新连接)发送的消息

==========

开枪,对不起。。。我不明白问题是什么。我认为咨询根本不是解决办法。。。。毕竟,你需要连接到代理才能获得它们,但是连接是你所知道的

因此,如果我理解正确(准备重试#2…),您需要的是一个客户端连接,当它失败时,会尝试无限期地重新连接。当它重新连接时,您希望触发一个(或多个)事件,将挂起的消息刷新到代理

因此,检测丢失的连接很容易。您只需注册一个JMS。至于检测重新连接,我能想到的最简单的方法是启动一个重新连接线程。当它连接时,停止重新连接线程并使用Observer/Observable或JMX通知等通知相关方。您可以使用,它将为您执行连接重试循环,即使您只有一个代理。至少是这样,但它并没有为你做你自己的重新连接线程所不能做的事情但是如果您愿意将一些控制权委托给它,它将缓存未刷新的消息(请参阅trackMessages选项),然后在重新连接时发送这些消息,这是您尝试执行的所有操作

我想,如果你的代理宕机几分钟,这不是一个坏办法,但是如果你讲了几个小时,或者你可能会在宕机时间内累积超过10k条消息,我只是不知道缓存机制是否像你需要的那样可靠

===================

移动应用程序。。。正确的。不太适合故障转移传输。然后,我将实现一个定期连接的计时器(使用http传输可能是个好主意,但不相关)。当它连接时,如果没有需要刷新的内容,那么x分钟后见。如果有,发送每条消息,等待握手,然后从移动存储中清除消息。那么x分钟后再见


我猜这是安卓?如果没有,请停止阅读这里。实际上,我们在不久前就实现了这一点。我只做了服务器端的工作,但如果我没记错的话,连接计时器/轮询器每n分钟旋转一次(我认为频率是可变的,因为过于激进会耗尽电池)。一旦建立了成功的连接,我相信他们使用了意图广播来推动消息推送者去做他们的事情。我们的想法是,即使只有一个消息推送器,我们也可以添加更多。

您需要详细说明您的设置。您是否正在使用故障转移传输等?我已将Spring应用程序上下文添加到我的原始消息中。由于它省略了连接URI,因此仍然没有用。它看起来不像JMS持久订阅。根据持久订阅消息的定义,订阅者可能远离JMS连接,当他们最终连接时,他们将收到这些消息。在我的例子中,消息生产者可能会失去JMS连接,但会存储所有生成的消息。当它连接时,它需要发送所有未发送的消息。关于ActiveMQ咨询支持,这可能是一个解决方案,但我无法找到连接\u咨询\u主题消息包含的信息。谷歌搜索没有帮助。您知道任何代码示例吗?如果我创建自己的重新连接循环,它将干扰ActiveMQ故障转移传输,不是吗?如果ActiveMQ故障转移传输处理重试循环,如何通知我的应用程序连接已重新建立?ActiveMQ故障转移传输提供的缓存大小太小。我的客户端是一个移动应用程序,可以离开WIFI数小时。我正在将未发送的事件存储在磁盘上。