我有一个通用的生产者程序,它查找jndi资源以连接到jms代理并发送消息。
我正在为集成测试设置嵌入式hornetq。这是我用来启动服务器的服务器代码(工作正常)
服务器
Configuration configuration = new ConfigurationImpl();
configuration.setPersistenceEnabled(false);
configuration.setSecurityEnabled(false);
Map<String, Object> map = new HashMap<String, Object>();
map.put("host", "localhost");
map.put("port", 5445);
configuration.getAcceptorConfigurations()
.add(new TransportConfiguration(NettyAcceptorFactory.class.getName(), map));
TransportConfiguration connectorConfig = new TransportConfiguration(NettyConnectorFactory.class.getName());
configuration.getConnectorConfigurations().put("connector", connectorConfig);
// Step 2. Create the JMS configuration
JMSConfiguration jmsConfig = new JMSConfigurationImpl();
// Step 3. Configure the JMS ConnectionFactory
ArrayList<String> connectorNames = new ArrayList<String>();
connectorNames.add("connector");
ConnectionFactoryConfiguration cfConfig = new ConnectionFactoryConfigurationImpl("ConnectionFactory", false, connectorNames, "/ConnectionFactory");
jmsConfig.getConnectionFactoryConfigurations().add(cfConfig);
// Step 4. Configure the JMS Queue
JMSQueueConfiguration queueConfig = new JMSQueueConfigurationImpl("exampleQueue", null, false, "/queue/exampleQueue");
jmsConfig.getQueueConfigurations().add(queueConfig);
// Step 5. Start the JMS Server using the HornetQ core server and the JMS configuration
EmbeddedJMS jmsServer = new EmbeddedJMS();
jmsServer.setConfiguration(configuration);
jmsServer.setJmsConfiguration(jmsConfig);
jmsServer.start();
System.out.println("Started Embedded JMS Server");
生产者
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
Context context = new InitialContext(env);
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory");
Destination destination = (Destination) context.lookup("/queue/exampleQueue");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Producer producer = session.createProducer(destination);
connection.start();
TextMessage message = session.createTextMessage("Hello sent at " + new Date());
System.out.println("Sending message: " + message.getText());
producer.send(message);
如何为服务器注册JNDI资源,以便生产者可以使用这些属性访问嵌入式服务器。
答案 0 :(得分:2)
初看起来,您似乎使用ConnectionFactoryConfigurationImpl
作为绑定在"/cf"
创建了绑定,但在您的生产者代码中,您查找了"ConnectionFactory"
。
HornetQ发布了一个简单的嵌入式示例,请考虑将其检出https://github.com/hornetq/hornetq/tree/2.3.x/examples/jms/embedded-simple
答案 1 :(得分:1)
我使用HornetQBootstrapServer
启动hornetQHornetQBootstrapServer hornetQ = new HornetQBootstrapServer(hornetq-beans.xml)
hornetQ.run();
.
.
.
//to stop
hornetQ.shutDown();
我在类路径中保留了hornetq-beans.xml,hornetq-configuration.xml和hornetq-jms.xml。
hornetq-beans.xml的示例内容
<bean name="Naming" class="org.jnp.server.NamingBeanImpl"/>
<!-- JNDI server. Disable this if you don't want JNDI -->
<bean name="JNDIServer" class="org.jnp.server.Main">
<property name="namingInfo">
<inject bean="Naming"/>
</property>
<property name="port">1099</property>
<property name="bindAddress">localhost</property>
<property name="rmiPort">1098</property>
<property name="rmiBindAddress">localhost</property>
</bean>
<!-- MBean server -->
<bean name="MBeanServer" class="javax.management.MBeanServer">
<constructor factoryClass="java.lang.management.ManagementFactory"
factoryMethod="getPlatformMBeanServer"/>
</bean>
.
.
.
这是我为嵌入式HornetQ启用JNDI的方式。