如何控制或管理JMS队列?例如。更改队列中的消息顺序,删除消息等

时间:2011-06-07 07:27:17

标签: java-ee jboss jms hornetq

我在Linux操作系统中使用HornetQ和JBoss6, 任何人都可以告诉我如何控制JMS队列删除消息或更改顺序 消息,与Queue连接的MessageConsumers的详细信息?

哪种方法最适合此类要求? 任何建议都表示赞赏。

感谢。

1 个答案:

答案 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