热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用AmazonSimpleQueuesService(SQS)实现与AutoCAD远程交互

亚马逊Amazon作为云计算的领跑者推出了很多云服务,我的同事GopinathTaget在AutoCADDevBlog上写了一篇文章介绍了SQS与AutoCAD的结合

亚马逊Amazon作为云计算的领跑者推出了很多云服务,我的同事Gopinath Taget在AutoCAD DevBlog上写了一篇文章介绍了SQS与AutoCAD的结合应用。SQS即可以理解为一个放在云上的消息队列,先进先出(FIFO)。【更正,云端的队列与我们常规的队列稍有不同,不能保证顺序是严格的先进先出(FIFO),你从后面的演示例子就可以看出,出队列的顺序可能和进队列时不一样】保存在队列中的消息有一定时间的存活期。通过SQS,我们可以实现位于不同地方的不同程序在不同的时间内进行通信。 比如我可以从位于北京的一个普通桌面程序发送消息到亚马逊简单队列服务(SQS),发送完成后即可退出。其后位于北美的AutoCAD应用程序可以通过读取存储到SQS上的消息来完成北京发出的指令。

 

要使用Amazon SQS服务,你需要首先注册一亚马逊云服务账号,现在亚马逊提供了为期一年的免费服务。你可以参考峻祁连的另一片文章《免费的云技术平台--亚马逊WEB服务AWS提供免费方式》。亚马逊提供了几种SDK,包括Java, Python, .net. 这里使用.net来掩饰。AWS .NET SDK可以从这里下载。安装好AWS .NET SDK后可以通过添加到AWSSDK.dll的引用来调用AWS提供的服务。

 

下面我们就来模拟这个过程。首先建立一个普通的windows form应用程序作为发送端。添加到AWSSDK.dll的引用,这个dll位于C:\Program Files (x86)\AWS SDK for .NET\bin目录下。

image

 

首先需要创建一个对象来连接到Amazon SQS。连接到SQS需要你的Access Key和Secret Key。这两个key可以从这里找到。可以通过下面的方式把AccessKey和Secret Key以写在代码中。

AmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient(, );

更好的方式是写在配置文件App.Config中,如下:

xml version="1.0" encoding="utf-8" ?>
<configuration><appSettings><add key&#61;"AWSAccessKey" value&#61;"*****"/><add key&#61;"AWSSecretKey" value&#61;"*****"/>appSettings>
configuration>

这样在创建AmazonSQS对象时直接用如下语句即可。程序会从App.Config中查找相关的Key信息。

//Create AzazomSQS client using information of appconfig.xml
AmazonSQS sqsClient &#61; AWSClientFactory.CreateAmazonSQSClient();

 

这个发送端程序要完成的工作就是向远程的AutoCAD发送工作序列&#xff0c;其中有三个任务&#xff1a;

"Say: Hello AutoCAD" : 在AutoCAD命令行中输出这个信息&#xff1b;

"Action: drawline" &#xff1a; 在AutoCAD中画一条线&#xff1b;

"Action: drawcircle" &#xff1a; 在AutoCAD中画一圆。

 

下面是发送端的完整代码&#xff1a;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Amazon;
using Amazon.SQS;
using Amazon.SQS.Model;namespace SQS_Sender
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//Create AzazomSQS client using information of appconfig.xmlAmazonSQS sqsClient &#61; AWSClientFactory.CreateAmazonSQSClient();//AmazonSQS sqs &#61;// AWSClientFactory.CreateAmazonSQSClient(// , // // );try{//Create a queue if it does not exitsCreateQueueRequest sqsRequest &#61; new CreateQueueRequest();sqsRequest.QueueName &#61; "AutoCADJobQueue";CreateQueueResponse sqsResponse &#61; sqsClient.CreateQueue(sqsRequest);string myQueueUrl &#61; string.Empty; ;if (sqsResponse.IsSetCreateQueueResult()){myQueueUrl &#61; sqsResponse.CreateQueueResult.QueueUrl;}//post a message to the queueSendMessage(sqsClient, myQueueUrl, "Say: Hello AutoCAD");SendMessage(sqsClient, myQueueUrl, "Action: drawline");SendMessage(sqsClient, myQueueUrl,"Action: drawcircle");}catch (AmazonSQSException aEx){MessageBox.Show(aEx.Message);}}private static void SendMessage(AmazonSQS sqsClient, string myQueueUrl, string messageBody){SendMessageRequest sendMsgRequest &#61; new SendMessageRequest();sendMsgRequest.QueueUrl &#61; myQueueUrl;sendMsgRequest.MessageBody &#61; messageBody;sqsClient.SendMessage(sendMsgRequest);}}
}

 

下面完成接收端。接收端一个AutoCAD插件&#xff0c;我们可以利用AutoCAD 2010-2012 dotNet Wizards.zip来创建一个插件模版&#xff0c;然后添加到AWSSDK.dll的引用。

image

 

