Java监视activemq但不轮询队列

时间:2015-03-24 10:48:03

标签: java apache-camel activemq

我需要编写一些监视java中activemq队列的东西。这意味着我需要记录消息在队列中排队的时间以及消息何时出列。我的程序不能发送消息或接收消息,它只需要记录。

我发现要推送消息并接收消息,但这不是我想要做的,只需记录外部进程是否将消息放入或离开队列。

为了更清楚,我画了一幅画 enter image description here

我使用apache camel进行集成, 我的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处理数据库连接并插入记录

实际的问题是,当我在队列上推送一条消息并且程序运行时,消息被记录下来,这是可以的,但它也会立即被轮询,这是不正常的。 如何在没有轮询消息的情况下进行插入?

2 个答案:

答案 0 :(得分:3)

您可以使用ActiveMQ Advisory Messages来监控队列活动......

请参阅http://activemq.apache.org/advisory-message.html

答案 1 :(得分:0)

我最终做的是写一个自己的跑步者类,它使用了一个队列浏览器。

我想用这个课做的是

  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;
    }
    

    }

  4. 这还不完美。我认为其中存在一个小的逻辑问题。