我在Linux操作系统中使用HornetQ和JBoss6, 任何人都可以告诉我如何控制JMS队列删除消息或更改顺序 消息,与Queue连接的MessageConsumers的详细信息?
哪种方法最适合此类要求? 任何建议都表示赞赏。
感谢。
答案 0 :(得分:1)
队列是一个简单的概念 - 多个源写入队列,单个消费者按照接收顺序逐个读取消息。试图引入随机访问会混淆概念,并与队列中的意图相悖。
如果您无法修改使用者以删除或排序消息,则引入中间队列和消息驱动Bean(MDB)来完成工作:MDB将使用队列Q
上的消息,丢弃在将消息发布到队列Q'
之前,某些消息并重新排序其他消息。
在:
Q -> orignal consumer
后:
Q -> your filtering and sorting MDB -> Q' -> original consumer
这保留了设计中组件的意图,在我看来更容易解释和理解。
编辑:您的MDB看起来类似于下面显示的示例(基于Java Enterprise Edition 6 tutorial)。本教程还包含有关打包和部署MDB的信息。
// MDB to consume messages on the original queue
@MessageDriven(mappedName="jms/IncomingQueue", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode",
propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue")
})
public class MyMDB implements MessageListener {
@EJB
private MessageFilter messageFilter;
public void onMessage(Message message) {
// pass on to MessageFilter bean for processing
messageFilter.filter(message);
}
}
// singleton bean to filter and sort messages, then re-publish to the original consumer
// if singleton doesn't work in your environment then you might have to persist the
// messages using e.g. JPA
@Singleton
public class MessageFilter {
@Resource(name="jms/OutgoingQueue")
Queue outgoingQueue;
@Resource(name="jms/QueueConnectionFactory")
QueueConnectionFactory qcf;
// accept incoming message from the MDB
void filter(Message message) {
// filter and sort messages
...
// send to queue read by the original consumer
send(message);
}
// send message to the filtered & sorted queue for the original consumer
void send(Message message) {
QueueConnection queueConnection = qcf.createQueueConnection();
QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender queueSender = queueSession(outgoingQueue);
queueSender.send(message);
}
}
Java EE 6教程也有关于how to create singleton beans的示例,这里是tutorial for connecting to a queue in order to send a message。