Hi,
To my understanding, if a component is marked as transient, it is
removed from memory and destroyed as soon as release() is called... is
this correct? (Or are instances pooled? If so, how do I control the
pool behaviour, size, etc?)
The reason I'm asking this is as follows: I have a Swing client - the
main window is the component deployed by merlin at startup. It has two
menu items: Open and Close (Open displays an instance of JPanel, Close
gets rid of the displayed JPanel instance). The Panel is supplied by a
component deployed at runtime. The following code displays the Panel:
long nStart = System.currentTimeMillis();
if(m_hULDBuildup == null)
{
m_hLogger.info("Loading module...");
// Menu to Module name map should be loaded from somewhere...
m_hULDBuildup = m_hModel.addContainmentModel(new URL(null,
"artifact:ngcs/NC.GroundHandling#1.0-rc1", new ArtifactHandler()));
m_hULDBuildup.commission();
}
// Initialize...
m_hLogger.info("Initializing module...");
DeploymentModel hModel =
m_hModel.getModel("/NGCS/GroundHandling/ULDBuildup");
ReferenceDescriptor hDescriptor = new
ReferenceDescriptor(Module.class.getName(),
new Version(1,0,0));
if(!hModel.isaCandidate(hDescriptor))
{
m_hLogger.error("Unable to resolve module, cannot continue!");
return;
}
// Resolve...
m_scrCurrent = (Module)hModel.resolve(true);
m_scrCurrent.initialize(); // My method - declared in the Module
class, implemented by the component
long nFinish = System.currentTimeMillis();
m_hLogger.info("Done, module initialized, time taken = " +
(nFinish - nStart) + " ms.");
m_pMainWnd.getContentPane().add(m_scrCurrent.getModuleView(),
BorderLayout.CENTER);
m_scrCurrent.activate(); // My method - declared in the Module
class, implemented by the component
The following code gets rid of the Panel:
m_hLogger.info("Deactivating screen...");
m_scrCurrent.deactivate(); // My method - declared in the Module
class, implemented by the component
m_pMainWnd.getContentPane().remove(m_scrCurrent.getModuleView());
m_mnuOpen.setEnabled(true);
m_mnuClose.setEnabled(false);
m_pMainWnd.getContentPane().invalidate();
m_pMainWnd.getContentPane().validate();
m_pMainWnd.invalidate();
m_pMainWnd.validate();
m_pMainWnd.repaint();
try
{
m_hLogger.info("Unloading module...");
m_hServiceManager.release(m_scrCurrent);
m_scrCurrent = null;
System.gc();
} catch (Exception e)
{
m_hLogger.error("Error unloading module : " + e.getMessage());
e.printStackTrace();
}
At any time only one Panel can be shown, so the menus get
enabled/disabled as appropriate - Open cannot be called when the Panel
is already shown. The first time the menu is clicked, the block is
deployed, after this, the block stays deployed, I just need to get a
new component instance - this instance will be released by me when the
user selects Close.
When I click close, I get this log in the console window:
[INFO ] (NGCS.Application): Deactivating screen...
[INFO ] (NGCS.Application): Unloading module...
[INFO ] (NGCS.GroundHandling.ULDBuildup): stop() called...
I repeat this 4-5 times, then I call Quit to end the application. When
I quit, I get this logged to the console:
[INFO ] (NGCS.GroundHandling.ULDBuildup): stop() called...
[INFO ] (NGCS.GroundHandling.ULDBuildup): stop() called...
[INFO ] (NGCS.GroundHandling.ULDBuildup): stop() called...
[INFO ] (NGCS.GroundHandling.ULDBuildup): stop() called...
[INFO ] (NGCS.GroundHandling.ULDBuildup): stop() called...
[INFO ] (NGCS.Application): stop() called...
I assume stop() is called on the instances because they are still in
memory? If so, have I missed out something?
Any suggestions will be helpful...
Thanks, and Brgds,
R. Saravanan
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]