0

我的情况是,我作为电影发行商,需要向我的客户更新新电影,我发布有关具有持久订阅者的主题的信息,并且想要购买电影的客户会表达他们的兴趣。

但是,这就是事情的发展方向,我的发布者实现在收到第一个回复后立即停止侦听。任何帮助将不胜感激。谢谢你。

request(Message message) 发送请求并等待回复。临时主题用于 JMSReplyTo 目的地;返回第一个回复,并丢弃任何后续回复。

https://docs.oracle.com/javaee/6/api/javax/jms/TopicRequestor.html

4

2 回答 2

1

您想继续循环阅读消息。这是一个例子:

    /* read messages */
    while (true)
    {
        /* receive the message */
        msg = msgConsumer.receive();
        if (msg == null)
           break;

        if (ackMode == Session.CLIENT_ACKNOWLEDGE ||
            ackMode == Tibjms.EXPLICIT_CLIENT_ACKNOWLEDGE ||
            ackMode == Tibjms.EXPLICIT_CLIENT_DUPS_OK_ACKNOWLEDGE)
        {
            msg.acknowledge();
        }

        System.err.println("Received message: "+ msg);
    }

您可能还想考虑耐用消费者可能存在的问题。如果您的消费者从未收到他们的消息,那么服务器端的存储将继续增长。出于这个原因,您可能希望发送带有过期时间的消息,和/或限制您正在使用的 JMS 主题的最大消息数量(或大小,以 KB/MB/GB 为单位)。

于 2015-02-02T14:38:08.703 回答
1

首先...我对这个场景有疑问。这是某种测试/练习,还是我们在谈论真实世界的场景?

所有客户都对电影单独的主题订阅者感兴趣吗?那规模如何?我计划为每部电影设置一个主题,并且可能有兴趣的各方声明持久订阅者(每部电影一个)?这似乎是对持久订阅者的滥用......我建议只使用一个订阅者(在系统 B 中)到“电影上映”事件/主题(来自系统 A),并让一些代码(在系统 B 中)读取所有来自数据库的客户发送电子邮件/消息/任何东西。(如果系统 A 和 B 相同,则使用 E​​MS 可能不是一个好主意......取决于。)

如果这不是练习,我必须评论:不要使用 MOM(EMS、ActiveMQ)来做 DBMS(Oracle、PostGreSQL)的工作!

完成免责声明部分后,我建议采用异步订阅方法(这两个剪辑用于 EMS 示例目录。文件tibjmsAsyncMsgConsumer.java)。

从构造函数中提取(主类必须实现ExceptionListener、MessageListener):

        ConnectionFactory factory = new com.tibco.tibjms.TibjmsConnectionFactory(serverUrl);

        /* create the connection */
        connection = factory.createConnection(userName,password);

        /* create the session */
        session = connection.createSession();

        /* set the exception listener */
        connection.setExceptionListener(this);

        /* create the destination */
        if (useTopic)
            destination = session.createTopic(name);
        else
            destination = session.createQueue(name);

        System.err.println("Subscribing to destination: "+name);

        /* create the consumer */
        msgConsumer = session.createConsumer(destination);

        /* set the message listener */
        msgConsumer.setMessageListener(this);

        /* start the connection */
        connection.start();

然后在每次消息到达时调用该方法。

public void onMessage(Message msg)
{
    try
    {
        System.err.println("Received message: " + msg);
    }
    catch (Exception e)
    {
        System.err.println("Unexpected exception in the message callback!");
        e.printStackTrace();
        System.exit(-1);
    }
}
于 2015-02-02T15:17:34.610 回答