The Solution Directory
is the current working directory
for an SDI/TDI Server.
Each TDI Server running on the same machine should have it's own Solution Directory (or SolDir for short). If you don't know where your SolDir is pointing, simply open defaultSolDir.sh
) found in the bin
sub-folder of your installation directory (e.g. V7.2
). This script sets the TDI_SOLDIR
environment variable that controls Server behavior.
Both the ibmditk
script to launch the CE, and ibmdisrv
that starts a Server call defaultSolDir
, along with other scripts in this folder. Like javaHome
The Solution Directory holds configuration settings, including Java settings, for a Server. These settings are found in a file named solution.properties
After reading solution.properties
file, the Server then reads the global.properties
file in the etc
sub-folder of the TDI installation directory. Settings in solution.properties
override those in global.properties
If you open solution.properties
in a text editor you will find two important properties that are personal to any running TDI Server:
- The port that the Server listens to for RMI API calls: api.remote.naming.port
- The port that the Server listens to web calls: web.server.port (dashboard, FDS, CURI and REST APIs)
This is also where you provide the paths to keystores and truststores, as well as credentials to access these.
By default, the one for the TDI Server's APIs is named testserver.jks
and is found in the SolDir. Certificates used for SSL connections in your solutions are under the serverapi
sub-folder and are named testadmin.jks
NOTE: The default password for testserver.jks
, and for testadmin.jks
. To import your own certificates use keytool
(found under the jvm/jre/bin
sub-folder of your TDI installation directory) or the Key Manager
button in the TDI CE (Configuration Editor).
NOTE II: If you remove all properties in solution.properties
that you are not explicitly setting, then a TDI version upgrade might change global.properties
and could then affect settings for your Server.
Leveraging the Solution Properties folder to make your solutions more portable
As mentioned above, the SolDir is the current working directory for TDI, both the CE and the Server. Any Config xml files placed in the configs
sub-folder of the SolDir will be automatically loaded when the Server starts up. If they have Schedulers, then these are activated as well.
Another approach is to make a Project folder in the SolDir. Solution filepaths should point in this directory using simply the name of the folder. For example, if you project is named "MyProject" then the path to the Property Store file would be:
The next step is to instruct the CE where to write the compiled
Config xml, which is written each time you save a change. By default this file is written as:
You can change this easily to have the Config written to your Project folder. Simply right-click on the name of your Project in the CE Navigator View and select Properties
Choose Tivoli Directory Integrator
properties at the bottom and set the Linked File
parameter to a relative path that points to a config file under this same folder, like MyProjext/MyProject.xml
NOTE III: If you use forward-slashes for paths instead of backslashes, your solution runs on Windows and all flavors of *nix (including mainframe).
Make sure you also put any other support files in this folder so you can easily move the solution by simply compressing this directory and then uncompressing it in the SolDir of the target TDI installation.
The ReadMe.txt file you make in your project directory could look something like this:
To install this solution:
1) Unzip QRTrigger.zip to your Solution Directory;
2) Edit QRTrigger.properties to configure connections
3) Run the solution with this commandline:
ibmdisrv -c QRTrigger/QRTrigger.xml -r QRListener
Violá, you have something that you can hand to the operations team for deployment, pass on to a colleague, and even publish it online (and sending me the link :)
Pointing to a specific Solution Directory
pointed out to me that I should mention the scripts used to start up the CE (ibmdisrv)
and the one for the Server (ibmditk)
. Each accepts the -s argument for specifying the SolDir to use:
ibmdisrv -s /MyOtherSolDir -c MyOtherProject/MyOtherProject.xml -d
NOTE IV: If the SolDir does not exist then the Server will set it up the first time it starts.
Your Eclipse workspace
So the SolDir is a tool for making solutions portable, and it is independent of where you put your TDI workspace. The workspace is where the Eclipse framework housing TDI organizes your source files, and the directory structure there mirrors what you see in the CE Navigator. It is not recommended that you work directly with source files, apart from tying them to SCM like git.
But what if you chose the program directory or "current location" when you installed, or want to move the Solution Directory for some other reason? No problem. Simply edit defaultSolDir.
is only half the job. You also have to instruct the CE where the new SolDir is when it automatically starts up your local TDI Server. This is visible in the Server view at the bottom left of the CE, and is called 'Default'. Can change the Server Launcher settingsby right-clicking on 'Default' in the Server view and selecting Properties
and making the change here too.
Final note about the Servers view
The view is not called Servers
for nothing. TDI lets you define new Servers, allowing you to start multiple Servers on your PC, or connect to those running on other platforms. You can point a Project at any Server by editing its settings (right-click > Properties). This lets you test and debug the ALs there. Each Server has its own Solution Directory settings, so using relative paths means you can build your ALs on your laptop and then run them elsewhere. You will also want to use forward slashes for filepaths, since backslash only works on Windows and TDI runs a lot of other places as well
You can also right-click on a Server and select Debug Server
. This opens a blank debugger tab which then catches an ALs that are started on this Server.
And while I'm on the soapbox here are some additional tips: Define Logging for where your task.logmsg() messages are written; Code Error Hooks and log enough info for manual intervention; Write status messages to the command line by using main.logmsg(); And set up Connector Auto-Reconnect (Connection Errors).