我需要编写一些监视java中activemq队列的东西。这意味着我需要记录消息在队列中排队的时间以及消息何时出列。我的程序不能发送消息或接收消息,它只需要记录。
我发现要推送消息并接收消息,但这不是我想要做的,只需记录外部进程是否将消息放入或离开队列。
为了更清楚,我画了一幅画
我使用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处理数据库连接并插入记录
实际的问题是,当我在队列上推送一条消息并且程序运行时,消息被记录下来,这是可以的,但它也会立即被轮询,这是不正常的。 如何在没有轮询消息的情况下进行插入?
答案 0 :(得分:3)
您可以使用ActiveMQ Advisory Messages来监控队列活动......
答案 1 :(得分:0)
我最终做的是写一个自己的跑步者类,它使用了一个队列浏览器。
我想用这个课做的是
如果列表大于队列的大小,则会有项目出列。这意味着我需要循环这个并检查哪些项目已出列。 其他我是循环队列的枚举,如果它们不存在则将元素添加到列表中
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;
}
}
这还不完美。我认为其中存在一个小的逻辑问题。