Slette/tømme MSMQ-køer med IronRuby


søndag 7. mars 2010 PSWinCom MSMQ IronRuby

Utviklingsavdelingen i PSWinCom har akkurat begynt å lære seg Ruby, og jeg har derfor kodet noen scripts som jeg har dokumentert ganske grundig - sånn at det går an å lære noe av å lese dem. Dette er et faktisk IronRuby-script jeg bruker for å slette eller tømme alle private MSMQ-køer på lokal maskin (vi jobber mye med køer, og trenger ofte å rydde opp miljøet).

Så i tilfelle dette kan hjelpe andre – her er koden:

  1 =begin
  2   This is a comment :)
  3
  4   Ruby scans scripts from top to bottom. This means it should make
  5   sense when you to read it that way too.
  6
  7   The scull and bones art is contained in something called a
  8   here-document. Google it if you want to know more...
  9  
10   (I had to escape the backslashes, so it looks a bit off in the
11   source, but the output should be nice.)
12 =end
13 puts <<EOF
14                _______________
15               /               \\ 
16              /                 \\ 
17             /                   \\ 
18             |   XXXX     XXXX   |
19             |   XXXX     XXXX   |           PSWinCom MSMQ IronRuby script
20             |   XXX       XXX   |
21             |         X         |           -----------------------------
22             \\__      XXX      __/
23               |\\     XXX     /|                  A L L   Q U E U E S
24               | |           | |
25               | I I I I I I I |             -----------------------------
26               |  I I I I I I  |
27               \\_             _/            Hope you know what you're doing
28                 \\_         _/
29                   \\_______/
30           XXX                    XXX
31          XXXXX                  XXXXX
32          XXXXXXXXX         XXXXXXXXXX
33                 XXXXX   XXXXX
34                    XXXXXXX
35                 XXXXX   XXXXX
36          XXXXXXXXX         XXXXXXXXXX
37          XXXXX                  XXXXX
38           XXX                    XXX
39
40 EOF
41
42 =begin
43   The Actions class contains a method for each of the available
44   command line options. To add another option it should be enough
45   to expand this class with a new method.
46 =end
47 class Actions
48   # You create "static" methods (we actually call it class methods)
49   # by applying 'self.' in front of the method name. Here self refer
50   # to the class, and it could also be written ClassName.method_name.
51   def self.list queue # method named "list", takes one argument "queue"
52     puts queue.path
53   end
54   def self.delete queue
55     puts "Deleting #{queue.path}.."
56     MessageQueue.delete queue.path
57   end
58   def self.purge queue
59     puts "Purging #{queue.path}.."
60     queue.purge
61   end
62   def self.exit
63     puts "Usage: ir all_queues.rb action"
64     puts "       where action in [list|delete|purge]"
65     Kernel.exit(0) # This is a nice way of ending a script
66   end
67 end # class Actions ends here..
68
69 =begin
70   The rest of the script is not contained in a class. You may feel dirty
71   the first couple of times you do this, but it's fine - I promise!
72 =end
73
74 mode = $*.shift # get the first command line option passed to this script
75 Actions.exit unless mode # call exit if no mode (if mode == nil)
76
77 =begin
78   Load the .Net dll.
79   This is the only line of the script that will look strange to a normal
80   Ruby-developer that haven't used IronRuby.
81 =end
82 load_assembly 'System.Messaging'
83
84 =begin
85   By including the System::Messaging namespace in this script, I'm able to
86   use the classes in the namespace directly. If I hadn't done this I would
87   have to use System::Messaging::MessageQueue instead of just MessageQueue.
88
89   Notice that when Ruby was parsing the Actions class, which use the
90   MessageQueue class, the System.Messaging.dll was not jet loaded, and the
91   namespace not yet included. That is fine however - when actual execution
92   enters the Actions class's queue methods (when the methods are called),
93   the namespace will be there.
94 =end
95 include System::Messaging
96
97 =begin
98   Getting queues. MessageQueue.get_private_queues_by_machine in ruby corresponds
99   to MessageQueue.GetPrivateQueuesByMachine in C#.
100 =end
101 all_queues = MessageQueue.get_private_queues_by_machine('.') # '.' == local machine
102
103 # Let user know if there are no queues to perform action on
104 puts "No queues available" if all_queues.length == 0
105
106 =begin
107   The following line is very similar to C#'s List<T>.ForEach(Action<T> action).
108   For each queue I call the appropriate action. I do this by sending the
109   command line option (mode) as a message to the Actions class. The method
110   with the correct name will be called. The second argument will become the
111   argument to the actual method.
112 =end
113 all_queues.each {|queue| Actions.send(mode, queue) }
114
115 puts '.' # Just an end-of-program indicator

For å for eksempel liste alle køene eksekverer man "ir all_queues.rb list" i kommandolinjen (all_queues.rb er navnet på skriptet og ir er IronRuby). Skriptet benyttes på egen rissiko, jeg tar ikke ansvar for tapte data eller andre problemer som måtte oppstå ;)


comments powered by Disqus