您可以查看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
訪問阿里雲API的金鑰組。
如果使用阿里雲帳號訪問,請登入AccessKey管理頁面建立和查看。
如果使用RAM使用者訪問,請登入阿里雲存取控制控制台查看。
Endpoint
擷取方式
Message ServiceMNS JMS庫的擷取方式如下:
在Maven專案的pom.xml檔案中添加依賴
<dependency> <groupId>com.aliyun.mns</groupId> <artifactId>java-messaging-lib</artifactId> <version>0.2.0</version> </dependency>
使用限制
只支援建立隊列和收發訊息作業。
只支援AUTO_ACKNOWLEDGE和MANUAL_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(); }