Weblogic12c 设置 + Spring JMSTemplate +Tibco EMS
Weblogic12c setup + Spring JMSTemplate +Tibco EMS
我是 JMS/TIBCO EMS 和 weblogic 设置的新手。
我可以post使用旧方式和新方式将消息发送到TIBCO EMS。我想在 Weblogic 12c 中设置配置并删除用户名、密码、服务器 URL 和队列名称(硬编码值)。
下面是旧方法的代码;我能够向队列发送消息。
private void tibcoEMSQueueSender() throws NamingException{
try {
ConnectionFactory myConnFactory;
Queue queue;
@SuppressWarnings("rawtypes")
Hashtable env = getEnvProps();
Context ctx = new InitialContext(env);
myConnFactory = (javax.jms.ConnectionFactory) ctx.lookup(Constants.JNDI_CONNECTION_FACTORY);
queue = (javax.jms.Queue) ctx.lookup(Constants.TIBCO_QUEUE_NAME);
Connection connection = myConnFactory.createConnection(Constants.USER_NAME, Constants.PASSWORD);
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
TextMessage textMessage = session.createTextMessage();
textMessage.setText("Hello EMS");
messageProducer.send(textMessage);
connection.start();
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
System.exit(0);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private Hashtable getEnvProps(){
Hashtable env = new Hashtable();
env.put("java.naming.security.credentials", Constants.PASSWORD);
env.put("java.naming.factory.initial","com.tibco.tibjms.naming.TibjmsInitialContextFactory");
env.put("java.naming.security.principal", Constants.USER_NAME);
env.put("java.naming.provider.url", Constants.SERVER_URL);
return env;
}
使用 Spring JMS 模板的新方法。
Spring版本:4.1.6
我用最新的 Spring 和 Hibernate 创建了一个 XML 免费项目。
所以,我使用@EnableJms 进行配置。
在JMSConfiguration.java
@Configuration
@EnableJms
@ComponentScan({ "com.xxx.xxx" })
@PropertySource("classpath:local_application.properties")
public class JMSConfiguration {
@Bean
public JndiTemplate jndiTemplate() {
JndiTemplate jndiTemplate = new JndiTemplate();
Properties jndiProps = new Properties();
jndiProps.setProperty("java.naming.factory.initial", "com.tibco.tibjms.naming.TibjmsInitialContextFactory");
jndiProps.setProperty("java.naming.provider.url",Constants.SERVER_URL);
jndiProps.setProperty("java.naming.security.principal",Constants.USER_NAME);
jndiProps.setProperty("java.naming.security.credentials",Constants.PASSWORD);
jndiTemplate.setEnvironment(jndiProps);
return jndiTemplate;
}
@Bean
public UserCredentialsConnectionFactoryAdapter authenticate() throws JMSException, NamingException {
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setUsername(Constants.USER_NAME);
userCredentialsConnectionFactoryAdapter.setPassword(Constants.PASSWORD);
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(jmsConnectionFactory());
return userCredentialsConnectionFactoryAdapter;
}
public ConnectionFactory jmsConnectionFactory() throws NamingException, JMSException{
ConnectionFactory connectionFactory;
Context ctx = null;
Hashtable env = new Hashtable();
env.put("java.naming.security.credentials", Constants.PASSWORD);
env.put("java.naming.factory.initial","com.tibco.tibjms.naming.TibjmsInitialContextFactory");
env.put("java.naming.security.principal", Constants.USER_NAME);
env.put("java.naming.provider.url", Constants.SERVER_URL);
ctx = new InitialContext(env);
connectionFactory = (javax.jms.ConnectionFactory) ctx.lookup(Constants.JNDI_CONNECTION_FACTORY);
connectionFactory.createConnection(Constants.USER_NAME, Constants.PASSWORD);
return connectionFactory;
}
@Bean
public JndiObjectFactoryBean jmsQueueName() {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setJndiName(Constants.TIBCO_QUEUE_NAME);
return jndiObjectFactoryBean;
}
@Bean(name="jmsTemplate")
public JmsTemplate jmsTemplate() throws JMSException, NamingException {
JmsTemplate jmsTemplate = new JmsTemplate(authenticate());
jmsTemplate.setSessionTransacted(false);
jmsTemplate.setReceiveTimeout(5000);
jmsTemplate.setDefaultDestination((Destination) jmsQueueName().getObject());
return jmsTemplate;
}
@Bean
public MessageSender queueMessageSender() {
return new MessageSender();
}
}
我正在控制器中自动装配 MessageSender class 并能够将消息发送到 Tibco 队列。在上面的 java 代码中,我想消除所有硬编码值并将它们写入 weblogic12c 服务器配置(例如使用 tibco url 创建一个外部服务器,创建一个 JNDI 和一个队列。
上面代码的问题:
- 我必须在 jmsConnectionFactory() 中创建一个连接。这是必要的吗?我还应该打开和关闭 connection/session 吗?通常,当这个(设置 JNDI、队列和连接工厂)部分被移动到 weblogic 配置时,我不需要创建连接;正确吗?
- 这是标准做法吗?
我在想,如果我用 tibco tcp:://xxxxxxxxxxx:7222、用户名和密码正确设置了外部服务器,我应该能够与 tibco 服务器和 post 建立通信通道消息到队列。我猜连接工厂名称应该是匹配的。
你能帮我找一篇这方面的文章或者分享一下你的经验吗?请。
我创建了一个外部服务器来避免代码中的硬编码密码。
Here 是我在 WLS 中创建外部服务器所遵循的指南。
创建模块。
设置远程连接工厂。
设置远程队列。
设置初始上下文并传递凭据和主体。
使用 Spring JMS 模板中的本地名称建立连接并发送消息。
这是针对 TCP 的。
我是 JMS/TIBCO EMS 和 weblogic 设置的新手。
我可以post使用旧方式和新方式将消息发送到TIBCO EMS。我想在 Weblogic 12c 中设置配置并删除用户名、密码、服务器 URL 和队列名称(硬编码值)。
下面是旧方法的代码;我能够向队列发送消息。
private void tibcoEMSQueueSender() throws NamingException{
try {
ConnectionFactory myConnFactory;
Queue queue;
@SuppressWarnings("rawtypes")
Hashtable env = getEnvProps();
Context ctx = new InitialContext(env);
myConnFactory = (javax.jms.ConnectionFactory) ctx.lookup(Constants.JNDI_CONNECTION_FACTORY);
queue = (javax.jms.Queue) ctx.lookup(Constants.TIBCO_QUEUE_NAME);
Connection connection = myConnFactory.createConnection(Constants.USER_NAME, Constants.PASSWORD);
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
TextMessage textMessage = session.createTextMessage();
textMessage.setText("Hello EMS");
messageProducer.send(textMessage);
connection.start();
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
System.exit(0);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private Hashtable getEnvProps(){
Hashtable env = new Hashtable();
env.put("java.naming.security.credentials", Constants.PASSWORD);
env.put("java.naming.factory.initial","com.tibco.tibjms.naming.TibjmsInitialContextFactory");
env.put("java.naming.security.principal", Constants.USER_NAME);
env.put("java.naming.provider.url", Constants.SERVER_URL);
return env;
}
使用 Spring JMS 模板的新方法。 Spring版本:4.1.6 我用最新的 Spring 和 Hibernate 创建了一个 XML 免费项目。 所以,我使用@EnableJms 进行配置。
在JMSConfiguration.java
@Configuration
@EnableJms
@ComponentScan({ "com.xxx.xxx" })
@PropertySource("classpath:local_application.properties")
public class JMSConfiguration {
@Bean
public JndiTemplate jndiTemplate() {
JndiTemplate jndiTemplate = new JndiTemplate();
Properties jndiProps = new Properties();
jndiProps.setProperty("java.naming.factory.initial", "com.tibco.tibjms.naming.TibjmsInitialContextFactory");
jndiProps.setProperty("java.naming.provider.url",Constants.SERVER_URL);
jndiProps.setProperty("java.naming.security.principal",Constants.USER_NAME);
jndiProps.setProperty("java.naming.security.credentials",Constants.PASSWORD);
jndiTemplate.setEnvironment(jndiProps);
return jndiTemplate;
}
@Bean
public UserCredentialsConnectionFactoryAdapter authenticate() throws JMSException, NamingException {
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setUsername(Constants.USER_NAME);
userCredentialsConnectionFactoryAdapter.setPassword(Constants.PASSWORD);
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(jmsConnectionFactory());
return userCredentialsConnectionFactoryAdapter;
}
public ConnectionFactory jmsConnectionFactory() throws NamingException, JMSException{
ConnectionFactory connectionFactory;
Context ctx = null;
Hashtable env = new Hashtable();
env.put("java.naming.security.credentials", Constants.PASSWORD);
env.put("java.naming.factory.initial","com.tibco.tibjms.naming.TibjmsInitialContextFactory");
env.put("java.naming.security.principal", Constants.USER_NAME);
env.put("java.naming.provider.url", Constants.SERVER_URL);
ctx = new InitialContext(env);
connectionFactory = (javax.jms.ConnectionFactory) ctx.lookup(Constants.JNDI_CONNECTION_FACTORY);
connectionFactory.createConnection(Constants.USER_NAME, Constants.PASSWORD);
return connectionFactory;
}
@Bean
public JndiObjectFactoryBean jmsQueueName() {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setJndiName(Constants.TIBCO_QUEUE_NAME);
return jndiObjectFactoryBean;
}
@Bean(name="jmsTemplate")
public JmsTemplate jmsTemplate() throws JMSException, NamingException {
JmsTemplate jmsTemplate = new JmsTemplate(authenticate());
jmsTemplate.setSessionTransacted(false);
jmsTemplate.setReceiveTimeout(5000);
jmsTemplate.setDefaultDestination((Destination) jmsQueueName().getObject());
return jmsTemplate;
}
@Bean
public MessageSender queueMessageSender() {
return new MessageSender();
}
}
我正在控制器中自动装配 MessageSender class 并能够将消息发送到 Tibco 队列。在上面的 java 代码中,我想消除所有硬编码值并将它们写入 weblogic12c 服务器配置(例如使用 tibco url 创建一个外部服务器,创建一个 JNDI 和一个队列。
上面代码的问题:
- 我必须在 jmsConnectionFactory() 中创建一个连接。这是必要的吗?我还应该打开和关闭 connection/session 吗?通常,当这个(设置 JNDI、队列和连接工厂)部分被移动到 weblogic 配置时,我不需要创建连接;正确吗?
- 这是标准做法吗?
我在想,如果我用 tibco tcp:://xxxxxxxxxxx:7222、用户名和密码正确设置了外部服务器,我应该能够与 tibco 服务器和 post 建立通信通道消息到队列。我猜连接工厂名称应该是匹配的。
你能帮我找一篇这方面的文章或者分享一下你的经验吗?请。
我创建了一个外部服务器来避免代码中的硬编码密码。
Here 是我在 WLS 中创建外部服务器所遵循的指南。
创建模块。
设置远程连接工厂。 设置远程队列。 设置初始上下文并传递凭据和主体。
使用 Spring JMS 模板中的本地名称建立连接并发送消息。
这是针对 TCP 的。