直接贴出完整代码如下&#xff1a;

 

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System.Collections.Generic;using Amazon;
using Amazon.SQS;
using Amazon.SQS.Model;// This line is not mandatory, but improves loading performances
[assembly: CommandClass(typeof(SQS_AutoCADReceiver.MyCommands))]namespace SQS_AutoCADReceiver
{// This class is instantiated by AutoCAD for each document when// a command is called by the user the first time in the context// of a given document. In other words, non static data in this class// is implicitly per-document!public class MyCommands{[CommandMethod("DoJobFromCloud",CommandFlags.Modal)]public void DoJobFromCloud() //this method can be any name{Document doc &#61; Application.DocumentManager.MdiActiveDocument;Database db &#61; doc.Database;Editor ed &#61; doc.Editor;//get the queue clientAmazonSQS sqsClient &#61; AWSClientFactory.CreateAmazonSQSClient("","");try{string myQueueUrl &#61; string.Empty;//checking whether the queue exits or notListQueuesRequest lstQueueRequest &#61; new ListQueuesRequest();ListQueuesResponse lstQueueResponse &#61; sqsClient.ListQueues(lstQueueRequest);if (lstQueueResponse.IsSetListQueuesResult()){ListQueuesResult listQueueResult &#61; lstQueueResponse.ListQueuesResult;foreach (string queueUrl in listQueueResult.QueueUrl){ed.WriteMessage(queueUrl&#43; "\n");if (queueUrl.Contains("AutoCADJobQueue")){myQueueUrl &#61; queueUrl;} }}if (myQueueUrl.Length > 0) //The queue exits{//Get the message number in the queueint numMessage &#61; GetMessageNumber(sqsClient, myQueueUrl);if (numMessage > 0){do{//receive a messageReceiveMessageRequest receiveReq &#61; new ReceiveMessageRequest();receiveReq.QueueUrl &#61; myQueueUrl;ReceiveMessageResponse receiveRes &#61; sqsClient.ReceiveMessage(receiveReq);if (receiveRes.IsSetReceiveMessageResult()){foreach (Message msg in receiveRes.ReceiveMessageResult.Message){if (msg.IsSetBody()){if (msg.Body.StartsWith("Say")){//print the message in AutoCADed.WriteMessage(msg.Body &#43; "\n");}if (msg.Body.StartsWith("Action")){if (msg.Body &#61;&#61; "Action: drawline"){//draw a line in AutoCADDrawLine();ed.WriteMessage(msg.Body &#43; " executed!\n");}if (msg.Body &#61;&#61; "Action: drawcircle"){//draw a circle in AutoCADDrawCircle();ed.WriteMessage(msg.Body &#43; " executed!\n");}}}//delete the message from queue, //since we have aleady worked on itDeleteMessageRequest delMsgRequest &#61; new DeleteMessageRequest();delMsgRequest.QueueUrl &#61; myQueueUrl;delMsgRequest.ReceiptHandle &#61; msg.ReceiptHandle;sqsClient.DeleteMessage(delMsgRequest);}}numMessage &#61; GetMessageNumber(sqsClient, myQueueUrl);} while (numMessage > 0);}}}catch (AmazonSQSException aEx){ed.WriteMessage("\n Error: " &#43; aEx.Message);}}private static int GetMessageNumber(AmazonSQS sqsClient, string myQueueUrl){int numMessage &#61; 0;GetQueueAttributesRequest req &#61; new GetQueueAttributesRequest();req.AttributeName.Add("All");req.QueueUrl &#61; myQueueUrl;GetQueueAttributesResponse res &#61; sqsClient.GetQueueAttributes(req);if (res.IsSetGetQueueAttributesResult()){GetQueueAttributesResult attResult &#61; res.GetQueueAttributesResult;numMessage &#61; attResult.ApproximateNumberOfMessages;}return numMessage;}public void DrawCircle(){Document doc &#61; Application.DocumentManager.MdiActiveDocument;Database db &#61; doc.Database;using (Transaction trans &#61; db.TransactionManager.StartTransaction()){BlockTable bt &#61; trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;BlockTableRecord modelSpace &#61; trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite)

as BlockTableRecord;using (Circle c &#61; new Circle()){c.Center &#61; new Point3d(0, 0, 0);c.Radius &#61; 10;modelSpace.AppendEntity(c);trans.AddNewlyCreatedDBObject(c, true);}trans.Commit();}}public void DrawLine(){Document doc &#61; Application.DocumentManager.MdiActiveDocument;Database db &#61; doc.Database;using (Transaction trans &#61; db.TransactionManager.StartTransaction()){BlockTable bt &#61; trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;BlockTableRecord modelSpace &#61; trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite)

as BlockTableRecord;using (Line ln &#61; new Line()){ln.StartPoint &#61; new Point3d(0,0,0);ln.EndPoint &#61; new Point3d(10, 10, 0);modelSpace.AppendEntity(ln);trans.AddNewlyCreatedDBObject(ln, true);}trans.Commit();}}}}

下面是在AutoCAD中的运行结果&#xff1a;

image

 

你觉得还有哪些情形可以使用Amazon简单队列服务&#xff08;SQS&#xff09;&#xff1f;欢迎评论大家一起讨论。

 

源码下载&#xff1a;http://dl.dropbox.com/u/48146765/SQS_AutoCAD.zip 



推荐阅读
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • BZOJ1233 干草堆单调队列优化DP
    本文介绍了一个关于干草堆摆放的问题,通过使用单调队列来优化DP算法,求解最多可以叠几层干草堆。具体的解题思路和转移方程在文章中进行了详细说明,并给出了相应的代码示例。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
author-avatar
mobiledu2502891177
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有