簡體   English   中英

Activemq如何配置使用者監聽器(用Java)

[英]Activemq how to configure a consumer listener (in Java)

如果有人在Spring中分享基於xml的消費者監聽器配置的簡單示例,我會很高興。 提前致謝。

編輯;

我只是想聽聽消費者的聽眾,而不是消費者的實現,因為我已經在我的應用程序中實現了一個active-mq。 並且它運行良好,但我無法確定生產者同步發送的消費項目的順序。 問題是由於同時執行一個方法的異步執行(將某些對象持久化到db以便記錄它們)而導致的不一致和數據操作。

EDIT2:讓我澄清一下這種復雜性。 我有一個由兩個基本獨立部分組成的應用程序。 第一個是同步執行的生產者,它向db詢問新產品,然后“逐個”通過active-mq提供的“jmsTemplate.send”方法發送它們。 這是從Cron / Timer同步執行的操作。 換句話說,生產者正在從計時器/ cron執行。 現在問題是消費者本身。 當生產者“逐個”發送產品時,異步消費者(啟用並發)接收產品並異步使用它們。

問題從這里開始。 因為在剛剛收到產品時從使用者執行的方法會執行一些數據庫持久性操作。 當相同的產品被單獨的並發消費者接收時(它發生在我們的系統,而不是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>

並且監聽消息的Java類如下:

import javax.jms.Message;
import javax.jms.MessageListener;
public class MyJMSMessageListener implements MessageListener{

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

}

啟動此偵聽器是獲取應用程序上下文的問題,它將在您執行此操作后自動啟動JMS偵聽器。

編輯根據另一個問題

那么你的系統可能會生成(例如)2個甚至更多的消息,這些消息使用相同的productID傳遞給消費者? 首先,這不是你的問題,而是應用程序的問題。 即使你以某種方式修復它,它也不是真正的修復,但它是一種隱藏問題本身的方法。 盡管如此,如果現在被迫提供解決方案,我只能想到一個,最簡單的,禁用並發消費,等等。 這是我要做的:接收隊列中的消息,並在該隊列上只有一個消費者。 在這個Consumer中,我會盡可能少地處理消息 - 只接受productID並將其放在其他隊列中。 在此之前,您必須始終檢查productID是否已在該隊列中。 如果它只是靜默返回,如果不是,則意味着它從未被處理過,因此將此消息放在另一個Queue:Queue2中,然后在第二個Queue Queue2上啟用並發使用者。 這仍然有缺陷:首先,productID隊列應該以某種方式偶爾清理一次,否則它將永遠增長,但那就是那么難。 棘手的部分:如果你在productID隊列中有一個productID,但是產品是在DB中進行UPDATE而不是INSERT會怎么樣? 你不應該拒絕它...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM