Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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
Activemq如何配置使用者侦听器(在Java中)_Java_Activemq_Producer Consumer - Fatal编程技术网

Activemq如何配置使用者侦听器(在Java中)

Activemq如何配置使用者侦听器(在Java中),java,activemq,producer-consumer,Java,Activemq,Producer Consumer,如果任何人都能在Spring中共享一个基于xml的消费者侦听器配置的简单示例,我会很高兴。提前谢谢 编辑 我只是想了解消费者的监听器,而不是消费者实现,因为我已经在我的应用程序中实现了活动mq。它运行良好,但是我不能确定生产者同步发送的消费项目的顺序。 问题在于并发使用者一次异步执行一个方法(将一些对象持久化到db以记录它们)所导致的不一致性和数据操纵 EDIT2: 让我澄清这一复杂性。我有一个由两个基本的独立部分组成的应用程序。第一个是同步执行的Producer,它向db请求新来的产品,然后通

如果任何人都能在Spring中共享一个基于xml的消费者侦听器配置的简单示例,我会很高兴。提前谢谢

编辑

我只是想了解消费者的监听器,而不是消费者实现,因为我已经在我的应用程序中实现了活动mq。它运行良好,但是我不能确定生产者同步发送的消费项目的顺序。 问题在于并发使用者一次异步执行一个方法(将一些对象持久化到db以记录它们)所导致的不一致性和数据操纵

EDIT2: 让我澄清这一复杂性。我有一个由两个基本的独立部分组成的应用程序。第一个是同步执行的Producer,它向db请求新来的产品,然后通过activemq提供的“jmsTemplate.send”方法“逐个”发送它们。这是从Cron/计时器同步执行的操作。换句话说,producer是从计时器/cron执行的。现在的问题是消费者本身。当生产者“一个接一个”地发送产品时,异步消费者(启用并发)接收产品并异步消费它们

问题从这里开始。因为在刚收到产品时从使用者执行的方法会执行一些db持久性操作。当不同的并发消费者接收到相同的产品时(发生这种情况是因为我们的系统,而不是jms问题,请不要注意这一点),然后在同一实体上执行相同的持久化操作会发生一些异常,这很容易预测。我如何防止产品的这种异步操作,或者在这种应用程序中管理消费产品的订单

谢谢

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:jms="http://www.springframework.org/schema/jms"
   xmlns:p="http://www.springframework.org/schema/p"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                       http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">

<!-- A simple and usual connection to activeMQ -->  
<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://localhost:61616"></property>
</bean>                

 <!-- A POJO that implements the JMS message listener -->
<bean id="simpleMessageListener" class="MyJMSMessageListener" />


<!-- Cached Connection Factory to wrap the ActiveMQ connetion -->
<bean id="cachedConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">     
    <property name="targetConnectionFactory" ref="activeMQConnectionFactory"></property>
    <property name="sessionCacheSize" value="10"></property>
    <property name="reconnectOnException" value="true"></property>
</bean>


<!-- The Spring message listener container configuration -->
<jms:listener-container container-type="default" connection-factory="cachedConnectionFactory" acknowledge="auto">
    <jms:listener destination="FOO.TEST" ref="simpleMessageListener" method="onMessage" />
</jms:listener-container>

</beans>
}

启动此侦听器只需获取应用程序上下文,一旦您这样做,它就会自动启动JMS侦听器

根据其他问题进行编辑


因此,您的系统可能会生成(例如)2条或更多消息,这些消息以相同的productID传递给消费者?首先,这不是您的问题,而是应用程序的问题。即使你以某种方式修复了它,它也不是真正的修复,但它是一种隐藏问题本身的方法。然而,如果被迫提供一个解决方案,现在,我只能想到一个,最简单的,禁用并发消费的方法。下面是我要做的:接收队列中的消息,并且该队列上只有一个使用者。在这个消费者中,我将尽可能少地处理消息—只获取productID并将其放在其他队列中。在此之前,您必须始终检查productID是否不在该队列中。如果它只是静默返回,如果不是,则意味着它从未被处理过,因此将此消息放在另一个队列中:例如Queue2,然后在第二个队列Queue2上启用并发使用者。但这仍然有缺陷:首先,productID队列应该偶尔清理一次,否则它将永远增长,但这很难做到。棘手的部分:如果productID队列中有一个productID,但该产品是为了在DB中进行更新而不是插入,该怎么办?那么你不应该拒绝它

感谢您的回复,但是我不想知道它的消费者实现,而是消费者本身的实际侦听器。“仅获取productID并将其放置在其他队列中。在此之前,您必须始终检查productID是否不在该队列中。”仅此而已!你真有耐心!你阅读、思考和分享,你是一个好人,你就是那个人!非常感谢@我很高兴能帮上忙。:)这部分-->但是我不能确定生产者同步发送的消费项目的顺序。问题是由于并发使用者一次异步执行方法(将某些对象持久化到db以记录它们)而导致的不一致性和数据操纵。请再次检查我上面编辑的问题。。谢谢。。
import javax.jms.Message;
import javax.jms.MessageListener;
public class MyJMSMessageListener implements MessageListener{

    @Override
    public void onMessage(Message message) {
    // Do your work here
    }