ActiveX client programming, threading tips
The ActiveX to EJB bridge supports both free-threaded and apartment-threaded access and implements the Free Threaded Marshaler to work in a hybrid environment such as Active Server Pages (ASP). Each thread created in the ActiveX process is mirrored in the Java environment when the thread communicates through the ActiveX to EJB bridge.
When all references to Java objects (there are no JObjectProxy or JClassProxy objects) are loaded in an ActiveX thread, the ActiveX to EJB bridge detaches the thread from the JVM code. Therefore, be careful that any Java code that you access from a multithreaded Windows application is thread safe. Visual Basic code and VBScript applications are both essentially single threaded. Therefore, Visual Basic and VBScript applications do not have threading issues in the Java programs they access. Active Server Pages and multithreaded C and C++ programs can have issues.
Consider the following scenario:
- A multithreaded Windows Automation Container (our ActiveX Process) starts. It exists on Thread A.
- The ActiveX Process initializes the ActiveX to EJB bridge, which starts the JVM code. The JVM attaches to the same thread and internally calls it Thread 1.
- The ActiveX Process starts two threads: B and C.
- Thread B in the ActiveX Process uses the ActiveX to EJB bridge to access an object created in Thread A. The JVM attaches to thread B and calls it Thread 2.
- Thread C in the ActiveX Process never talks to the JVM code, so the JVM never needs to attach to it. This is a case where the JVM code does not have a one-to-one relationship between ActiveX threads and Java threads.
- Thread B later releases all of the JObjectProxy and JClassProxy objects that it used. The Java Thread 2 is detached.
- Thread B again uses the ActiveX to EJB bridge to access an object created in Thread A. The JVM code attaches again to the thread and calls it Thread 3.
Table 1. Thread scenario.
ActiveX process JVM access by ActiveX process Thread A - Created in 1 Thread 1 - Attached in 2 Thread B - Created in 4 Thread 2 - Attached in 4, detached in 6 Thread 3 - Attached in 7 Thread C - Created in 4
Threads and Active Server Pages
Active Server Pages (ASP) in Microsoft Internet Information Server is a multithreaded environment. By creating the XJB.JClassFactory object, we can store it in the Application collection as an Application-global object. All threads within the ASP environment can now access the same ActiveX to EJB bridge object. Active Server Pages by default creates 10 Apartment Threads per ASP process per CPU. This means that when the ActiveX to EJB bridge object is initialized any of the 10 threads can call this object, not just the thread that created it.
If we need to simulate single-apartment behavior, we can create a Single-Apartment Threaded ActiveX dynamic link library (DLL) in Visual Basic code and encapsulate the ActiveX to the EJB bridge object. This encapsulation guarantees that all access to the JVM object is on the same thread. we need to use the <OBJECT> tag to assign the XJB.JClassFactory to an Application object and must be aware of the consequences of introducing single-threaded behavior to a Web app. The Microsoft KnowlegeBase has several articles about ASP and threads, including:
- Q243543 INFO: Do Not Store STA Objects in Session or Application
- Q243544 INFO: Component Threading Model Summary Under Active Server Pages
- Q243548 INFO: Design Guidelines for VB Components Under ASP
Related concepts
ActiveX to EJB Bridge
Related tasks
Develop ActiveX client application code