簡體   English   中英

Java監視activemq,但不輪詢隊列

[英]Java monitoring activemq but without polling the queue

我需要編寫一些程序來監視Java中的activemq隊列。 這意味着我需要記錄何時將消息排入隊列以及何時將消息排出隊列。 我的程序不能發送消息或接收消息,它只需要登錄。

我發現要推送消息和接收消息,但這不是我想要做的,只是記錄外部進程是否將消息放入隊列或從隊列中取出。

為了更清楚,我畫了一張圖 在此處輸入圖片說明

我使用apache駱駝進行集成,我的routebuilder看起來像

public void configure() throws Exception {
        Processor queueProcessor = new QueueProcessor();

        from("activemq:queue:KBC").process(queueProcessor);
    }

它稱為以下處理器

@Override
    public void process(Exchange exchange) throws Exception {
        Trax_EventDao dao = new Trax_EventDao();
        dao.insert(new Trax_Event("Queue",exchange.getExchangeId(),"UP","KBC", new Time(new Date().getTime())));
    }

dao處理數據庫連接並插入一條記錄

實際的問題是,當我將消息推送到隊列中並且程序運行時,該消息已記錄下來,這是可以的,但是它也會立即被輪詢,這是不可以的。 如何在不輪詢消息的情況下進行插入?

您可以使用ActiveMQ咨詢消息來監視隊列活動...

參見http://activemq.apache.org/advisory-message.html

我最后要做的是編寫一個自己的運行程序類,該類使用隊列瀏覽器。

我想在這堂課上做的是

  1. 與AvtiveMQ建立連接並啟動它
  2. 進行無限循環,以控制指定的隊列。 我有隊列中項目的列表。 每次循環我都檢查一下
  3. 如果列表大於隊列的大小,則有項目出隊。 這意味着我需要循環循環並檢查哪些項目已出隊。 否則,我循環隊列的枚舉並將元素添加到列表(如果尚不存在)

     package queueFeed; import dao.ProcmonDao; import dao.EventDao; import domain.Event; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQQueue; import javax.jms.*; import java.sql.SQLException; import java.sql.Time; import java.util.*; public class QueueRunner { private ProcmonDao dao; private Connection connection; private String queueName; public QueueRunner() throws SQLException { dao = new EventDao(); } public void setConnection(String username, String password, String url) throws JMSException { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(username, password, url); connection = factory.createConnection(); } public void run() throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); QueueBrowser browser = session.createBrowser(new ActiveMQQueue(queueName)); List<String> ids = new ArrayList<>(); int queueSize = 0; int counter = 0; connection.start(); while (true) { Enumeration enumeration = browser.getEnumeration(); if (queueSize < ids.size()) { while (enumeration.hasMoreElements()) { Message message = (Message) enumeration.nextElement(); ids.remove(message.getJMSMessageID()); counter++; } if (ids.size() > 0 && ids.size() > 0) { Iterator<String> iterator = ids.iterator(); while (iterator.hasNext()) { String messageId = iterator.next(); dao.insert(new Event("Queue", messageId, "UP", browser.getQueue().getQueueName(), new Time(new Date().getTime()))); iterator.remove(); } } queueSize = counter; counter = 0; } else { while (enumeration.hasMoreElements()) { counter++; Message message = (Message) enumeration.nextElement(); String id = message.getJMSMessageID(); if (!ids.contains(id)) { ids.add(id); dao.insert(new Event("Queue", id, "UP", browser.getQueue().getQueueName(), new Time(new Date().getTime()))); } } queueSize = counter; counter = 0; } } } public void setQueueName(String queueName) { this.queueName = queueName; } public String getQueueName() { return this.queueName; } 

    }

這還不夠完美。 我認為其中存在一個小邏輯問題。

暫無
暫無

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

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