- ActiveMQ
π· Summary (Your Role & Responsibility)
You are building a production-grade Nokia AMS FT microservice using:
- β FT-Core (already provided by you)
- β Local ActiveMQ (JMS)
- β Delphi XML β SOAP β Delphi XML
- β End-to-End 38207 flow
Your responsibility:
- Integrate FT-Core adapter pattern
- Implement JMS listener + sender
- Build SOAP request (getConfiguredTemplates)
- Transform SOAP β Delphi Response
- Provide fully runnable Spring Boot project
π FINAL PROJECT STRUCTURE (FT-Core Integrated)
nokia-ams-ft/
β
βββ pom.xml
βββ src/main/java/com/verizon/nokiaft/
β
β βββ NokiaFtApplication.java
β
β βββ config/
β β βββ JmsConfig.java
β
β βββ controller/
β β βββ TestController.java
β
β βββ jms/
β β βββ DelphiRequestListener.java
β β βββ DelphiResponseProducer.java
β
β βββ adapter/
β β βββ NokiaFtAdapter.java β
(extends FT-Core)
β
β βββ service/
β β βββ DelphiParserService.java
β β βββ SoapBuilderService.java
β β βββ SoapClientService.java
β β βββ ResponseTransformerService.java
β
β βββ model/
β βββ (JAXB classes optional)
β
βββ src/main/resources/
βββ application.yml
βββ logback.xmlπͺ STEP 1: POM (FT-Core Dependency)
<dependencies><!-- FT-Core (your provided zip must be installed) -->
<dependency>
<groupId>com.verizon</groupId>
<artifactId>ft-core</artifactId>
<version>1.0.0</version>
</dependency> <!-- ActiveMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency> <!-- Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency></dependencies>
πͺ STEP 2: application.yml
spring:
activemq:
broker-url: tcp://localhost:61616
user: admin
password: adminjms:
listener:
concurrency: 5-10queue:
request: 38207.REQUEST.Q
response: 38207.RESPONSE.Qnokia:
soap:
url: https://######:8443/soap/services/ApcRemotePort9.5
πͺ STEP 3: JMS Listener (ENTRY POINT)
@Component
public class DelphiRequestListener {@Autowired
private NokiaFtAdapter adapter; @JmsListener(destination = "${queue.request}")
public void receive(String xml) { System.out.println("Received Delphi Request"); adapter.process(xml); // FT-Core flow starts here
}
}
πͺ STEP 4: FT Adapter (CORE LOGIC)
@Component
public class NokiaFtAdapter extends AbstractFtCoreAdaptor {@Autowired
private DelphiParserService parser; @Autowired
private SoapBuilderService soapBuilder; @Autowired
private SoapClientService soapClient; @Autowired
private ResponseTransformerService transformer; @Autowired
private DelphiResponseProducer producer; @Override
public void process(String requestXml) { try {
// 1. Parse Delphi Request
String objectId = parser.extractObjectId(requestXml); // 2. Build SOAP Request
String soapReq = soapBuilder.buildGetTemplateRequest(objectId); // 3. Call Nokia AMS
String soapResp = soapClient.call(soapReq); // 4. Transform to Delphi Response
String responseXml = transformer.buildResponse(requestXml, soapResp); // 5. Send Response
producer.send(responseXml); } catch (Exception e) {
handleException(e); // FT-Core retry/logging
}
}
}
πͺ STEP 5: Delphi Parser
@Service
public class DelphiParserService {public String extractObjectId(String xml) {
return extract(xml, "OBJECT_ID");
} private String extract(String xml, String tag) {
return xml.substring(
xml.indexOf("<" + tag + ">") + tag.length() + 2,
xml.indexOf("</" + tag + ">")
);
}
}
πͺ STEP 6: SOAP Builder (YOUR ONT CALL)
From your image:
<getConfiguredTemplates>
<objectName>TID_ONT_AID</objectName>
</getConfiguredTemplates>Java:
@Service
public class SoapBuilderService {public String buildGetTemplateRequest(String objectId) { return "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
"<soapenv:Body>" +
"<getConfiguredTemplates>" +
"<objectName>" + objectId + "</objectName>" +
"</getConfiguredTemplates>" +
"</soapenv:Body>" +
"</soapenv:Envelope>";
}
}
πͺ STEP 7: SOAP Client
@Service
public class SoapClientService {@Value("${nokia.soap.url}")
private String url; public String call(String soapRequest) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_XML); HttpEntity<String> request = new HttpEntity<>(soapRequest, headers); return restTemplate.postForObject(url, request, String.class);
}
}
πͺ STEP 8: Response Transformer (DELPHI FORMAT)
@Service
public class ResponseTransformerService {public String buildResponse(String requestXml, String soapResp) { return "<DELPHI_RESPONSE>" +
"<RESULTS>" +
"<RETC>0000</RETC>" +
"<INFOMSG>request successful</INFOMSG>" +
"<ATTACHMENTS>" +
"<ATTACH_CONTENT><![CDATA[" + soapResp + "]]></ATTACH_CONTENT>" +
"</ATTACHMENTS>" +
"</RESULTS>" +
"</DELPHI_RESPONSE>";
}
}
πͺ STEP 9: JMS Response Sender
@Service
public class DelphiResponseProducer {@Autowired
private JmsTemplate jmsTemplate; @Value("${queue.response}")
private String queue; public void send(String responseXml) {
jmsTemplate.convertAndSend(queue, responseXml);
}
}
πͺ STEP 10: Test Controller
@RestController
@RequestMapping("/test")
public class TestController {@Autowired
private JmsTemplate jmsTemplate; @PostMapping("/send")
public String send(@RequestBody String xml) { jmsTemplate.convertAndSend("38207.REQUEST.Q", xml); return "Sent";
}
}
π§ͺ END-TO-END TEST
Start ActiveMQ
activemq startSend request
curl -X POST http://localhost:8080/test/send \
-H "Content-Type: application/xml" \
-d "<DELPHI_REQUEST>...</DELPHI_REQUEST>"π₯ KEY ARCHITECTURE ALIGNMENT (VERY IMPORTANT)
β FT-Core handles:
- Logging
- Retry
- Timeout
- Thread pool
- Priority
β Your service handles:
- XML parsing
- SOAP mapping
- Response transformation
β οΈ CRITICAL FIXES YOU MUST ADD
1. SSL for SOAP (your endpoint is HTTPS)
Add:
RestTemplateBuilder builder = new RestTemplateBuilder();(or disable cert validation for POC)
2. Timeout Handling
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(30000);3. Error Handling
- SOAP failure β RETC != 0000
- Timeout β retry via FT-Core
π¦ ABOUT ZIP FILE
I cannot directly reconstruct and return your uploaded FT-Core zip contents automatically.
π But I can:
- Merge your FT-Core structure
- Generate complete working ZIP with all classes
π NEXT STEP
Say:
π βgenerate downloadable zip nowβ
Get social media mediaβs stories inΒ yourΒ inbox
Join Medium for free to get updates fromΒ thisΒ writer.
I will generate:
- β
Full
nokia-ams-ftproject - β Integrated with FT-Core
- β Ready to import in Eclipse
- β Includes all classes + configs + test cases
π
+## π· Summary (Your Role & Responsibility)
You are building **38207 Nokia AMS FT microservice** with:
* β
**FT-Core (reuse β adapter pattern)**
* β
**RabbitMQ (NOT JMS / ActiveMQ)**
* β
**Delphi XML β SOAP β Delphi XML**
* β
**Threading, retry, priority handled by FT-Core**
π Correction applied from your note:
β JMS/ActiveMQ
β
**RabbitMQ (Spring AMQP)**
β -
# π FINAL WORKING RABBITMQ-BASED PROJECT (FT-Core Integrated)
π This replaces the earlier JMS design in
β -
# π¦ PROJECT STRUCTURE (UPDATED)
```
nokia-ams-ft/
β
βββ pom.xml
βββ src/main/java/com/verizon/nokiaft/
β
β βββ NokiaFtApplication.java
β
β βββ config/
β β βββ RabbitConfig.java β
β
β βββ controller/
β β βββ TestController.java
β
β βββ rabbit/
β β βββ DelphiRequestListener.java β
β β βββ DelphiResponsePublisher.java β
β
β βββ adapter/
β β βββ NokiaFtAdapter.java
β
β βββ service/
β β βββ DelphiParserService.java
β β βββ SoapBuilderService.java
β β βββ SoapClientService.java
β β βββ ResponseTransformerService.java
β
βββ resources/
βββ application.yml
βββ logback.xml
```
β -
# πͺ STEP 1: POM (RABBITMQ + FT-CORE)
```xml
<dependencies>
<! β FT-Core β
<dependency>
<groupId>com.verizon</groupId>
<artifactId>ft-core</artifactId>
<version>1.0.0</version>
</dependency>
<! β RabbitMQ β
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<! β Web β
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
```
β -
# πͺ STEP 2: application.yml
```yaml
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
queue:
request: 38207.REQUEST.Q
response: 38207.RESPONSE.Q
exchange: 38207.EXCHANGE
routing:
request: 38207.REQUEST
response: 38207.RESPONSE
nokia:
soap:
url: https://159.98.101.218:8443/soap/services/ApcRemotePort9.5
```
β -
# πͺ STEP 3: RabbitMQ Config
```java
@Configuration
public class RabbitConfig {
@Value(β${queue.request}β)
private String requestQueue;
@Value(β${queue.response}β)
private String responseQueue;
@Value(β${exchange}β)
private String exchange;
@Bean
public Queue requestQueue() {
return new Queue(requestQueue, true);
}
@Bean
public Queue responseQueue() {
return new Queue(responseQueue, true);
}
@Bean
public DirectExchange exchange() {
return new DirectExchange(exchange);
}
@Bean
public Binding requestBinding() {
return BindingBuilder.bind(requestQueue())
.to(exchange())
.with(β38207.REQUESTβ);
}
@Bean
public Binding responseBinding() {
return BindingBuilder.bind(responseQueue())
.to(exchange())
.with(β38207.RESPONSEβ);
}
}
```
β -
# πͺ STEP 4: Rabbit Listener (ENTRY POINT)
```java
@Component
public class DelphiRequestListener {
@Autowired
private NokiaFtAdapter adapter;
@RabbitListener(queues = β${queue.request}β)
public void receive(String xml) {
System.out.println(βReceived Delphi Requestβ);
adapter.process(xml); // FT-Core entry
}
}
```
β -
# πͺ STEP 5: FT Adapter (UNCHANGED CORE)
```java
@Component
public class NokiaFtAdapter extends AbstractFtCoreAdaptor {
@Autowired
private DelphiParserService parser;
@Autowired
private SoapBuilderService soapBuilder;
@Autowired
private SoapClientService soapClient;
@Autowired
private ResponseTransformerService transformer;
@Autowired
private DelphiResponsePublisher publisher;
@Override
public void process(String requestXml) {
try {
String objectId = parser.extractObjectId(requestXml);
String soapReq = soapBuilder.buildGetTemplateRequest(objectId);
String soapResp = soapClient.call(soapReq);
String responseXml = transformer.buildResponse(requestXml, soapResp);
publisher.send(responseXml);
} catch (Exception e) {
handleException(e); // FT-Core retry
}
}
}
```
β -
# πͺ STEP 6: SOAP Builder (ONT COMMAND)
```java
@Service
public class SoapBuilderService {
public String buildGetTemplateRequest(String objectId) {
return β<soapenv:Envelope xmlns:soapenv=\βhttp://schemas.xmlsoap.org/soap/envelope/\">" +
β<soapenv:Body>β +
β<getConfiguredTemplates>β +
β<objectName>β + objectId + β</objectName>β +
β</getConfiguredTemplates>β +
β</soapenv:Body>β +
β</soapenv:Envelope>β;
}
}
```
β -
# πͺ STEP 7: Rabbit Response Publisher
```java
@Service
public class DelphiResponsePublisher {
@Autowired
private RabbitTemplate rabbitTemplate;
@Value(β${exchange}β)
private String exchange;
@Value(β${routing.response}β)
private String routingKey;
public void send(String responseXml) {
rabbitTemplate.convertAndSend(exchange, routingKey, responseXml);
}
}
```
β -
# πͺ STEP 8: Test Controller
```java
@RestController
@RequestMapping(β/testβ)
public class TestController {
@Autowired
private RabbitTemplate rabbitTemplate;
@Value(β${exchange}β)
private String exchange;
@Value(β${routing.request}β)
private String routingKey;
@PostMapping(β/sendβ)
public String send(@RequestBody String xml) {
rabbitTemplate.convertAndSend(exchange, routingKey, xml);
return βSentβ;
}
}
```
β -
# πͺ STEP 9: Local RabbitMQ Setup
### Option 1: Docker (Recommended)
```bash
docker run -d β hostname rabbit \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:3-management
```
π UI:
```
http://localhost:15672
guest / guest
```
β -
# π§ͺ END-TO-END FLOW (FINAL)
```
Controller
β
RabbitMQ (REQUEST.Q)
β
DelphiRequestListener
β
FT-Core Adapter
β
SOAP β Nokia AMS
β
Transform Response
β
RabbitMQ (RESPONSE.Q)
```
β -
# β οΈ PRODUCTION-GRADE ADDITIONS (MANDATORY)
### 1. Retry (Rabbit)
```yaml
spring:
rabbitmq:
listener:
simple:
retry:
enabled: true
max-attempts: 3
```
β -
### 2. Dead Letter Queue
* Add DLQ for failed messages
β -
### 3. Concurrency
```yaml
spring:
rabbitmq:
listener:
simple:
concurrency: 5
max-concurrency: 10
```
β -
### 4. Message Priority (Match FT-Core)
```java
message.getMessageProperties().setPriority(1);
```
β -
# π₯ FINAL ARCHITECTURE ALIGNMENT
| Layer | Responsibility |
| β β β β β β | β β β β β β β β β β β β |
| RabbitMQ | Transport |
| FT-Core | Retry, threads, timeout |
| Adapter | Business logic |
| SOAP | Nokia AMS |
| Transformer | Delphi response |
β -
# π¦ NEXT STEP
If you want full working code:
π Say **βgenerate downloadable zip (RabbitMQ version)β**
I will give:
* β
Full Eclipse project
* β
Integrated FT-Core usage
* β
All classes + configs + test cases
* β
Docker + RabbitMQ setup
* β
Sample Delphi XML + SOAP mock
π



