Skip to main content
v1

Developer Guide

This page is the full implementation starter for consumers integrating ConvEngine into a Spring Boot service.

Consumer Extension Map

Click each node to inspect extension timing, file, method and expected session state.

React Flow mini map

1. Start a Spring Boot project

Maven dependency
package: project build
XML
<dependency>
<groupId>com.github.salilvnair</groupId>
<artifactId>convengine</artifactId>
<version>1.0.15</version>
</dependency>

2. Required schema (DDL)

Postgres DDL source
package: src/main/resources/sql
SQL
-- Use full script from:
-- src/main/resources/sql/ddl_postgres.sql
-- (legacy path still available: src/main/resources/sql/ddl.sql)
Source of truth

Use the dialect-specific DDL file from ConvEngine:

  • src/main/resources/sql/ddl_postgres.sql (or legacy src/main/resources/sql/ddl.sql)
  • src/main/resources/sql/ddl_oracle.sql
  • src/main/resources/sql/ddl_sqlite.sql

3. Minimal DML for FAQ scenario

FAQ DML example
package: db/seed
SQL
insert into ce_intent(intent_code, state_code, enabled)
values ('FAQ', null, true);

insert into ce_intent_classifier(intent_code, pattern, priority, enabled)
values ('FAQ', '(?i).*(office|location|address).*', 10, true);

insert into ce_response(intent_code, state_code, response_type, output_format, exact_text, enabled)
values ('FAQ', null, 'EXACT', 'TEXT', 'Our office is at 123 Tech Park, Silicon Valley.', true);

insert into ce_config(config_key, config_value, enabled)
values ('RESET_COMMAND', 'RESET_SESSION', true);

FAQ seed preview

TableKey values
ce_intentintent_code=FAQ
ce_intent_classifierpattern=(?i).*(office|location|address).*
ce_responseresponse_type=EXACT, output_format=TEXT
ce_configRESET_COMMAND=RESET_SESSION

4. application.yml (full consumer starter)

application.yml
package: src/main/resources
YAML

application.yml tag reference

server + datasource

TagWhat it controlsExpected valuesDefault/notes
server.portHTTP port for your appinteger8080 in sample
spring.datasource.urlDB connection URLjdbc URLMust point to DB with ce_* tables
spring.datasource.usernameDB usernamestringDB user with read/write on ce_*
spring.datasource.passwordDB passwordstringUse secret manager/env var in prod

convengine.transport.sse

TagWhat it controlsExpected valuesDefault/notes
convengine.transport.sse.enabledEnable SSE endpoints/publisherstrue | falseDefault true
convengine.transport.sse.emitter-timeout-msSSE emitter timeoutmillisecondsDefault 1800000 (30 min)

convengine.transport.stomp

TagWhat it controlsExpected valuesDefault/notes
convengine.transport.stomp.enabledEnable STOMP websocket transporttrue | falseDefault false
convengine.transport.stomp.endpointWebSocket handshake endpointpathDefault /ws-convengine
convengine.transport.stomp.app-destination-prefixClient send prefixpath prefixDefault /app
convengine.transport.stomp.topic-prefixServer publish topic prefixpath prefixDefault /topic
convengine.transport.stomp.audit-destination-baseAudit topic base pathpathDefault /topic/convengine/audit
convengine.transport.stomp.allowed-origin-patternCORS origin patternorigin patternDefault *
convengine.transport.stomp.sock-jsSockJS fallback toggletrue | falseDefault true

convengine.transport.stomp.broker

TagWhat it controlsExpected valuesDefault/notes
convengine.transport.stomp.broker.modeBroker mode selectionSIMPLE | RELAYSIMPLE uses in-memory broker
convengine.transport.stomp.broker.relay-destination-prefixesRelay destinations to enablelist of prefixesDefault [/topic, /queue]
convengine.transport.stomp.broker.relay-hostRelay broker hosthostnameUsed when mode=RELAY
convengine.transport.stomp.broker.relay-portRelay broker portintegerDefault 61613
convengine.transport.stomp.broker.client-loginClient login to relaystringOptional
convengine.transport.stomp.broker.client-passcodeClient passcode to relaystringOptional
convengine.transport.stomp.broker.system-loginSystem login to relaystringOptional
convengine.transport.stomp.broker.system-passcodeSystem passcode to relaystringOptional
convengine.transport.stomp.broker.virtual-hostRelay vhoststringOptional
convengine.transport.stomp.broker.system-heartbeat-send-interval-msOutbound heartbeatmillisecondsDefault 10000
convengine.transport.stomp.broker.system-heartbeat-receive-interval-msInbound heartbeatmillisecondsDefault 10000

