传输方案未被识别:[nsp]
Transport scheme NOT recognized: [nsp]
我正在尝试连接到 Spring 应用程序中的 SoftwareAg 的通用消息 队列。这是我的 Config
class.
@Configuration
@EnableJms
public class Config {
@Bean
public ActiveMQConnectionFactory receiverActiveMQConnectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
var properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.pcbsys.nirvana.nSpace.NirvanaContextFactory");
properties.setProperty(Context.PROVIDER_URL, "nsp://localhost:9200");
activeMQConnectionFactory.buildFromProperties(properties);
return activeMQConnectionFactory;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
var factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(receiverActiveMQConnectionFactory());
factory.setConcurrency("3-10");
return factory;
}
}
这是我的部分 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
</dependency>
<dependency>
<groupId>com.pcbsys.nirvana</groupId>
<artifactId>nClient</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.pcbsys.nirvana</groupId>
<artifactId>nJMS</artifactId>
<version>1.0</version>
</dependency>
但是,当我尝试连接到队列时出现以下异常:
Caused by: org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not create Transport. Reason: java.io.IOException: Transport scheme NOT recognized: [nsp]
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:311) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:185) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:507) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:584) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:661) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at id.mandiri.co.id.um.Main.lambda$runner[=12=](Main.java:21) ~[classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
... 5 common frames omitted
Caused by: javax.jms.JMSException: Could not create Transport. Reason: java.io.IOException: Transport scheme NOT recognized: [nsp]
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:333) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:346) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:304) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:244) ~[activemq-client-5.15.10.jar:5.15.10]
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
... 9 common frames omitted
Caused by: java.io.IOException: Transport scheme NOT recognized: [nsp]
at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:28) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:185) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.transport.TransportFactory.connect(TransportFactory.java:64) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:331) ~[activemq-client-5.15.10.jar:5.15.10]
... 14 common frames omitted
Caused by: java.io.IOException: Could not find factory class for resource: META-INF/services/org/apache/activemq/transport/nsp
at org.apache.activemq.util.FactoryFinder$StandaloneObjectFactory.loadProperties(FactoryFinder.java:98) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.util.FactoryFinder$StandaloneObjectFactory.create(FactoryFinder.java:60) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.util.FactoryFinder.newInstance(FactoryFinder.java:148) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:182) ~[activemq-client-5.15.10.jar:5.15.10]
... 16 common frames omitted
它说 here:
UM can be used with Spring. In general, the Spring XML that works for ActiveMQ should work for UM with only the connection factory class and URL changed accordingly.
我错过了什么?
编辑:
var properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.pcbsys.nirvana.nSpace.NirvanaContextFactory");
properties.setProperty(Context.PROVIDER_URL, "nsp://localhost:9200");
Context ctx = new InitialContext(properties);
return (ConnectionFactory) ctx.lookup("local_um"); // THIS?
如前所述,您引用的 link 指出:
In general, the Spring XML that works for ActiveMQ should work for UM with only the connection factory class and URL changed accordingly. [emphasis mine]
但是,您还没有更改连接工厂class。 receiverActiveMQConnectionFactory
方法返回一个 ActiveMQConnectionFactory
的实例,这是错误的。此外,该方法使用具有 UM 属性 的 ActiveMQConnectionFactory.buildFromProperties()
,这就是您获得 java.io.IOException
的原因。您不能将这两种实现混合在一起。
可能有一种方法可以简单地实例化 UM 连接工厂实现(类似于 ActiveMQ 连接工厂实现的可能性),但我认为您可能必须查阅 UM 开发人员指南以获取该信息。
也就是说,JNDI 是 获取对管理对象(即连接工厂和目标)的引用的推荐方法,这样您的 JMS 应用程序就可以在提供者之间移植。因此,我建议您只使用它。
终于解决了。这对我有用:
@Configuration
@EnableJms
public class Config {
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
var factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(cachingConnectionFactory());
factory.setConcurrency("3-10");
return factory;
}
@Bean
@Primary
public CachingConnectionFactory cachingConnectionFactory() {
final CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
cachingConnectionFactory.setSessionCacheSize(200);
cachingConnectionFactory.setTargetConnectionFactory((ConnectionFactory) jndiObjectFactoryBean().getObject());
return cachingConnectionFactory;
}
@Bean
public JndiTemplate jndiTemplate() {
final Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.pcbsys.nirvana.nSpace.NirvanaContextFactory");
properties.setProperty(Context.PROVIDER_URL, "nsp://local-dev:9200");
final JndiTemplate jndiTemplate = new JndiTemplate();
jndiTemplate.setEnvironment(properties);
return jndiTemplate;
}
@Bean
public JndiObjectFactoryBean jndiObjectFactoryBean() {
final JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setJndiName("jndi_key");
return jndiObjectFactoryBean;
}
}
希望对大家有所帮助。不要忘记将 nClient.jar
和 nJMS.jar
添加到您的类路径中。您可以在 UM 安装 lib
目录中找到它们。
我正在尝试连接到 Spring 应用程序中的 SoftwareAg 的通用消息 队列。这是我的 Config
class.
@Configuration
@EnableJms
public class Config {
@Bean
public ActiveMQConnectionFactory receiverActiveMQConnectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
var properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.pcbsys.nirvana.nSpace.NirvanaContextFactory");
properties.setProperty(Context.PROVIDER_URL, "nsp://localhost:9200");
activeMQConnectionFactory.buildFromProperties(properties);
return activeMQConnectionFactory;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
var factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(receiverActiveMQConnectionFactory());
factory.setConcurrency("3-10");
return factory;
}
}
这是我的部分 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
</dependency>
<dependency>
<groupId>com.pcbsys.nirvana</groupId>
<artifactId>nClient</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.pcbsys.nirvana</groupId>
<artifactId>nJMS</artifactId>
<version>1.0</version>
</dependency>
但是,当我尝试连接到队列时出现以下异常:
Caused by: org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not create Transport. Reason: java.io.IOException: Transport scheme NOT recognized: [nsp]
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:311) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:185) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:507) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:584) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:661) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at id.mandiri.co.id.um.Main.lambda$runner[=12=](Main.java:21) ~[classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
... 5 common frames omitted
Caused by: javax.jms.JMSException: Could not create Transport. Reason: java.io.IOException: Transport scheme NOT recognized: [nsp]
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:333) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:346) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:304) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:244) ~[activemq-client-5.15.10.jar:5.15.10]
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494) ~[spring-jms-5.2.1.RELEASE.jar:5.2.1.RELEASE]
... 9 common frames omitted
Caused by: java.io.IOException: Transport scheme NOT recognized: [nsp]
at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:28) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:185) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.transport.TransportFactory.connect(TransportFactory.java:64) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:331) ~[activemq-client-5.15.10.jar:5.15.10]
... 14 common frames omitted
Caused by: java.io.IOException: Could not find factory class for resource: META-INF/services/org/apache/activemq/transport/nsp
at org.apache.activemq.util.FactoryFinder$StandaloneObjectFactory.loadProperties(FactoryFinder.java:98) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.util.FactoryFinder$StandaloneObjectFactory.create(FactoryFinder.java:60) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.util.FactoryFinder.newInstance(FactoryFinder.java:148) ~[activemq-client-5.15.10.jar:5.15.10]
at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:182) ~[activemq-client-5.15.10.jar:5.15.10]
... 16 common frames omitted
它说 here:
UM can be used with Spring. In general, the Spring XML that works for ActiveMQ should work for UM with only the connection factory class and URL changed accordingly.
我错过了什么?
编辑:
var properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.pcbsys.nirvana.nSpace.NirvanaContextFactory");
properties.setProperty(Context.PROVIDER_URL, "nsp://localhost:9200");
Context ctx = new InitialContext(properties);
return (ConnectionFactory) ctx.lookup("local_um"); // THIS?
如前所述,您引用的 link 指出:
In general, the Spring XML that works for ActiveMQ should work for UM with only the connection factory class and URL changed accordingly. [emphasis mine]
但是,您还没有更改连接工厂class。 receiverActiveMQConnectionFactory
方法返回一个 ActiveMQConnectionFactory
的实例,这是错误的。此外,该方法使用具有 UM 属性 的 ActiveMQConnectionFactory.buildFromProperties()
,这就是您获得 java.io.IOException
的原因。您不能将这两种实现混合在一起。
可能有一种方法可以简单地实例化 UM 连接工厂实现(类似于 ActiveMQ 连接工厂实现的可能性),但我认为您可能必须查阅 UM 开发人员指南以获取该信息。
也就是说,JNDI 是 获取对管理对象(即连接工厂和目标)的引用的推荐方法,这样您的 JMS 应用程序就可以在提供者之间移植。因此,我建议您只使用它。
终于解决了。这对我有用:
@Configuration
@EnableJms
public class Config {
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
var factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(cachingConnectionFactory());
factory.setConcurrency("3-10");
return factory;
}
@Bean
@Primary
public CachingConnectionFactory cachingConnectionFactory() {
final CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
cachingConnectionFactory.setSessionCacheSize(200);
cachingConnectionFactory.setTargetConnectionFactory((ConnectionFactory) jndiObjectFactoryBean().getObject());
return cachingConnectionFactory;
}
@Bean
public JndiTemplate jndiTemplate() {
final Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.pcbsys.nirvana.nSpace.NirvanaContextFactory");
properties.setProperty(Context.PROVIDER_URL, "nsp://local-dev:9200");
final JndiTemplate jndiTemplate = new JndiTemplate();
jndiTemplate.setEnvironment(properties);
return jndiTemplate;
}
@Bean
public JndiObjectFactoryBean jndiObjectFactoryBean() {
final JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setJndiName("jndi_key");
return jndiObjectFactoryBean;
}
}
希望对大家有所帮助。不要忘记将 nClient.jar
和 nJMS.jar
添加到您的类路径中。您可以在 UM 安装 lib
目录中找到它们。