直接上代码
import java.util.List;
import java.util.Map.Entry;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClientBuilder;
import com.amazonaws.services.sns.model.CreateTopicRequest;
import com.amazonaws.services.sns.model.CreateTopicResult;
import com.amazonaws.services.sns.model.PublishRequest;
import com.amazonaws.services.sns.model.PublishResult;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.DeleteMessageRequest;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
/**
* @ClassName: SNSUtil
* @Description: Amazon SNS 发布、订阅消息收发工具类
* @author zengyushuang
* @date 2017年7月27日 下午4:13:40
*
*/
public class SNSUtil{
/**
* @Title: createTopic
* @Description: 创建话题
* @autor zengyushuang
* @return CreateTopicResult
*/
public CreateTopicResult createTopic(){
AmazonSNS sns = AmazonSNSClientBuilder.defaultClient();
CreateTopicRequest createTopicRequest = new CreateTopicRequest("myNewTopic");
CreateTopicResult createTopicResult = sns.createTopic(createTopicRequest);
return createTopicResult;
}
/**
* @Title: sendMessage
* @Description: 向话题发送消息
* @autor zengyushuang
* @param msg json/jsonArray/普通字符串皆可
* @param topicArn 发送消息的topic地址
* @return String AWS返回的messageId
*/
public String sendMessage(String msg, String topicArn){
AmazonSNS sns = AmazonSNSClientBuilder.defaultClient();
PublishRequest publishRequest = new PublishRequest(topicArn, msg);
PublishResult publishResult = sns.publish(publishRequest);
return publishResult.getMessageId();
}
/**
* @Title: getMessage
* @Description: 获取订阅的消息
* @autor zengyushuang
* @param queueUrl 获取消息的队列地址
* @param maxNumberOfMessages 获取的最大消息数量,values:1-10
* @return List<Message> 队列中的消息
* Message所含属性:MessageId, ReceiveHandle(删除消息时所需), MD5OfBody, Body(消费者所需数据)
*/
public List<Message> getMessage(String queueUrl, Integer maxNumberOfMessages){
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
receiveMessageRequest.setMaxNumberOfMessages(maxNumberOfMessages);
List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
return messages;
}
/**
* @Title: deleteMessage
* @Description: 删除消息
* @autor zengyushuang
* @param queueUrl
* @param receiptHandle
* @return
* @return boolean
*/
public boolean deleteMessage(String queueUrl, String receiptHandle){
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
sqs.deleteMessage(new DeleteMessageRequest(queueUrl, receiptHandle));
return true;
}
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "zys");
jsonObject.put("area", "CQS");
JSONArray jsonArray = new JSONArray();
jsonArray.add(jsonObject);
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("name", "ll");
jsonObject1.put("area", "SCC");
jsonArray.add(jsonObject1);
String msg = jsonArray.toJSONString();
String topicArn = "";
SNSUtil snsUtil = new SNSUtil();
String queueUrl = "";
List<Message> messages = snsUtil.getMessage(queueUrl,10);
for(Message message : messages){
System.out.println(" Message");
System.out.println(" MessageId: " + message.getMessageId());
System.out.println(" ReceiveHandle:" + message.getReceiptHandle());
System.out.println(" MD5OfBody: " + message.getMD5OfBody());
System.out.println(" Body: " + message.getBody());
for(Entry<String,String> entry : message.getAttributes().entrySet()){
System.out.println(" Attribute");
System.out.println(" Name: " + entry.getKey());
System.out.println(" Value: " + entry.getValue());
}
snsUtil.deleteMessage(queueUrl, message.getReceiptHandle());
}
snsUtil.sendMessage(msg, topicArn);
}
}
在初始化AmazonSQS和AmazonSNS时,直接用默认方式,即defaultClient()获取即可,这种方式会去查询profile、环境变量、classPath配置文件等,总之,几种配置方式都会查,直到找到你的授权认证用户名和密码
如果队列中的消息数量较少(少于1,000个),则您最有可能获得的消息少于每次ReceiveMessage
呼叫请求的消息数 。如果队列中的消息数量非常小,您可能不会在特定ReceiveMessage
响应中收到任何消息。如果发生这种情况,请重复该请求。