Deployment
Dispatcher: Troubleshooting
Bisect by state first
The request state names the owning component. Do not read logs before reading the state. See Request lifecycle for the full table; the short version:
| Stuck at | Suspect |
|---|---|
INITIAL |
Dispatcher Client not running, or not polling |
PREPARING |
TaskPrep, dataset type, named references |
SCHEDULED |
No Module advertises the service, or all are at MaximumTasks |
TRANSLATING |
The translator script, or the progress watchdog |
LOADING |
DatabaseOperation, destination type / named ref / relation |
Then open the right log
Dispatcher writes one log per component per task under
Dispatcher/Logs/Dispatcher/task/<taskId>/:
| File | Component |
|---|---|
<taskId>_dc.log |
Dispatcher Client |
<taskId>_s.log |
Scheduler |
<taskId>_m.log |
Module |
The triplet maps one-to-one onto the state machine, so the state you are stuck
in names the file to open. There are also per-component rolling logs
(Scheduler.log, Module_*.log, DispatcherClient_<ip>_<port>.log) alongside.
The Command string: line in the module log is the most valuable line in
Dispatcher. It is the fully-resolved command with every option substituted.
Copy it, run it by hand on the Module host, and you have isolated your
translator from the entire framework in one step.
The failure modes worth knowing in advance
⚠⚠⚠ "Translation request missing primary object" is an ACL failure in disguise
The most misleading error in Dispatcher. Observed live:
INFO - Begin Extract of Request <taskId>
ERROR - Translation request missing primary object.
java.lang.Exception: Translation request missing primary object.
at com.teamcenter.ets.request.TranslationRequest.refreshPriAndSecObjs(TranslationRequest.java:1244)
at com.teamcenter.ets.extract.Extractor.processRequest(Extractor.java:388)
The request is not missing a primary object. refreshPriAndSecObjs()
re-resolves the primary and secondary object references inside the Dispatcher
Client's own Teamcenter session — the session belonging to Service.Tc.User.
If that account cannot see the object, the reference resolves to null and is
reported as "missing".
So this message means: the DC Proxy User cannot read the data you pointed it
at. It says nothing about the request itself. Confirm by reading the same
object as Service.Tc.User in an independent session; if that fails too, the
problem is access, not the request.
On project-secured data this is the default outcome, because the DC Proxy
User is typically a dba-group service account with no project context. Two
things are required, and the second is easy to forget:
- The DC Proxy User must be a member of the project and have it set as its default project, so its session carries that project context.
- The Dispatcher Client must be restarted. It holds a long-lived session
(
Service.Tc.ReLoginIntervaldefaults to 1440 minutes), so it will not pick up new access for 24 hours otherwise. A request fired after the grant but before the restart fails identically and looks like the grant did not work.
Corollary for multi-program sites: a Teamcenter session has exactly one current project, so one DC Proxy User serves exactly one program. That is a structural constraint, not a policy choice.
preferences_manager that does nothing and says nothing
Two failure modes that both look like success, and cost real time:
It needs the Teamcenter environment in the invoking process. Having
TC_ROOT and TC_DATA set as variables is not enough — the executable needs
Teamcenter's library directories on PATH, which is what tc_profilevars does.
Without it the process fails to load its DLLs and prints nothing at all:
EXIT CODE = -1073741515 # 0xC0000135 STATUS_DLL_NOT_FOUND
Wrap it so the environment is loaded in the same process:
@echo off
call "%TC_DATA%\tc_profilevars.bat"
"%TC_ROOT%\bin\preferences_manager.exe" -u=<user> -p=%1 -g=dba -mode=import -scope=SITE -action=override -context=Teamcenter -file=<file>
echo EXITCODE=%ERRORLEVEL%
A successful run is chatty; a failed one is silent. Success prints
The import operation has succeeded. and a report-file path. Any failure to
launch prints nothing and returns to the prompt looking identical to success.
Always capture
$LASTEXITCODE, and always verify by reading the preferences back as a different user afterrefreshPreferences. Never chain the import withRestart-Serviceusing;— a failed import still restarts the service, and the whole sequence looks like it worked.
Fully configured, never runs, nothing logged
Observed live: a translator registered in translator.xml with
isactive="true", a launch script in place, Prepare/Load bound in
Service.properties, and all six extract/load preferences set — which had
never run once in 2,715 tasks over four months, because the
ETS.DATASETTYPES.<PROVIDER>.<SERVICE> menu preference was never created.
Without it the service never appears in the Translation Selection dialog, so no request is ever created, so there is nothing to log and nothing to fail. It is indistinguishable from a working translator by inspecting the Module host alone.
Check both preference families before anything else. They are independent. See Live configuration evidence for a one-call probe.
Stderr output that is not actually a failure
A live successful task log contains Standard Error : Processing queue and
still ends Completed successfully!. Writing to stderr does not fail a task.
Only a <TransErrorStrings> match or a non-zero exit does. Do not spend a day
silencing a chatty translator that is working.
isactive="false"
All 78 OOTB services ship inactive except tozipfile. A perfectly configured
service that never picks up work is this, far more often than anything else.
Check Module/conf/translator.xml first, every time.
A translator that exits 0 and still fails
<TransErrorStrings> scanning. Dispatcher greps stdout and stderr for declared
substrings and fails the task on a match regardless of exit code. Conversely, a
translator that prints a benign line matching a site-wide <ErrorStrings>
pattern fails for no visible reason. The fix is <ErrorExclStrings> or the
per-translator addExclErrorString() / addExclInputString(), not suppressing
your own output.
Failure at roughly 50 minutes
MaximumProgress=100 × MonitorInterval=0.5 = a 50-minute default ceiling on
one translation. Large models hit this. Raise MaximumProgress.
Filenames silently changed
BadChars in DispatcherClient.config replaces a long list of characters
(including -, ., space and parentheses) with underscores before translation.
If your script does exact filename matching, it is matching the sanitized name.
Override per service with <Provider>.<Service>.BadChars.
Related: the shipped proetojt TaskPrep sanitizes deliberately before
translation so that source-to-result mapping still works afterward, and appends
an index (a_b0.prt, a_b1.prt) because sanitizing can collide two distinct
names into one.
"No translation result found"
Specific and useful. It means the Dispatcher Client side worked and nothing came
back, which almost always means the Module has no such translator configured.
The ppttopdf sample readme calls this out by name as the expected error when
the Module half has not been done.
Staging directory mismatch under RMI
With RMI file transfer, Staging.Dir must be set on both the Client and the
Module and must resolve to the same physical location. HTTP transfer tolerates
an empty value; RMI does not.
Your new jar throws Class not found under the Windows service
The highest-value gotcha for anyone adding custom classes. Siemens KB
PL8828085: a customer added Prepare/Load classes in a jar, registered
them in Service.properties, and extended CLASSPATH in
DispatcherClient\bin\setDispatcherClientEnv.bat. The DispatcherClient still
threw Class not found.
Cause: when the Windows service is created with
runDispatcherClientWinService.bat -i, the classpath is written into the
registry under
HKLM\SYSTEM\ControlSet001\Services\Teamcenter DispatcherClient <version>\Parameters.
Editing the batch file afterwards changes nothing, because the service never
reads it again.
Fix: reinstall the service.
runDispatcherClientWinService.bat -r
runDispatcherClientWinService.bat -i
Reproduced on TC V2312.0004. Expect to hit this the first time you deploy a
custom TaskPrep.
The Translation menu appears when Dispatcher is not installed
Siemens KB PL8045532: the Translation menu shows up in My Teamcenter even when the Dispatcher client for rich client feature was never selected at install. The documented behavior is that it should only appear when the feature is installed. It does not.
So menu presence proves nothing. Neither does
DISPATCHER_CLIENT_INSTALLED=true. Confirm the Scheduler and Module processes
independently before concluding Dispatcher is deployed.
Result file exists but the loader says it is missing
If the result is a text file, see KB PL8123093: text named references are
defined by * rather than *.txt, so the loader looks for myfile when the
translator wrote myfile.txt, and reports the result missing immediately. Fixed
in TC 12.2 (PR 9448791). Adding .txt to OutputExtensions in
translator.xml does not work around it.
Staging directory on a network share
KB PL8674963: with a NetApp share mapped as a Windows network drive as the
staging directory, prepare.exe could not read the input file and reported the
Result directory as not writable, silently writing the PDF to TEMP instead.
Reproducible from the command line, with no custom code involved. If your
staging directory is a mapped drive rather than a UNC path or local disk, test
the translator standalone against that exact path before blaming Dispatcher.
Windows service will not start
The guide has a specific entry: "Unable to run Dispatcher components as Windows service due to missing DLL file." Also check that the system and environment variables needed to run the dispatcher client as a Windows service were set as part of post-installation.
Terminal state from too many open files
A documented failure: "Dispatcher requests go to terminal state due to large number of files open." Relevant on assembly translations and on Unix Modules with default ulimits.
Unicode / Cyrillic
Both an admin-guide section ("Support for Unicode and Cyrillic character encoding") and a post-installation task ("Update Dispatcher components to work with UTF-8 configuration"). If your data is not ASCII, do the UTF-8 step during install rather than debugging it later.
NXToPvDirect hangs
Has its own troubleshooting section. Direct translators behave differently from
the standard extract/translate/load flow: they write into Teamcenter themselves
and use PostProcessor.xml file mapping rather than Load classes. Do not
debug them with the standard model.
Multiple named references after translation
Also documented: "Multiple named references added after the translation process." Usually destination named-reference configuration interacting with the replace-existing flag.
⚠⚠ A translator that silently lost a feature: version skew on the Module host
Observed live. A translator that had been running end to end for days was producing its main artifact correctly but silently skipping an entire stage, and reporting success while doing it.
The translator's entry point had been redeployed several times during bring-up. Nothing it calls ever had. The Module host was running a months-old copy of the supporting scripts:
| file | Module host | source repo |
|---|---|---|
| entry point | current | current |
| transform | 3,887 | 7,772 |
| the audit step it invokes | absent | 12,860 |
The old transform had no support for the --emit-exchange flag at all. It
accepted the flag, ignored it, and exited 0 — so the downstream stage found
no input file, skipped itself, and the request still reported success.
Three things generalise:
- Redeploy the transitive closure, not the entry point. A one-level import
grep is not enough. Walk the imports until the set stops growing, then hash
every file on both sides and diff the manifest. Deploying six of eight files
here produced
ERR_MODULE_NOT_FOUNDon a helper two levels down. - Upgrade the minimum. Version skew caused the fault, but the fix is not "sync everything." Two older modules were deliberately left in place because they still exported the API the new code imports, and replacing them would have put the one proven, verified output at risk to solve a problem it was not causing.
- Unknown arguments must be rejected, not ignored. This is the same defect
class as
import_fileaccepting a misspelled-itemRevVid, printing*** Importing File ***, creating nothing, and exiting 0. If your translator parses its own flags, make an unrecognised one a non-zero exit.
Preventing the silent part is your job, not Dispatcher's. Dispatcher reports the process exit code. If a stage inside your translator is deliberately non-fatal — and a reporting or audit stage usually should be, since its failure must not discard the artifact that was successfully produced — then it will fail invisibly unless you make it speak:
- Capture the stage's stderr, not just its exit code, into your status JSON.
- Log an explicit
skippedentry when a stage is bypassed for a missing input, naming the file. A stage that vanishes from the stage list is far harder to notice than one that reports why it stood down.
A request that returns ok with a stage quietly missing is the worst available
outcome: the gate is gone and nothing anywhere says so.
⚠⚠⚠ The request succeeded and the artifact is wrong
Every failure mode above announces itself. This one does not, and none of the bisect-by-state advice on this page will find it, because there is no stuck state and no error to open a log against.
Observed live. Two supporting modules on the Module host were updated to close a version skew. The request completed, the dataset was created and attached, the translator's own reconciliation stage passed. The artifact had lost a third of the model: a deduplication step merged components on their name, and the source genuinely contained three Thrusters, three Heaters and three of several other things. Two of every three were destroyed silently.
Symptoms, such as they are:
- The request reaches
COMPLETE. - The output file is noticeably smaller than the last known-good run. On this occasion 1,094,386 bytes became 797,101, and that was the only visible signal.
- Any self-reported quality metric goes down rather than failing, because a smaller model and a broken one look identical from inside the translator.
What to do about it:
- Keep the artifact size per run. It costs nothing, and it was the only thing that flagged this. A step change in size on an unchanged model is the tell.
- Reconcile against the extract, not against your own intermediate. See Anatomy of a working translator for the check and the four rules it produced. A translator comparing its output to its own intermediate cannot detect anything it dropped before writing both.
- Never conclude "no error" means "no problem" on this stack.
import_fileaccepts a misspelled option, prints*** Importing File ***, creates nothing and exits 0. A transform accepted a flag it did not support, ignored it and exited 0. Now a translator discarded 43 components and exited 0. Three separate silent-success defects on one deployment.
A note on change control. All three arrived through partial or unvalidated redeployment of a translator's supporting files. Treat a translator's dependencies as part of the translator: version them together, deploy the whole transitive closure, and re-validate the output against the source afterwards — not just that the request still completes.
Diagnostic tooling
| Task | How |
|---|---|
| Is it even running? | -ping, supported by all three Dispatcher components (Scheduler, Module, DispatcherClient). This is the first command to run, and the fastest way to settle "is Dispatcher deployed here" |
| List and manage request objects from the CLI | dispatcher_util (documented in the Utilities Reference, present from TC 10.1 through at least 13.2). Lists requests and manages request objects without the rich client |
| Set debug levels | Admin guide 10-3; log4j2 per component in conf/log4j2.xml |
| Query request objects | Admin guide 10-4 |
| View request logs | Attached to the request. Controlled by Translator.<p>.<s>.Log and .LogsForComplete |
| View service runtime status | start_sco_dispatcher utility; also a JMX surface (com.teamcenter.tstk.util.jmx.module, ...jmx.scheduler) |
| Admin console | Refresh, resubmit, delete, filter requests; view properties and attached logs |
Log files land under LogVolumeLocation (default ../logs) per component.
LogManager.DeleteTime is unset by default, meaning logs are never
auto-deleted. Set it (in minutes) on a long-running site.
By default no logs are attached to successful requests
(LogsForComplete=false), and the client looks for
<provider>_<translator>.log in the result directory when no filenames are
specified.
Two claims to be careful with
"Dispatcher is installed" usually means someone set
DISPATCHER_CLIENT_INSTALLED=true. That preference makes the Translate menu
appear. It says nothing about whether a Scheduler or Module exists. Confirm the
processes independently.
"The translator is configured" usually means a block exists in
translator.xml. Confirm isactive="true" and confirm the script runs
standalone.
Escalation path
The admin guide's own checklist order: isolate the translation problem, raise debug levels, query the request objects, read the attached logs. Run the translator standalone at the first sign of trouble. It removes four subsystems from the problem in one step.
Source: Admin guide ch. 10; shipped SDK config comments · retrieved 2026-08-03