/[projects]/dao/DaoMqPump2/MQFilter/FilterController.cs
ViewVC logotype

Annotation of /dao/DaoMqPump2/MQFilter/FilterController.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2174 - (hide annotations) (download)
Sat May 17 11:25:26 2014 UTC (10 years ago) by torben
File size: 9311 byte(s)
Handle mq headers as upper-case trimmed string
1 torben 2163 using System;
2 torben 2168 using System.Collections;
3 torben 2163 using System.Collections.Generic;
4 torben 2167 using System.IO;
5     using System.Text.RegularExpressions;
6 torben 2163
7 torben 2168 using IBM.WMQ;
8    
9 torben 2167 using Microsoft.Win32;
10    
11 torben 2168 using DaoCommon;
12    
13    
14 torben 2163 namespace MQFilter
15     {
16     class FilterController
17     {
18    
19 torben 2167 public string mqHost { get; private set; }
20     public string mqChannel { get; private set; }
21     public string mqQueueManager { get; private set; }
22    
23     public string logDirectory { get; private set; }
24    
25     public string[] filterTranscations { get; private set; }
26    
27    
28 torben 2168 public static readonly string queueNameIndbakke = "DAO.INDBAKKE";
29     public static readonly string queueNameDimaps = "DAO.SAMLET";
30     public static readonly string queueNameMysql = "DAO.ALL";
31     public static readonly string queueNameStore = "DAO.STORE";
32    
33    
34 torben 2167 protected FilterController()
35     {
36     initialize();
37     }
38    
39     private void initialize()
40     {
41     Console.WriteLine("FilterController: Loading config");
42     RegistryKey key = Registry.LocalMachine.CreateSubKey("Software\\DAO\\MQFilter");
43    
44    
45     //Læser globale MQ Parametre
46     mqHost = (string)key.GetValue("MQHost");
47     if (mqHost == null || mqHost.Length == 0)
48     throw new System.ArgumentException("MQHost cannot be null or empty");
49    
50     mqChannel = (string)key.GetValue("MQChannel");
51     if (mqChannel == null || mqChannel.Length == 0)
52     throw new System.ArgumentException("MQChannel cannot be null or empty");
53    
54     mqQueueManager = (string)key.GetValue("MQQueueManager");
55     if (mqQueueManager == null || mqQueueManager.Length == 0)
56     throw new System.ArgumentException("MQQueueManager cannot be null or empty");
57    
58 torben 2168 ////////////
59 torben 2167
60     logDirectory = (string)key.GetValue("LogDirectory");
61     if (logDirectory == null || logDirectory.Length == 0)
62     throw new System.ArgumentException("LogDirectory cannot be null or empty");
63    
64 torben 2168 if (Directory.Exists(logDirectory) == false)
65     {
66     Directory.CreateDirectory(logDirectory);
67     }
68    
69     ////////////
70    
71 torben 2167 String tmpFilterTransactions = (string)key.GetValue("FilterTransactions");
72     if (tmpFilterTransactions == null || tmpFilterTransactions.Length == 0)
73 torben 2168 throw new System.ArgumentException("FilterTransactions cannot be null or empty");
74 torben 2174 tmpFilterTransactions = tmpFilterTransactions.Replace(';', ',');
75 torben 2168 filterTranscations = Regex.Split(tmpFilterTransactions, ",");
76 torben 2167
77     for (int i = 0; i < filterTranscations.Length; i++)
78     {
79 torben 2174 filterTranscations[i] = filterTranscations[i].Trim().ToUpper();
80 torben 2167 }
81    
82 torben 2168 ////////////
83 torben 2167
84 torben 2168 }
85 torben 2167
86 torben 2168
87 torben 2167
88    
89 torben 2172
90 torben 2163 public void transportAllMessages()
91     {
92 torben 2168 int messageCount = 0;
93    
94     MQQueueManager mqMgr = null;
95     MQQueue queueIndbakke = null;
96     MQQueue queueMysql = null;
97     MQQueue queueDimaps = null;
98     MQQueue queueStore = null;
99     try
100     {
101     //MQ options
102 torben 2172 Hashtable connProps = MQHelper.getConnectionProperties(mqHost, mqChannel);
103 torben 2168 int openInputOptions = MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING;
104     int openOutputOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
105    
106    
107     //MQ objects i v6 implementerer ikke IDisposable og kan derfor ikke bruges med "using" statement
108     mqMgr = new MQQueueManager(mqQueueManager, connProps);//stage 1 connect to mq
109    
110     queueIndbakke = mqMgr.AccessQueue(queueNameIndbakke, openInputOptions);
111    
112     queueMysql = mqMgr.AccessQueue(queueNameMysql, openOutputOptions);
113     queueDimaps = mqMgr.AccessQueue(queueNameDimaps, openOutputOptions);
114     queueStore = mqMgr.AccessQueue(queueNameStore, openOutputOptions);
115    
116    
117     bool isContinue = true;
118     while (isContinue)
119     {
120    
121     MQMessage mqMsg = new MQMessage();
122     MQGetMessageOptions mqGetMsgOpts = new MQGetMessageOptions();
123    
124    
125     try
126     {
127     queueIndbakke.Get(mqMsg, mqGetMsgOpts);
128     if (mqMsg.Format.CompareTo(MQC.MQFMT_STRING) == 0)
129     {
130 torben 2172 string salt2String = mqMsg.ReadString(mqMsg.MessageLength);
131 torben 2168 //System.Console.WriteLine(msgString);
132    
133    
134 torben 2172 // validér at headeren er gyldig
135     if ( Salt2Helper.validateSalt2Header(salt2String) == false)
136 torben 2168 {
137     string discarded_filename = Logfile.getLogFilename(LogfileType.LogTransactions, logDirectory, "filter");
138     using (StreamWriter discardedlog = new StreamWriter(discarded_filename, true))
139     {
140 torben 2172 discardedlog.WriteLine(Logfile.getNowString() + " " + salt2String);
141 torben 2168 }
142     continue; //gå frem til at tage næste transaktion fra køen
143     }
144    
145 torben 2171 MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the defaults,
146     // same as MQPMO_DEFAULT
147 torben 2168
148 torben 2171 MQMessage msg = new MQMessage();
149     msg.Format = MQC.MQFMT_STRING;
150     msg.CharacterSet = 1252;
151 torben 2172 msg.WriteString(salt2String);
152 torben 2168
153 torben 2172 Salt2Header header = Salt2Helper.parseHeader(salt2String);
154 torben 2171 queueMysql.Put(msg, pmo);
155     if (saveForLater(header))
156     {
157     queueStore.Put(msg, pmo);
158     }
159     else
160     {
161     queueDimaps.Put(msg, pmo);
162     }
163 torben 2168
164    
165    
166     messageCount++;// increment per run message counter
167     if (messageCount >= 10000) // if we have moved 10000 messages in this run - let it go
168     {
169     isContinue = false;
170     }
171    
172    
173    
174    
175     }
176     else
177     {
178     System.Console.WriteLine("Non-text message");
179     }
180     }
181     catch (MQException mqe)
182     {
183     isContinue = false;
184    
185     // report reason, if any
186     if (mqe.Reason == MQC.MQRC_NO_MSG_AVAILABLE)
187     {
188     // special report for normal end
189     System.Console.WriteLine("no more messages");
190     }
191     else
192     {
193     // general report for other reasons
194     System.Console.WriteLine("MQQueue::Get ended with " + mqe.Message); ;
195    
196     }
197    
198     }
199    
200     }
201    
202    
203    
204     }
205     finally
206     {
207 torben 2172 MQHelper.closeQueueSafe(queueIndbakke);
208     MQHelper.closeQueueSafe(queueMysql);
209     MQHelper.closeQueueSafe(queueDimaps);
210     MQHelper.closeQueueSafe(queueStore);
211 torben 2168
212 torben 2172 MQHelper.closeQueueManagerSafe(mqMgr);
213 torben 2168 }
214 torben 2163 }
215    
216 torben 2171 private Boolean saveForLater(Salt2Header header)
217     {
218 torben 2174
219 torben 2171 DateTime now = DateTime.Now;
220     int hour = now.Hour;
221     if (hour >= 14 && hour < 18)
222     {
223    
224 torben 2173 if (contains(header.transaktionForkortelse, this.filterTranscations) ) //Så længe vi skal være .net3.0 kompatible er LINQ problematisk (LINQ kræver 3.5)
225 torben 2171 {
226     return true;
227     }
228     else
229     {
230     return false;
231     }
232     }
233     else //normal operation - send straight trough
234     {
235     return false;
236     }
237    
238     }
239    
240     private bool contains(string needle, string[] haystack) // s
241     {
242     foreach(string hay in haystack)
243     {
244     if (needle.Equals(hay))
245     {
246     return true;
247     }
248     }
249    
250     return false;
251     }
252    
253 torben 2167
254    
255 torben 2168
256 torben 2163 /* Singleton */
257     private static FilterController instance = null;
258     public static FilterController getInstance()
259     {
260     if (instance == null)
261     instance = new FilterController();
262    
263     return instance;
264     }
265    
266     }
267     }

  ViewVC Help
Powered by ViewVC 1.1.20