Sitemap
6 min readMar 24, 2026

--

  • 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: admin
  jms:
listener:
concurrency: 5-10
queue:
request: 38207.REQUEST.Q
response: 38207.RESPONSE.Q
nokia:
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 start

Send 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-ft project
  • βœ… 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

πŸš€

--

--