在tibco ems中实现异步发布订阅主题

时间:2015-02-01 23:50:25

标签: asynchronous jms publish-subscribe tibco-ems jms-topic

我的情景是,我作为电影发行商,需要更新我的客户新电影,我发布这个信息与耐用订户的主题和想要购买电影的客户将表达他们的兴趣。

然而,这是事情向南的地方,我的发布者的实施在收到第一个回复后就停止收听。任何帮助将不胜感激。谢谢。

请求(消息消息)           发送请求并等待回复。 临时主题用于JMSReplyTo目标;返回第一个回复,并丢弃以下任何回复。

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

2 个答案:

答案 0 :(得分: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大小)。

答案 1 :(得分:1)

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

所有客户都对电影SEPARATE主题订阅者感兴趣吗?这是如何规模的?我计划为每部电影制作一个主题,并且可能有兴趣的人宣布持久的订阅者(每部电影一个)?这似乎是对持久订阅者的滥用......我建议只使用一个用户(在系统B中)来播放电影"电影放映"事件/主题(来自系统A),并有一些代码(在系统B中)从数据库中读取所有客户端以发送电子邮件/消息/等等。 (如果系统A和B是相同的,根本不可能使用EMS ......取决于。)

如果不是练习,我必须发表评论:不要使用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);
    }
}