convengine.audit (root)

TagWhat it controlsExpected valuesDefault/notes
convengine.audit.enabledMaster audit enable switchtrue | falseDefault true
convengine.audit.persist-metaPersist `_meta` into `ce_audit.payload_json`true | falseDefault true
convengine.audit.levelAudit verbosityALL | STANDARD | ERROR_ONLY | NONESTANDARD suppresses STEP_ENTER/STEP_EXIT
convengine.audit.include-stagesAllowlist stageslist of stage patternsEmpty = no allowlist filter
convengine.audit.exclude-stagesBlocklist stageslist of stage patternsApplied after include filter

convengine.audit.dispatch + rate-limit + persistence

TagWhat it controlsExpected valuesDefault/notes
convengine.audit.dispatch.async-enabledAsync listener dispatchtrue | falseDefault false unless enabled
convengine.audit.dispatch.worker-threadsAsync worker countinteger >= 1Default 2
convengine.audit.dispatch.queue-capacityDispatch queue sizeinteger >= 1Default 2000
convengine.audit.dispatch.rejection-policyBackpressure behaviorCALLER_RUNS | DROP_NEWEST | DROP_OLDEST | ABORTDefault CALLER_RUNS
convengine.audit.dispatch.keep-alive-secondsThread keep-alivesecondsDefault 60
convengine.audit.rate-limit.enabledEnable per-window throttlingtrue | falseDefault false
convengine.audit.rate-limit.max-eventsEvents allowed per windowintegerDefault 200
convengine.audit.rate-limit.window-msRate-limit windowmillisecondsDefault 1000
convengine.audit.rate-limit.per-conversationBucket by conversationtrue | falseDefault true
convengine.audit.rate-limit.per-stageBucket by stagetrue | falseDefault true
convengine.audit.rate-limit.max-tracked-bucketsBucket cardinality capintegerDefault 20000
convengine.audit.persistence.modeDB persistence modeIMMEDIATE | DEFERRED_BULKDefault IMMEDIATE
convengine.audit.persistence.jdbc-batch-sizeBatch insert chunk sizeintegerDefault 200
convengine.audit.persistence.max-buffered-eventsDeferred buffer capintegerDefault 5000
convengine.audit.persistence.flush-stagesStages forcing flushlist of stagesDefaults include engine failure stages
convengine.audit.persistence.final-step-namesFinal steps that flushlist of step namesDefault includes PipelineEndGuardStep
convengine.audit.persistence.flush-on-stop-outcomeFlush on STOP step outcometrue | falseDefault true
Streaming startup rule

If @EnableConvEngine(stream=true) is set, startup fails when both convengine.transport.sse.enabled=false and convengine.transport.stomp.enabled=false.

5. API entry and session contracts

ConversationController.message
package: com.github.salilvnair.convengine.api.controllerfile: src/main/java/com/github/salilvnair/convengine/api/controller/ConversationController.java
JAVA
@PostMapping("/message")
public ConversationResponse message(@RequestBody ConversationRequest request) {
EngineContext engineContext = EngineContext
.builder()
.conversationId(request.getConversationId())
.userText(request.getMessage())
.inputParams(request.getInputParams())
.build();

EngineResult result = engine.process(engineContext);
return mapToResponse(result);
}

6. Extension examples

Step hook with enum-safe matching
package: com.zapper.convengine.hooks
JAVA
@Component
public class SchemaHintHook implements EngineStepHook {
@Override
public boolean supports(EngineStep.Name stepName, EngineSession session) {
return EngineStep.Name.SchemaExtractionStep == stepName;
}

@Override
public void beforeStep(EngineStep.Name stepName, EngineSession session) {
session.putInputParam("consumer_hint", "compact");
}
}

7. Persistence, audit and streaming tuning

Production sequence

Start with direct HTTP + IMMEDIATE audit. Then enable async dispatch and bounded queue. Move to DEFERRED_BULK only after validating final-step flush behavior for your trace requirements.

High-impact runtime knobs

AreaConfigEffect
Audit dispatchconvengine.audit.dispatch.*Decouples request latency from listener work
Queue/backpressureconvengine.audit.dispatch.queue-capacity + rejection-policyBounds memory and defines overflow behavior
Audit persistence modeconvengine.audit.persistence.modeIMMEDIATE or DEFERRED_BULK (JDBC batch flush)
Stage filteringconvengine.audit.level + include-stages/exclude-stagesControls emitted/saved stages
Broker relayconvengine.transport.stomp.broker.mode=RELAYOptional external broker for STOMP scaling
Stream hard requirement@EnableConvEngine(stream=true)Fails startup if both SSE and STOMP are disabled