I have been bitten by a poorly architected solution. It is not thread safe!
I have several shared classes and members in the solution, and during development all was cool…
BizTalk has sunk my battle ship.
We are using a custom BizTalk Adapter to call my assemblies. The Adapter is calling my code and running things in parallel, so I assume it is using multiple threads all under the same AppDomain.
What I would like to do is make my code run under its own AppDomain so the shared problems I have will not muck with each other.
I have a very simple class that the BizTalk adapter is instantiating then running a Process() method.
I would like to create a new AppDomain inside my Process() method, so each time BizTalk spins another thread, it will have its own version of the static classes and methods.
BizTalkAdapter Code:
// this is inside the BizTalkAdapter and it is calling the Loader class // private void SendMessage(IBaseMessage message, TransactionalTransmitProperties properties) { Stream strm = message.BodyPart.GetOriginalDataStream(); string connectionString = properties.ConnectionString; string msgFileName = message.Context.Read('ReceivedFileName', 'http://schemas.microsoft.com/BizTalk/2003/file-properties') as string; Loader loader = new Loader(strm, msgFileName, connectionString); loader.Process(); EventLog.WriteEntry('Loader', 'Successfully processed: ' + msgFileName); }
This is the class BizTalk Calls:
public class Loader { private string connectionString; private string fileName; private Stream stream; private DataFile dataFile; public Loader(Stream stream, string fileName, string connectionString) { this.connectionString = connectionString; this.fileName = fileName; this.stream = stream; } public void Process() { //***** Create AppDomain HERE ***** // run following code entirely under that domain dataFile = new DataFile(aredStream, fileName, connectionString); dataFile.ParseFile(); dataFile.Save(); // get rid of the AppDomain here... } }
FYI: The Loader class is in a seperate DLL from the dataFile class.
Any help would be appreciated. I will continue to working on making the code Thread-Safe, but I feel like this could be the ‘simple’ answer.
If anyone has any other thought, please throw in.
Thank you,
Keith
Just for completeness.
I did find that if I marked the send adapter as ‘Ordered Delivery’ in the ‘Transport Advanced Options’ dialog I was able to avoid the multi-thread issues I was having.
I figure this is another possible answer to my problem, but not necessarily to the question.
Using app domains you could do something like this: