簡體   English   中英

ActiveMQ實現異步確認JAVA 8

[英]ActiveMQ implementing async acknowledgement JAVA 8

背景:我有一個標准的Producer消費者隊列,消費者很慢,而生產者很快。 期望是每當生產者完成所請求的消息時,它都會確認該消息,並且生產者將假定與該消息關聯的任務已完成。 由於生產者速度很快,所以我不希望線程生產等待,而是每當消息被確認時,都應調用回調。 由於JMS在這方面受到限制,因此我盡可能直接使用了ActiveMQ類,例如ActiveMQMessageProducer

問題:消息已被自動確認,即使尚未啟動Consumer,也正在調用已注冊的異步回調。 public void send(Destination destination, Message message, AsyncCallback onComplete)

制片人

public static boolean setup() {     
        Producer.connectionFactory = new 
        ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); 
        // Create a Connection
        Producer.connection = 
            (ActiveMQConnection)connectionFactory.createConnection();
        connection.setAlwaysSessionAsync(true);
        connection.start();         
    }   

public Producer() {
        session = (ActiveMQSession)connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
        destination = (ActiveMQDestination)session.createQueue("TEST.FOO");
        producer = (ActiveMQMessageProducer)session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        }
...

public void run() {
        long id  = messageID.getAndIncrement();         
        String text = "Hello world!"
        Message message = session.createTextMessage(text);
        producer.send(message, new MessageCompletion(id, this.messageRundown));
    }

消費者

public static boolean setup() {     
    Consumer.connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");    
    Consumer.connection = (ActiveMQConnection)connectionFactory.createConnection();
    connection.setAlwaysSessionAsync(true);         
    return true;
}

public  Consumer() {
    session = (ActiveMQSession)connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
    destination = (ActiveMQDestination)session.createQueue("TEST.FOO");
    consumer = (ActiveMQMessageConsumer)session.createConsumer(destination);
    consumer.setMessageListener(this);
    connection.start();
}

// implements MessageListener
@Override
public void onMessage(Message message) {    
    messageQueue.add(message);
}
public void run() {
    while(true) {
        Message message = messageQueue.poll();
        while(message != null) {
            // do some work             
            message.acknowledge();
            message = messageQueue.poll();              
        }
        Thread.sleep(10000);            
    }
}

盡管不需要消費者,但我已經添加了它作為參考,但為了確保簡潔起見,已刪除了一些內容,這是工作代碼的一部分。

您對確認工作方式的理解是錯誤的。 發件人上的異步回調僅告訴您代理已收到該消息。 如果是持久發送,則回調將指示該消息也已寫入磁盤。

JMS或大多數其他消息傳遞代理程序中生產者和消費者之間沒有耦合。 生產者在隊列中放置一條消息,然后消費者可以隨時隨地從該隊列中消費。 兩者之間沒有耦合,生產者無法等待消費者繼續生產下一條消息。

如果您想知道何時處理特定消息,從而可以限制工作量,那么您想研究一下JMS請求/響應樣式的消息傳遞模式。

暫無
暫無

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

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