Требуется wso2mb для обмена сообщениями в приложении весенней загрузки. Как установить соединение при весенней загрузке?
Требуется, чтобы слушатель прослушивал очередь JMS и обрабатывал данные соответствующим образом. Есть ли способ сделать это в приложении весенней загрузки. Пробный пример на основе Java, приведенный в https://docs.wso2.com/display/MB300/Sending+and+Receiving+Messages+Using+Queues, который работает отлично.
JARS включены:
andes-client-3.2.19.jar
geronimo-jms_1.1_spec-1.1.0.wso2v1.jar
org.wso2.securevault-1.0.0-wso2v2.jar
группа компиляции: 'org.springframework', имя: 'spring-jms', версия: '4.1.0.RELEASE'
springBootVersion = '2.0.4.RELEASE'
Application.java
@EnableJms
@SpringBootApplication
@ServletComponentScan
public class Application extends SpringBootServletInitializer {
public static final String QPID_ICF = "org.wso2.andes.jndi.PropertiesFileInitialContextFactory";
private static final String CF_NAME_PREFIX = "connectionfactory.";
private static final String CF_NAME = "qpidConnectionfactory";
String userName = "admin";
String password = "admin";
private static String CARBON_CLIENT_ID = "carbon";
private static String CARBON_VIRTUAL_HOST_NAME = "carbon";
private static String CARBON_DEFAULT_HOSTNAME = "localhost";
private static String CARBON_DEFAULT_PORT = "5673";
String queueName = "testQueue";
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
context.getBean(JmsTemplate.class);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
@Bean
public JmsListenerContainerFactory<?> myFactory
(QueueConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer, QueueConnection connection) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
@Bean
public QueueConnection myConnection
(QueueConnectionFactory factory) throws JMSException {
QueueConnection queueConnection = factory.createQueueConnection();
queueConnection.start();
return queueConnection;
}
@Bean
public QueueConnectionFactory queueConnectionFactory() throws NamingException {
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, QPID_ICF);
properties.put(CF_NAME_PREFIX + CF_NAME, getTCPConnectionURL(userName, password));
properties.put("queue."+ queueName,queueName);
InitialContext ctx = new InitialContext(properties);
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup("qpidConnectionfactory");
return connFactory;
}
private String getTCPConnectionURL(String username, String password) {
// amqp://{username}:{password}@carbon/carbon?brokerlist='tcp://{hostname}:{port}'
return new StringBuffer()
.append("amqp://").append(username).append(":").append(password)
.append("@").append(CARBON_CLIENT_ID)
.append("/").append(CARBON_VIRTUAL_HOST_NAME)
.append("?brokerlist='tcp://").append(CARBON_DEFAULT_HOSTNAME).append(":").append(CARBON_DEFAULT_PORT).append("'")
.toString();
}
@Bean
public MappingJackson2MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
}
Фактический результат:
Исключительная ситуация во время запуска приложения весенней загрузки:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myFactory' defined in com.ext.gr.Application: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException:
Failed to instantiate [org.springframework.jms.config.JmsListenerContainerFactory]: Factory method 'myFactory' threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.jms.config.DefaultJmsListenerContainerFactory.setAutoStartup