簡體   English   中英

JMS使用多個主題

[英]JMS consume multiple topics

我是Java新手,正在從事一個使用多個(不同)主題並將其發送到另一台服務器的項目。 我想知道處理多個主題的最佳方法是什么。

據我了解,每個消費者都與一個主題相關,因此,如果我不得不使用多個主題,那么每個不同的主題都需要一個消費者。 由於使用者進行了阻塞調用,因此我需要為每個使用者調用一個線程以並行使用這些主題。

而且,如果我想進一步提高吞吐量,那么是否是每個消費者(附加到一個主題)擁有一個老板線程並允許每個老板線程設置工作線程以相應地提高性能的一種好習慣?

如果這是一種好的做法,請提出建議,如果不是,還有其他替代選擇嗎? 並有任何眾所周知的設計模式來解決這個問題

為什么選擇消費者模型而不是聽眾模型?

我還有一個約束,那就是在使用者收到一條消息后,它需要將該消息發送到另一台接收服務器。 如果接收服務器關閉(在新版本推送期間),那么我必須暫停使用消息,直到接收服務器啟動為止。 在這種情況下,使用消息偵聽器將無濟於事,因為當接收服務器關閉時,我將無法暫停偵聽器。 我說的對嗎?或者有一種方法可以暫停偵聽器並停止使用消息,直到接收服務器啟動為止?

我要解決的方法是使用偵聽器功能。

您的對象實現MessageListener接口,然后將您的消息偵聽器添加到使用者。 在這種情況下,客戶端庫將為您處理線程,以從隊列中讀取消息並將其發送給偵聽器。

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;

public class MyMessageConsumer implements MessageListener {

    public static void main() {
        try {

            MyMessageConsumer myMessageConsumer = new MyMessageConsumer();

            // This example is using the ActiveMQ client library
            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("nio://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            Destination destination1 = session.createQueue("MyTopic1");
            MessageConsumer consumer1 = session.createConsumer(destination1);
            consumer1.setMessageListener(myMessageConsumer);

            Destination destination2 = session.createQueue("MyTopic2");
            MessageConsumer consumer2 = session.createConsumer(destination2);
            consumer2.setMessageListener(myMessageConsumer);

        } catch (Exception e) {
            System.out.println("Caught: " + e);
            e.printStackTrace();
        }
    }

    @Override
    public void onMessage(Message message) {
        // Handle my messages here
    }
}

會話交易

在此選項中,我們使用事務處理的消息,如果調用session.rollback(),它將傳遞消息。 您可以在操作成功時確認(),在操作失敗時可以回滾()。

包io.bessel.test;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class MyMessageConsumer implements MessageListener {

    public static void main(String ... arguments) {
        try {
            // This example is using the ActiveMQ client library
            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("nio://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            connection.start();

            Session session = connection.createSession(true, Session.SESSION_TRANSACTED);

            MyMessageConsumer myMessageConsumer = new MyMessageConsumer(session);

            Destination destination1 = session.createQueue("MyTopic1");
            MessageConsumer consumer1 = session.createConsumer(destination1);
            consumer1.setMessageListener(myMessageConsumer);

            Destination destination2 = session.createQueue("MyTopic2");
            MessageConsumer consumer2 = session.createConsumer(destination2);
            consumer2.setMessageListener(myMessageConsumer);

        } catch (Exception e) {
            System.out.println("Caught: " + e);
            e.printStackTrace();
        }
    }

    private final Session session;

    public MyMessageConsumer(Session session) {
        this.session = session;
    }

    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                String text = ((TextMessage) message).getText();
                System.out.println(String.format("Received message: %s", text));
                this.session.rollback();

            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM