全部產品
Search
文件中心

:JMS SDK

更新時間:Jan 24, 2025

您可以查看JMS SDK的擷取方式、使用限制和範例程式碼。

準備工作

在本地目錄中建立.aliyun-mns.properties檔案,並填寫服務地址、AccessKeyId和AccessKeySecret。

說明

Linux系統本地目錄為/home/YOURNAME/,Windows系統本地目錄為C:\Users\YOURNAME

mns.accountendpoint=http://<yourAccountId>.mns.cn-hangzhou.aliyuncs.com
mns.accesskeyid=<yourAccessKeyId>
mns.accesskeysecret=<yourAccessKeySecret>        
  • AccessKeyId、AccessKeySecret

  • Endpoint

    • 訪問Message ServiceMNS的接入地址,登入MNS控制台查看。具體操作,請參見擷取存取點

    • 不同地區的接入地址不同,分為公網和私網網域名稱。

擷取方式

Message ServiceMNS JMS庫的擷取方式如下:

  • 在Maven專案的pom.xml檔案中添加依賴

    <dependency>
        <groupId>com.aliyun.mns</groupId>
        <artifactId>java-messaging-lib</artifactId>
        <version>0.2.0</version>
    </dependency>
  • 下載依賴的JAR檔案

使用限制

  • 只支援建立隊列和收發訊息作業。

  • 只支援AUTO_ACKNOWLEDGEMANUAL_ACKNOWLEDGE兩種ACK模式:

    • AUTO_ACKNOWLEDGE

      • MessageListener執行完成且無異常拋出時會自動ACK。

      • MessageListener拋出異常就不會ACK,在VisibilityTimeout後訊息會重投。

    • MANUAL_ACKNOWLEDGE:您需要在代碼中調用acknowledge() 對訊息進行ACK。

範例程式碼

  • 建立隊列

    String accessKeyId = ServiceSettings.getMNSAccessKeyId();
    String accessKeySecret = ServiceSettings.getMNSAccessKeySecret();
    String endpoint = ServiceSettings.getMNSAccountEndpoint();
    String queueName = "<yourQueueName>";
    
    MNSConnectionFactory factory = MNSConnectionFactory.builder()
        .withAccessKeyId(accessKeyId)
        .withAccessKeySecret(accessKeySecret)
        .withEndpoint(endpoint)
        .build();
    
    MNSQueueConnection connection = factory.createQueueConnection();
    
    MNSClientWrapper mnsClientWrapper = connection.getMNSClientWrapper();
    mnsClientWrapper.createQueue(queueName);
  • 發送普通訊息

    String accessKeyId = ServiceSettings.getMNSAccessKeyId();
    String accessKeySecret = ServiceSettings.getMNSAccessKeySecret();
    String endpoint = ServiceSettings.getMNSAccountEndpoint();
    String queueName = "<yourQueueName>";
    
    MNSConnectionFactory factory = MNSConnectionFactory.builder()
        .withAccessKeyId(accessKeyId)
        .withAccessKeySecret(accessKeySecret)
        .withEndpoint(endpoint)
        .build();
    
    try {
        MNSQueueConnection connection = factory.createQueueConnection();
        QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
    
        Queue queue = session.createQueue(queueName);
        MessageProducer producer = session.createProducer(queue);
    
        TextMessage textMessage = session.createTextMessage("Hello JMS! ");
        textMessage.setDoubleProperty("TestFloat", 0.127);
        producer.send(textMessage);
    
        System.out.println(textMessage.getJMSMessageID());
    } catch (JMSException e) {
        e.printStackTrace();
    }
  • 發送延遲訊息

    String accessKeyId = ServiceSettings.getMNSAccessKeyId();
    String accessKeySecret = ServiceSettings.getMNSAccessKeySecret();
    String endpoint = ServiceSettings.getMNSAccountEndpoint();
    String queueName = "<yourQueueName>";
    
    MNSConnectionFactory factory = MNSConnectionFactory.builder()
        .withAccessKeyId(accessKeyId)
        .withAccessKeySecret(accessKeySecret)
        .withEndpoint(endpoint)
        .build();
    
    try {
        MNSQueueConnection connection = factory.createQueueConnection();
        QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
    
        Queue queue = session.createQueue(queueName);
        MessageProducer producer = session.createProducer(queue);
    
        TextMessage textMessage = session.createTextMessage("Hello JMS! ");
        textMessage.setDoubleProperty("TestFloat", 0.127);
        //設定DelaySeconds。
        MNSMessageHelper.setDelaySeconds(textMessage, 10);
        producer.send(textMessage);
    
        System.out.println(textMessage.getJMSMessageID());
    } catch (JMSException e) {
        e.printStackTrace();
    }
  • AUTO_ACKNOWLEDGE模式消費

    String accessKeyId = ServiceSettings.getMNSAccessKeyId();
    String accessKeySecret = ServiceSettings.getMNSAccessKeySecret();
    String endpoint = ServiceSettings.getMNSAccountEndpoint();
    String queueName = "<yourQueueName>";
    
    MNSConnectionFactory factory = MNSConnectionFactory.builder()
        .withAccessKeyId(accessKeyId)
        .withAccessKeySecret(accessKeySecret)
        .withEndpoint(endpoint)
        .build();
    
    try {
        MNSQueueConnection connection = factory.createQueueConnection();
        QueueSession session = connection.createQueueSession(false, MNSQueueSession.AUTO_ACKNOWLEDGE);
    
        Queue queue = session.createQueue(queueName);
        MessageConsumer consumer = session.createConsumer(queue);
        MessageListener listener = new MessageListener() {
    
            @Override
            public void onMessage(Message message) {
                try {
                    if (message instanceof TextMessage) {
                        MNSTextMessage textMessage = (MNSTextMessage) message;
    
                        System.out.println(new Date() + " Receive in listener: " + textMessage.getText());
                    } else if (message instanceof BytesMessage) {
                        MNSBytesMessage bytesMessage = (MNSBytesMessage) message;
                        char readChar = bytesMessage.readChar();
                        System.out.println("Read Char: " + readChar);
                        int readInt = bytesMessage.readInt();
                        System.out.println("Read Int: " + readInt);
                    } else if (message instanceof ObjectMessage) {
                        MNSObjectMessage objectMessage = (MNSObjectMessage) message;
                        TestSerializable object = (TestSerializable) objectMessage.getObject();
                        System.out.println(object.getName());
                    }
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        };
    
        consumer.setMessageListener(listener);
        connection.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
  • MANUAL_ACKNOWLEDGE模式消費訊息

    String accessKeyId = ServiceSettings.getMNSAccessKeyId();
    String accessKeySecret = ServiceSettings.getMNSAccessKeySecret();
    String endpoint = ServiceSettings.getMNSAccountEndpoint();
    String queueName = "<yourQueueName>";
    
    MNSConnectionFactory factory = MNSConnectionFactory.builder()
        .withAccessKeyId(accessKeyId)
        .withAccessKeySecret(accessKeySecret)
        .withEndpoint(endpoint)
        .build();
    
    try {
        MNSQueueConnection connection = factory.createQueueConnection();
        QueueSession session = connection.createQueueSession(false, MNSQueueSession.MANUAL_ACKNOWLEDGE);
    
        Queue queue = session.createQueue(queueName);
        MessageConsumer consumer = session.createConsumer(queue);
        MessageListener listener = new MessageListener() {
    
            @Override
            public void onMessage(Message message) {
                try {
                    if (message instanceof TextMessage) {
                        MNSTextMessage textMessage = (MNSTextMessage) message;
    
                        System.out.println(new Date() + " Receive in listener: " + textMessage.getText());
                    } else if (message instanceof BytesMessage) {
                        MNSBytesMessage bytesMessage = (MNSBytesMessage) message;
                        char readChar = bytesMessage.readChar();
                        System.out.println("Read Char: " + readChar);
                        int readInt = bytesMessage.readInt();
                        System.out.println("Read Int: " + readInt);
                    } else if (message instanceof ObjectMessage) {
                        MNSObjectMessage objectMessage = (MNSObjectMessage) message;
                        TestSerializable object = (TestSerializable) objectMessage.getObject();
                        System.out.println(object.getName());
                    }
    
                    //消費成功後需手動ACK。
                    message.acknowledge();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        };
    
        consumer.setMessageListener(listener);
        connection.start();
    } catch (Exception e) {
        e.printStackTrace();
    }