• C#(.net)实现用apache activemq传递SQLite的数据


    版权声明:本文为搜集借鉴各类文章的原创文章,转载请注明出处:http://www.cnblogs.com/2186009311CFF/p/6382623.html

    C#(.net)实现用apache activemq传递SQLite的数据:

    本测试适用于Windows32位,VS2010的.net 4.0框架。

    一、C#连接SQLite:

    对于C#连接SQLite的内容,请查看我的另一篇随笔:http://www.cnblogs.com/2186009311CFF/p/6270467.html(从“二、后台与SQLite数据库连接:”开始看),不同之处如下:

    1、那篇文章的连接方式是B/S下的连接数据库方式,但在C/S下有所不同,具体如下:

    注意:这两种方法,都需要自己把数据库文件拷贝至相应文件夹,只是放的位置不同:绝对路径在固定的目录,相对路径在安装目录下

    1)用绝对路径:

    static readonly static string strconn= "Data Source=C:/DB/Test.db";
    

    2)用相对路径:

    private readonly static string strconn = "Data Source="+Application.StartupPath+"../Test.db;Version=3;";
    

     如果提示错误“attempt to write a readonly database”,则需数据库文件所在文件夹(即C:/DB或安装目录)的文件夹权限(属性——>安全……)

    2、那篇文章的ashx文件内容与C/S下的类似,只是在C/S下,我用cs文件替代了ashx文件,主要内容如下:

    查询的:

      public static DataTable GetDataTable(string strSQL)//"Select * From ProductionCycleData"
            {
                DataTable dt = new DataTable();
                DataSet ds = new DataSet();
                using (SQLiteConnection conn = new SQLiteConnection(strconn))
                {
                    //创建sqlite命令
                    using (SQLiteCommand comm = conn.CreateCommand())
                    {
                        //打开数据库链接
                        conn.Open();
                        //select数据分页用limit就行,很方便
                        comm.CommandText = strSQL;
                        using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(comm))
                        {
                            adapter.SelectCommand = comm;
                            adapter.Fill(ds);
                        }
                        //   DataTable dt = new DataTable();
                        dt = ds.Tables[0];
                    }
                }
                return dt;
            }
    

     修改(@"UPDATE ProductionCycleData SET PDOCode = '盗贼' WHERE ShotType = 604610"),

    删除(@"DELETE FROM ProductionCycleData"),

    添加(@"INSERT INTO ProductionCycleData VALUES (1,"abc")")

    public static void ExecuteSQLiteCommandSQL(string strSQL)
            {
                using (SQLiteConnection con = new SQLiteConnection(SQLiteHelper.strconn))
                {
                    con.Open();             
                    using (SQLiteCommand cmd = new SQLiteCommand(strSQL, con))
                    {
                        cmd.ExecuteNonQuery();
                    }
                }
            }
    

      

    可参考: http://www.cnblogs.com/teroy/p/3960760.html

    其实我测试时有小插曲,我用相当于bin目录的相对路径:private readonly static string strconn = "Data Source=../../..//DB/Test.db;Version=3;";调试是可以查询和删除成功的,但是安装后就不成功了,应该是安装后找不到路径了,具体我也不清楚。

    二、用Apache ActiveMQ传递信息

    1、首先具备java环境,去Oracle官网下载适合本电脑的JDK或者JRE安装,下载链接: http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html#javasejdk   (不知以后会不会失效,总之去官网找吧,现在是免费的)

    2、去Apache ActiveMQ官网下载文件

    源文件: http://activemq.apache.org/activemq-5143-release.html  

    运行解压后的apache-activemq-5.14.3-binapache-activemq-5.14.3inwin32activemq.bat文件(我的测试电脑是32位,故选择Win32下的bat文件运行),出现如图所示,则表明Apache ActiveMQ可以发送和接收数据了

    .net下所需的dll,我用到的是Sub Projects下的NMS:http://www.apache.org/dyn/closer.lua/activemq/apache-nms/1.7.0/Apache.NMS.ActiveMQ-1.7.2-bin.zip

    引用解压文件里的.net 4.0下的Apache.NMS、Apache.NMS.ActiveMQ、Ionic.Zlib的dll

    3、前期准备:

    监控队列发送信息情况:打开浏览器输入 http://localhost:8161/admin/ ,用账户:admin和密码:admin登录。这是默认的,可在前面“1、”中的解压文件conf文件夹下的jetty.xml和jetty-realm.properties中,进行相应的更改,步骤如下:

    1)jetty.xml中true变false;

    2)jetty-realm.properties中,按用户名:密码,角色的顺序排列,按照所需进行更改保存

    可参考:http://blog.csdn.net/stevenprime/article/details/7091224

    成功登录后,呈现界面:

    点击Queues,如若有信息发送成功,则会显示,如图所示:

    若需查看具体发送的内容,则只需点击对应的Queues Name(如test):

    出现:

    点击对应的Message ID,出现该信息名的详细发送内容(往下翻):

    4、C#控制,发送信息给Apache ActiveMQ

    可参考:http://www.cnblogs.com/woxpp/p/5001373.html(这个真的很好)、http://blog.csdn.net/proglovercn/article/details/51592884(这个也不错)

    1)查看“1、”下的解压文件conf目录下的文件:

    credentials.properties文件,查看activemq.username、activemq.password

    activemq.xml文件,查看串口号

    2)C#代码,发送信息

     private static string strActivemMQusername = "system";
            private static string strActivemMQpassword = "manager";
                  private static string strPort = "61616";
            public static void SendMessage(string strSendQueueName, string strSendIP, string strSendMessage)
            {
                String QueuesNameESF = "queue://" + strSendQueueName;
                Uri _uri = new Uri(String.Concat("activemq:tcp://" + strSendIP + ":" + strPort));
                IConnectionFactory factory = new ConnectionFactory(_uri);
                using (IConnection conn = factory.CreateConnection(strActivemMQusername, strActivemMQpassword))
                {
                    using (ISession session = conn.CreateSession())
                                   {
                        IDestination destination = SessionUtil.GetDestination(session, QueuesNameESF);
                        using (IMessageProducer producer = session.CreateProducer(destination))
                        {
                            conn.Start();
                            //可以写入字符串,也可以是一个xml字符串等
                            ITextMessage request = session.CreateTextMessage(strSendMessage);
                            producer.Send(request);
    
                        }
                    }
                }
            }
    

     运行过后,可在http://localhost:8161/admin/查看信息发送情况。

    参考:http://www.cnblogs.com/diorlv/p/3328712.html  、http://www.cnblogs.com/madyina/p/4121458.html

    3)接收Apache ActiveMQ的消息:

     public static void ReceMessage(string strReceQueueName, string strReceIP, ref DataTable dtReceMessage)
            {
               
                String QueuesNameESF = "queue://" + strReceQueueName;
                Uri _uri = new Uri(String.Concat("activemq:tcp://" + strReceIP + ":" + strPort + "?wireFormat.maxInactivityDuration=0"));
                IConnectionFactory factory = new ConnectionFactory(_uri);
                using (IConnection conn = factory.CreateConnection(strActivemMQusername, strActivemMQpassword))
                {
                    using (ISession session = conn.CreateSession())
                    {
                        conn.Start();
                        IDestination destination = SessionUtil.GetDestination(session, QueuesNameESF);
                        using (IMessageConsumer consumer = session.CreateConsumer(destination))
                        {
                            ITextMessage message = consumer.Receive() as ITextMessage;
                     
                            string strReceMessage = message.Text;
                            dtReceMessage = XMLHelper.HuaGeConvertXmlToDataTable(strReceMessage);
                             
                        }
                    }
                }
            }
    

      此处接收XML文件字符串,并把其转化成DateTable形式接收。

    但以上的接收和发送有不足,发送是同一消息名接收多多信息,但接收只能接收同一消息名的第一条信息,这种是不适用实际情况的,我还在考虑如何删除,静待完善。。。呵呵。

    本人处于初期探索阶段,对于消息是否发送成功的判断,和一对多,多对一的处理,还有程序删除队列消息等问题,有待学习,希望这些能够帮助到你。

    如有不足之处,请谅解,并留言,谢谢!

  • 相关阅读:
    ( ) 与 { } 差在哪?-- Shell十三问<第七问>
    exec 跟 source 差在哪?-- Shell十三问<第六问>
    var=value?export前后差在哪?-- Shell十三问<第五问>
    " "( 双引号) 与 ' '( 单引号) 差在哪?-- Shell十三问<第四问>
    别人 echo 、你也 echo ,是问 echo 知多少?-- Shell十三问<第三问>
    Shell prompt(PS1) 与 Carriage Return(CR) 的关系?-- Shell十三问<第二问>
    Shell十三问更新总结版 -- 什么叫做 Shell?-- Shell十三问<第一问>
    公司项目部运维应急预案-强烈建议收藏!
    抗DDOS应急预案实践-生产环境总结-建议必看
    Ceph日常运维管理和排错 -- <7>
  • 原文地址:https://www.cnblogs.com/2186009311CFF/p/6382623.html
Copyright © 2020-2023  润新知