Usage
Dispatcher: Submitting Requests
Five ways to create a DispatcherRequest. Pick by who or what is triggering it.
1. Rich client Translate menu
Translation → Translate... in My Teamcenter, with a dataset selected. The
menu is entirely preference-driven: a translator appears when ETS.PROVIDERS,
ETS.TRANSLATORS.<PROVIDER> and ETS.DATASETTYPES.<PROVIDER>.<SERVICE> are set
and the selected dataset's type is listed. No code.
The Translation menu only exists if the Dispatcher Client for Rich Client option was selected at install.
For a custom menu item, add to plugin.xml in an Eclipse plug-in project:
<menuContribution
locationURI="menu:com.teamcenter.rac.ets.external.translate?after=additions">
</menuContribution>
after=additions places your item after Translate...; after=bottom places
it before.
To create the request from your own plug-in, call the exported
createDispatcherRequest method:
- Package:
external - Class:
DispatcherRequestFactory - Method:
createDispatcherRequest
Required parameters are provider, service and priority. Optional are
primaryObjects (the selected components) and secondaryObjects (their
parents).
2. ITK API — the batch and workflow route
DISPATCHER_create_request
Include dispatcher_itk.h, link against libdispatcher (libdispatcher.lib on
Windows). A complete sample source file ships as
DispatcherClient/sample/utilities/dispatcher_create_rqst_itk_main.cxx (86 KB,
so it is a real program, not a stub).
compile -DIPLIB=none dispatcher_create_rqst_itk_main.c
myLinkitk -o dispatcher_create_rqst_itk_main dispatcher_create_rqst_itk_main.obj
Specify both primary and secondary objects as input.
⚠ CORRECTED 2026-08-04 — workflow integration is NOT necessarily DIY. The Dispatcher guide states plainly, in 2506 and still in 2606: "No workflow action handlers or triggers are currently provided by Dispatcher." That sentence is misleading. Dispatcher does not ship a handler, but Process and Program Management does:
TSTK-CreateTranslationRequestis an OOTB action handler that creates Dispatcher requests with no code, documented in the Workflow Handlers guide of the same release. Check Triggering translations from workflow before committing to an ITK build — and note thatEPM-invoke-system-actioncalling the SOA route below replaces the ITK program entirely for most cases.
3. Teamcenter Services (SOA) — ✅ proven
The 2506 guide devotes one sentence to this and never names the operation. It is:
Core-2008-06-DispatcherManagement/createDispatcherRequest
Verified against a live tier: this creates a real DispatcherRequest which a
running Dispatcher Client then picks up and drives to a final state.
{"inputs": [{
"primaryObjects": [{"uid": "<dataset uid>", "type": "MSWordX"}],
"secondaryObjects": [{"uid": "<item revision uid>", "type": "ItemRevision"}],
"keyValueArgs": [], "dataFiles": [],
"providerName": "SIEMENS", "serviceName": "tozipfile",
"priority": 1, "startTime": "", "endTime": "", "interval": -1, "type": ""
}]}
Every attribute from providerName through type is required by the
schema, including the empty strings. The response returns the new request in
ServiceData.created, and its object_string is the task id you will see
in the Dispatcher logs.
Supply
secondaryObjects. For CAD-style translations the primary object is the dataset and the secondary is its item revision, and the shippedTaskPrepsamples pair them by index (secondary_objs[i]withprimary_objs[i]). A request created with primaries only is a good way to get aTERMINALyou cannot explain.
Companion operations, from the same offline WSDL sweep:
| Operation | Use |
|---|---|
Internal-Core-2008-06-DispatcherManagement/queryDispatcherRequests |
Find requests by provider, service, state, priority, primary object, task id |
Internal-Core-2008-06-DispatcherManagement/updateDispatcherRequests |
Modify existing requests |
Translation-2007-06-TranslationManagement/createTranslationRequest |
The older pre-Dispatcher equivalent |
⚠ Reading a request's state
getProperties on a DispatcherRequest returns nothing for the obvious
names (current_state, provider_name, service_name, task_id). Only
creation_date, object_string, owning_user and priority come back.
The reliable workaround needs no property name at all: filter
queryDispatcherRequests by states[] and see whether your uid comes back.
{"inputs":[{"providers":[],"services":[],"states":["TERMINAL"],"priorities":[],
"primaryObjects":[],"taskID":["<task id>"],"type":[],
"modifiedDate":"","unLoaded":false}]}
Binary-search the state list from the lifecycle page and you have the state in two or three calls.
4. AdminClient batch XML
AdminClient/bin/runBatch.bat against a file shaped like
AdminClient/testxml/BatchInput.xml:
<TranslationTasks>
<RootDir value="../data"/>
<TranslationTask Submits="1" Provider="SIEMENS" Service="tozipfile"
context="Translation">
<Priority value="2"/>
<!-- Time format "MM/dd/yyyy HH:mm" -->
<!--Time start="01/25/2007 17:33" interval="-1" end="-1"-->
<Options>
<Option key="SLEEP" value="0"/>
<Option key="EXIT" value="0"/>
</Options>
<Input value="ssw_idi0001.idi"/>
<!-- Dependant values take * wildcard -->
<!-- Dependant value="*.dep"/ -->
</TranslationTask>
</TranslationTasks>
RootDir is absolute or relative to AdminClient/bin. Input and Dependant
paths are relative to it. Dependant accepts * wildcards. This bypasses
Teamcenter entirely and submits straight to the Scheduler, which makes it the
best smoke test for a new Module-side translator: it proves the Scheduler,
Module and script work without any Dispatcher Client or preference
configuration in the picture.
Java submission samples: AdminClient/samples/SampleClient.java,
SubmitTransTaskRunnable.java, TranslationServerUtil.java.
5. Repeating requests
Not a separate mechanism: any request carries starttime, interval and
endtime. Set them and the request re-runs. interval is in seconds, -1
means no repeat. Times are "MM/dd/yyyy HH:mm".
Whether the repeating UI appears in the single-selection dialog is controlled by
ETS.REPEATING_UI.<PROVIDER>.<SERVICE>. The admin guide also has a "Set
preferences for repeating tasks" section under post-installation configuration.
The TranslationTask wire format
Whatever creates the request, this is what reaches the Scheduler. Schema at
DispatcherClient/xml/Task.xsd.
TranslationTask
@id @priority @starttime @interval @endtime
@provider @service @context @srcdir @visdir @databasename
├─ TranslatorOptions
│ └─ Option @name @value
├─ User @name @password @email
├─ TranslationData (1..n)
│ ├─ TranslationSrcInfo @filename @filetype @partname @partnumber @partversion
│ │ └─ UserDefAttribute @name @value
│ ├─ TranslationDBMapInfo
│ │ ├─ MappedFile @type @name
│ │ └─ UserDefAttribute @name @value
│ └─ TranslationDataRef @id
├─ TranslationDataRef @id
└─ DBInfo @host @port @user @passwd
Required attributes: service, srcdir on the task; id on each
TranslationData; filetype on TranslationSrcInfo; name on User.
Two details that matter:
priorityis inverted from intuition.0is High,1is Medium (the default),2is Low.filetypeis an enum of exactlysourceorproperty.sourcerequires translation;propertyis a descriptive file that rides along without being translated. Getting this wrong sends metadata files to your translator.
TranslationData nests via TranslationDataRef, which is how assembly
hierarchies are expressed.
Priority and the slack window
Scheduler priority is not absolute. SlackTime in
transscheduler.properties (default 60 minutes) defines how long a low-priority
task must have been waiting before it wins against a newly arrived high-priority
one. The shipped comment gives the example: a low-priority task submitted at
10:00 and a high-priority at 11:00 means the high-priority one goes first if
SlackTime is 70, and second if it is 50. This is deliberate starvation
prevention, and it will surprise you if you assume high priority means first.
Source: Admin guide ch. 7; AdminClient samples and Task.xsd (shipped SDK) · retrieved 2026-08-03