Java ile Service Bus kuyruklarını kullanmaHow to use Service Bus queues with Java

Bu öğreticide, bir Service Bus kuyruğundaki iletileri alıp ileti göndermek için Java uygulamalarının nasıl oluşturulacağını öğrenin.In this tutorial, you learn how to create Java applications to send messages to and receive messages from a Service Bus queue.

Not

Java örnekleri Github'da bulabilirsiniz azure-service-bus deposunu.You can find Java samples on GitHub in the azure-service-bus repository.

ÖnkoşullarPrerequisites

  1. Azure aboneliği.An Azure subscription. Bu öğreticiyi tamamlamak için bir Azure hesabınızın olması gerekir.To complete this tutorial, you need an Azure account. Etkinleştirebilir, MSDN abone Avantajlarınızı veya kaydolun bir ücretsiz bir hesap.You can activate your MSDN subscriber benefits or sign up for a free account.
  2. Çalışmak için bir kuyruk yoksa, izleyeceğiniz adımlar Service Bus kuyruğuna oluşturmak için Azure portalını kullanın makalenin bir kuyruk oluşturun.If you don't have a queue to work with, follow steps in the Use Azure portal to create a Service Bus queue article to create a queue.
    1. Hızlı Okuma genel bakış Service Bus kuyrukları.Read the quick overview of Service Bus queues.
    2. Hizmet veri yolu oluşturma ad alanı.Create a Service Bus namespace.
    3. Alma bağlantı dizesi.Get the connection string.
    4. Hizmet veri yolu oluşturma kuyruk.Create a Service Bus queue.
  3. Yükleme Java için Azure SDK.Install Azure SDK for Java.

Service Bus hizmetini kullanmak için uygulamanızı yapılandırmaConfigure your application to use Service Bus

