SolConnectionFactory stuck on javax
Hi,
I'm trying to migrate my project from Java 11 to Java 17 while also updating to Spring Boot 3.
The depencies I use for this solace-jms-spring-boot starter and autoconfigure, both on v 4.3.0. My problem is that the DefaultJmsListenerContainerFactory requires a ConnectionFactory that extends Jakarta ConnectionFactory, but the SolConnectionFactory is javax. I get the SolConnectionFactory from the dependency "com.solacesystems:sol-jms:10.18.0" which seems to be the latest but still uses javax.
@Configuration @EnableJms public class JmsConfiguration { @Bean public DefaultJmsListenerContainerFactory jmsConnectionFactory( @Value("${spring.jms.listener.auto-startup:true}") boolean autoStart, SolConnectionFactory connectionFactory) { connectionFactory.setClientID(CLIENT_ID); var factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory);//<-- Problem is here factory.setAutoStartup(autoStart); factory.setConcurrency(CONCURRENCY_LIMIT); return factory; } }
Is there a new version for SolConnectionFactory that uses jakarta or any workaround to get this working?
Answers
-
Hi @rothek,
We are working on a permanent solution, but you can find our temporary work around here: https://github.com/SolaceSamples/solace-samples-spring/tree/sample-jms-downgrade. Please read the disclaimer.
Hope that helps!
0 -
Hi Team,
i am new to solace system, as part of project requirement i want to migrate from javax.jms.ConnectionFactory to jakarta.jms.ConnectionFactory it means Springboot 2 to Springboot3. while searching in community forums found this url suits to me.
could anyone please help me how to run the above git project to test locally.
Here i require two things help.
- while running application getting below error
Parameter 0 of method cFactory in com.example.demo.ConsumerConfiguration required a bean of type 'jakarta.jms.ConnectionFactory' that could not be found.
package com.example.demo;
import java.util.Iterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Service
static class MessageProducer implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(MessageProducer.class);
@Autowired
private JmsTemplate jmsTemplate;
// Examples of other options to get JmsTemplate in a cloud environment with possibly multiple providers available:
// Use this to access JmsTemplate of the first service found or look up a specific one by
// SolaceServiceCredentials
// @Autowired private SpringSolJmsConnectionFactoryCloudFactory springSolJmsConnectionFactoryCloudFactory;
// @Autowired private SolaceServiceCredentials solaceServiceCredentials;
// For backwards compatibility:
// @Autowired(required=false) private SolaceMessagingInfo solaceMessagingInfo;
@Value("${solace.jms.demoQueueName}")
private String queueName;
public void run(String... strings) throws Exception {
String msg = "Hello World";
logger.info("============= Sending " + msg);
this.jmsTemplate.convertAndSend(queueName, msg);
logger.info("Producer produces the message");
}
}
@Component
static class MessageHandler {
private static final Logger logger = LoggerFactory.getLogger(MessageHandler.class);
// Retrieve the name of the queue from the application.properties file
@JmsListener(destination = "${solace.jms.demoQueueName}", containerFactory = "cFactory", concurrency = "2")
public void processMsg(Message<?> msg) {
StringBuffer msgAsStr = new StringBuffer("============= Received \nHeaders:");
MessageHeaders hdrs = msg.getHeaders();
msgAsStr.append("\nUUID: "+hdrs.getId());
msgAsStr.append("\nTimestamp: "+hdrs.getTimestamp());
Iterator<String> keyIter = hdrs.keySet().iterator();
while (keyIter.hasNext()) {
String key = keyIter.next();
msgAsStr.append("\n"+key+": "+hdrs.get(key));
}
msgAsStr.append("\nPayload: "+msg.getPayload());
logger.info(msgAsStr.toString());
}
}}
package com.example.demo;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;import jakarta.jms.ConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.ErrorHandler;@EnableJms
@Configuration
public class ConsumerConfiguration {private static final Logger logger = LoggerFactory.getLogger(ConsumerConfiguration.class);
// Example configuration of the ConnectionFactory: we instantiate it here ourselves and set an error handler
@Bean
public DefaultJmsListenerContainerFactory cFactory(ConnectionFactory connectionFactory, DemoErrorHandler errorHandler) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(errorHandler);
return factory;
}
@Service
public class DemoErrorHandler implements ErrorHandler{
public void handleError(Throwable t) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
t.printStackTrace(ps);
try {
String output = os.toString("UTF8");
logger.error("============= Error processing message: " + t.getMessage()+"\n"+output);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}
2. Using this below properties in application.properties but i could not able to test publisher and consumer messages.
solace.jms.host=tcp://192.168.133.64:55555
solace.jms.msgVpn=default
solace.jms.clientUsername=default
solace.jms.clientPassword=defaultsolace.jms.apiProperties.Solace_JMS_DynamicDurables=true
solace.jms.demoQueueName=tutorial/queue
logging.level.com.solacesystems=INFO
0