Yüklediğinizden emin olun [Java için Azure SDK'sı] Azure SDK for Java Bu örnek derlemeden önce.Make sure you have installed the Azure SDK for Java before building this sample. Eclipse kullanıyorsanız yükleyebileceğiniz [Eclipse için Azure Araç Seti] Azure Toolkit for Eclipse , Java için Azure SDK'sı içerir.If you are using Eclipse, you can install the Azure Toolkit for Eclipse that includes the Azure SDK for Java. Daha sonra ekleyebilirsiniz Microsoft Java için Azure kitaplıkları projenize:You can then add the Microsoft Azure Libraries for Java to your project:

Aşağıdaki import Java dosyasının en üstüne ifadeleri:Add the following import statements to the top of the Java file:

// Include the following imports to use Service Bus APIs
import com.google.gson.reflect.TypeToken;
import com.microsoft.azure.servicebus.*;
import com.microsoft.azure.servicebus.primitives.ConnectionStringBuilder;
import com.google.gson.Gson;

import static java.nio.charset.StandardCharsets.*;

import java.time.Duration;
import java.util.*;
import java.util.concurrent.*;

import org.apache.commons.cli.*;

Kuyruğa ileti göndermeSend messages to a queue

Bir Service Bus kuyruğuna ileti göndermek için uygulamanızı örnekleyen bir QueueClient nesne ve iletileri zaman uyumsuz olarak gönderir.To send messages to a Service Bus Queue, your application instantiates a QueueClient object and sends messages asynchronously. Aşağıdaki kod Portalı aracılığıyla oluşturulan bir kuyruğa bir ileti göndermek nasıl gösterir.The following code shows how to send a message for a Queue that was created through the portal.

public void run() throws Exception {
    // Create a QueueClient instance and then asynchronously send messages.
    // Close the sender once the send operation is complete.
    QueueClient sendClient = new QueueClient(new ConnectionStringBuilder(ConnectionString, QueueName), ReceiveMode.PEEKLOCK);
    this.sendMessageAsync(sendClient).thenRunAsync(() -> sendClient.closeAsync());

    sendClient.close();
}

    CompletableFuture<Void> sendMessagesAsync(QueueClient sendClient) {
        List<HashMap<String, String>> data =
                GSON.fromJson(
                        "[" +
                                "{'name' = 'Einstein', 'firstName' = 'Albert'}," +
                                "{'name' = 'Heisenberg', 'firstName' = 'Werner'}," +
                                "{'name' = 'Curie', 'firstName' = 'Marie'}," +
                                "{'name' = 'Hawking', 'firstName' = 'Steven'}," +
                                "{'name' = 'Newton', 'firstName' = 'Isaac'}," +
                                "{'name' = 'Bohr', 'firstName' = 'Niels'}," +
                                "{'name' = 'Faraday', 'firstName' = 'Michael'}," +
                                "{'name' = 'Galilei', 'firstName' = 'Galileo'}," +
                                "{'name' = 'Kepler', 'firstName' = 'Johannes'}," +
                                "{'name' = 'Kopernikus', 'firstName' = 'Nikolaus'}" +
                                "]",
                        new TypeToken<List<HashMap<String, String>>>() {}.getType());

        List<CompletableFuture> tasks = new ArrayList<>();
        for (int i = 0; i < data.size(); i++) {
            final String messageId = Integer.toString(i);
            Message message = new Message(GSON.toJson(data.get(i), Map.class).getBytes(UTF_8));
            message.setContentType("application/json");
            message.setLabel("Scientist");
            message.setMessageId(messageId);
            message.setTimeToLive(Duration.ofMinutes(2));
            System.out.printf("\nMessage sending: Id = %s", message.getMessageId());
            tasks.add(
                    sendClient.sendAsync(message).thenRunAsync(() -> {
                        System.out.printf("\n\tMessage acknowledged: Id = %s", message.getMessageId());
                    }));
        }
        return CompletableFuture.allOf(tasks.toArray(new CompletableFuture<?>[tasks.size()]));
    }

İletileri gönderilen ve alınan Service Bus kuyrukları örnekleri olan ileti sınıfı.Messages sent to, and received from Service Bus queues are instances of the Message class. İleti nesneler, bir uygulamaya özgü özel özellikleri tutmak için kullanılan bir sözlük ve rastgele uygulama verileri gövdesi içerir (örneğin, etiket ve TimeToLive) standart özellikler kümesi sahip.Message objects have a set of standard properties (such as Label and TimeToLive), a dictionary that is used to hold custom application-specific properties, and a body of arbitrary application data. Uygulamanın herhangi bir seri hale getirilebilir nesne ileti oluşturucusuna geçirerek ileti gövdesini ayarlayabilirsiniz ve uygun seri hale getirici daha sonra nesneyi serileştirmek için kullanılacaktır.An application can set the body of the message by passing any serializable object into the constructor of the Message, and the appropriate serializer will then be used to serialize the object. Alternatif olarak, sağlayan bir java. GÇ. InputStream nesne.Alternatively, you can provide a java.IO.InputStream object.

Service Bus kuyrukları, Standart katmanda maksimum 256 KB ve Premium katmanda maksimum 1 MB ileti boyutunu destekler.Service Bus queues support a maximum message size of 256 KB in the Standard tier and 1 MB in the Premium tier. Standart ve özel uygulama özelliklerini içeren üst bilginin maksimum dosya boyutu 64 KB olabilir.The header, which includes the standard and custom application properties, can have a maximum size of 64 KB. Kuyrukta tutulan ileti sayısına ilişkin bir sınır yoktur ancak kuyruk tarafından tutulan iletilerin toplam boyutu için uç sınır vardır.There is no limit on the number of messages held in a queue but there is a cap on the total size of the messages held by a queue. Bu kuyruk boyutu, üst sınır 5 GB olacak şekilde oluşturulma zamanında belirlenir.This queue size is defined at creation time, with an upper limit of 5 GB.

Bir kuyruktan ileti almaReceive messages from a queue

Bir kuyruktan ileti almak için birincil yolu bir ServiceBusContract nesne.The primary way to receive messages from a queue is to use a ServiceBusContract object. Alınan iletiler, iki farklı modda çalışabilir: ReceiveAndDelete ve PeekLock.Received messages can work in two different modes: ReceiveAndDelete and PeekLock.

Kullanırken ReceiveAndDelete modunda almak bir tek işlem - diğer bir deyişle, Service Bus kuyruk iletiye yönelik Okuma isteği aldığında, iletiyi kullanılıyor olarak işaretler ve uygulamaya döndürür.When using the ReceiveAndDelete mode, receive is a single-shot operation - that is, when Service Bus receives a read request for a message in a queue, it marks the message as being consumed and returns it to the application. ReceiveAndDelete (varsayılan mod budur) mod en basit modeldir ve içinde bir uygulama tolere edebilen bir arıza olması durumunda bir iletiyi işlememeye izin senaryolarda en iyi şekilde çalışır.ReceiveAndDelete mode (which is the default mode) is the simplest model and works best for scenarios in which an application can tolerate not processing a message in the event of a failure. Bu durumu daha iyi anlamak için müşterinin bir alma isteği bildirdiğini ve bu isteğin işlenmeden çöktüğünü varsayın.To understand this, consider a scenario in which the consumer issues the receive request and then crashes before processing it. Service Bus iletiyi kullanılıyor olarak işaretlediğinden, uygulama yeniden başlatılıp iletileri tekrar kullanmaya başladığında ardından onu çökmenin öncesinde kullanılan iletiyi eksik.Because Service Bus has marked the message as being consumed, then when the application restarts and begins consuming messages again, it has missed the message that was consumed prior to the crash.

İçinde PeekLock modu, alma, atlanan iletilere veremeyen uygulamaları desteklemenin mümkün hale getiren bir iki aşamalıdır.In PeekLock mode, receive becomes a two stage operation, which makes it possible to support applications that cannot tolerate missing messages. Service Bus bir istek aldığında bir sonraki kullanılacak iletiyi bulur, diğer tüketicilerin bu iletiyi almasını engellemek için kilitler ve ardından uygulamaya döndürür.When Service Bus receives a request, it finds the next message to be consumed, locks it to prevent other consumers receiving it, and then returns it to the application. Uygulama iletiyi işlemeyi tamamladıktan sonra (veya güvenilir bir şekilde işlemek üzere depolar sonra) çağırarak alma işleminin ikinci aşamasını tamamlar Sil alınan iletide.After the application finishes processing the message (or stores it reliably for future processing), it completes the second stage of the receive process by calling Delete on the received message. Service Bus gördüğünde Sil çağrı, iletiyi kullanılıyor olarak işaretler ve kuyruktan kaldırın.When Service Bus sees the Delete call, it marks the message as being consumed and remove it from the queue.

Aşağıdaki örnek nasıl ileti alındı ve işlenen kullanarak gösterir PeekLock modu (varsayılan mod değil).The following example demonstrates how messages can be received and processed using PeekLock mode (not the default mode). Aşağıdaki örnek bir sonsuz döngü yapar ve içine geldikçe iletileri işleyen bizim TestQueue:The example below does an infinite loop and processes messages as they arrive into our TestQueue:

    public void run() throws Exception {
        // Create a QueueClient instance for receiving using the connection string builder
        // We set the receive mode to "PeekLock", meaning the message is delivered
        // under a lock and must be acknowledged ("completed") to be removed from the queue
        QueueClient receiveClient = new QueueClient(new ConnectionStringBuilder(ConnectionString, QueueName), ReceiveMode.PEEKLOCK);
        this.registerReceiver(receiveClient);

        // shut down receiver to close the receive loop
        receiveClient.close();
    }
    void registerReceiver(QueueClient queueClient) throws Exception {
        // register the RegisterMessageHandler callback
        queueClient.registerMessageHandler(new IMessageHandler() {
        // callback invoked when the message handler loop has obtained a message
            public CompletableFuture<Void> onMessageAsync(IMessage message) {
            // receives message is passed to callback
                if (message.getLabel() != null &&
                    message.getContentType() != null &&
                    message.getLabel().contentEquals("Scientist") &&
                    message.getContentType().contentEquals("application/json")) {

                        byte[] body = message.getBody();
                        Map scientist = GSON.fromJson(new String(body, UTF_8), Map.class);

                        System.out.printf(
                            "\n\t\t\t\tMessage received: \n\t\t\t\t\t\tMessageId = %s, \n\t\t\t\t\t\tSequenceNumber = %s, \n\t\t\t\t\t\tEnqueuedTimeUtc = %s," +
                            "\n\t\t\t\t\t\tExpiresAtUtc = %s, \n\t\t\t\t\t\tContentType = \"%s\",  \n\t\t\t\t\t\tContent: [ firstName = %s, name = %s ]\n",
                            message.getMessageId(),
                            message.getSequenceNumber(),
                            message.getEnqueuedTimeUtc(),
                            message.getExpiresAtUtc(),
                            message.getContentType(),
                            scientist != null ? scientist.get("firstName") : "",
                            scientist != null ? scientist.get("name") : "");
                    }
                    return CompletableFuture.completedFuture(null);
                }

                // callback invoked when the message handler has an exception to report
                public void notifyException(Throwable throwable, ExceptionPhase exceptionPhase) {
                    System.out.printf(exceptionPhase + "-" + throwable.getMessage());
                }
        },
        // 1 concurrent call, messages are auto-completed, auto-renew duration
        new MessageHandlerOptions(1, true, Duration.ofMinutes(1)));
    }

Uygulama çökmelerini ve okunmayan iletileri gidermeHow to handle application crashes and unreadable messages

Service Bus, uygulamanızda gerçekleşen hataları veya ileti işlenirken oluşan zorlukları rahat bir şekilde ortadan kaldırmanıza yardımcı olmak için işlevsellik sağlar.Service Bus provides functionality to help you gracefully recover from errors in your application or difficulties processing a message. Alıcı uygulamanın iletiyi işlemek için herhangi bir nedenle silemiyor sonra çağırabilirsiniz unlockMessage yöntemi alınan iletide (yerine deleteMessage yöntemi).If a receiver application is unable to process the message for some reason, then it can call the unlockMessage method on the received message (instead of the deleteMessage method). Bu işlem Service Bus hizmetinin kuyruktaki iletinin kilidini açmasına ve iletiyi aynı veya başka bir kullanıcı uygulama tarafından tekrar alınabilir hale getirmesine neden olur.This causes Service Bus to unlock the message within the queue and make it available to be received again, either by the same consuming application or by another consuming application.

Ayrıca kuyrukta kilitlenen iletiye ilişkin bir zaman aşımı yoktur ve uygulama önce iletiyi işleyemezse (örneğin, uygulama çökerse) Service Bus otomatik olarak iletinin kilidini açar ve alınabilmesini kilit zaman aşımı dolmadan tekrar kullanılabilir.There is also a timeout associated with a message locked within the queue, and if the application fails to process the message before the lock timeout expires (for example, if the application crashes), then Service Bus unlocks the message automatically and makes it available to be received again.

Uygulama iletiyi ancak önce çökmesi durumunda, deleteMessage isteği bildirilmeden, sonra yeniden başlatıldığında ileti uygulamaya yeniden teslim.In the event that the application crashes after processing the message but before the deleteMessage request is issued, then the message is redelivered to the application when it restarts. Bu durum En Az Bir Kez İşleme olarak adlandırılır. Her ileti en az bir kez işlenir ancak belirli durumlarda aynı ileti yeniden teslim edilebilir.This is often called At Least Once Processing; that is, each message is processed at least once but in certain situations the same message may be redelivered. Senaryo yinelenen işlemeyi kabul etmiyorsa yinelenen ileti teslimine izin vermek için uygulama geliştiricilerin uygulamaya ilave bir mantık eklemesi gerekir.If the scenario cannot tolerate duplicate processing, then application developers should add additional logic to their application to handle duplicate message delivery. Bu genellikle kullanılmasıdır getMessageId yöntemi iletinin teslim denemeleri arasında sabit kalır.This is often achieved using the getMessageId method of the message, which remains constant across delivery attempts.

Not

Service Bus kaynakları ile yönetebileceğiniz hizmet veri yolu Gezgini.You can manage Service Bus resources with Service Bus Explorer. Hizmet veri yolu Gezgini, bir Service Bus ad alanınıza bağlanın ve mesajlaşma varlıkları kolay bir şekilde yönetmek kullanıcıların sağlar.The Service Bus Explorer allows users to connect to a Service Bus namespace and administer messaging entities in an easy manner. Araç, içeri/dışarı aktarma işlevleri veya konu, kuyruklar, abonelikler, geçiş hizmetleri, bildirim hub'ları ve olay hub'ları test etme olanağı gibi gelişmiş özellikler sağlar.The tool provides advanced features like import/export functionality or the ability to test topic, queues, subscriptions, relay services, notification hubs and events hubs.

Sonraki AdımlarNext Steps

Service Bus kuyruklarına ilişkin temel bilgileri öğrendiğinize göre artık bkz [kuyruklar, konular ve abonelikler] Queues, topics, and subscriptions daha fazla bilgi için.Now that you've learned the basics of Service Bus queues, see Queues, topics, and subscriptions for more information.

Daha fazla bilgi için bkz. Java Geliştirici Merkezi.For more information, see the Java Developer Center.