Hi Eddie, Try this
env.put(Context.PROVIDER_URL, "vm://localhost"); Joe Get a free ActiveMQ user guide at www.ttmsolutions.com EddieK wrote: > > I am migrating an application away from JBoss JMS to ActiveMQ, but I am > not having much luck. The application, migrated away from JBoss, will run > under Tomcat 6 as a webapp. I have everything functioning except JMS. > > So far I have done the following: > > Copy the Web App whole from where it lived under JBoss's embedded Tomcat > and move it under a standalone Tomcat webapp directory. (Plus make > necessary changes for things to work, add JAR files previously pulled from > JBoss but obviously not including JBoss JMS JAR files.) > > Copy activemq-all-5.1.0.jar plus geronimo-jms_1.1_spec-1.1.1.jar plus > geronimo-jta_1.0.1B_spec-1.0.1.jar plus > geronimo-j2ee-management_1.0_spec-1.0.jar plus commons logging into my web > applications WEB-INF/lib directory. > > Create the following jndi.properties in my web apps WEB-INF/classes > directory: > > java.naming.factory.initial = > org.apache.activemq.jndi.ActiveMQInitialContextFactory > java.naming.provider.url = vm://localhost > queue.MyRequest = Test.MyRequest > topic.MyMessage = Test.MyMessage > > And I know this jndi.properties file is being found and parsed because if > I deliberately misname the queue or topic, I get a different and earlier > exception. > > My goal is to run the JMS broker within my webapp, thus avoiding an > unnecessary extra process and service to manage. I am obviously missing > something, but so far in my searching I cannot find what else I need to > configure to get this to work. The application in question does not use > Spring or XBeans, so I would prefer to avoid these configuration methods. > Unfortunately, most examples either use the standalone broker or Spring or > XBeans. > > I try to initialize JMS with the following class, instantiated via "new > TestJMSSetup()" from my startup servlet, and I get the Exception mentioned > in the subject above. The code below is simplified from code that works > with JBoss JMS, at least as of JBoss 3.2.7. The simplified code and the > full code fail with the same exception at the same line -- > qcf.createQueueConnection(USER_NAME,PASSWORD). Note that if I instead > call qcf.createQueueConnection() I get the exact same exception. > > Can anyone help identify what is missing here? Or point me to a web page > or other documentation that spells out how to get an ActiveMQ broker fully > running within Tomcat, making use of the ActiveMQ JNDI for lookup? > > Thanks! > > Eddie > > My code is below, and the exception I get is below that. > > package test; > > import java.util.Properties; > import javax.jms.*; > import javax.naming.*; > import org.apache.log4j.Logger; > > public class TestJMSSetup { > protected static final Logger LOG = > Logger.getLogger(TestJMSSetup.class); > > public static final String NAMING_CONTEXT_FACTORY = > "org.apache.activemq.jndi.ActiveMQInitialContextFactory"; > public static final String CONNECTION_FACTORY = "ConnectionFactory"; > public static final String JMS_QUEUE_NAME = "MyRequest"; > public static final String JMS_TOPIC_NAME = "MyMessage"; > public static final int NEVER_EXPIRE = 0; > public static final String USER_NAME = "testuser"; > public static final String PASSWORD = "testpassword"; > public static final String MESSAGE_LENGTH = "MsgLen"; > > protected final InitialContext jndi; > private final JMSTopicServer jmsTopicServer; > private final JMSQueueServer jmsQueueServer; > > public TestJMSSetup() throws Exception { > try { > // Initialize JNDI > LOG.info("setting up JNDI...."); > Properties env = new Properties(); > env.put(Context.INITIAL_CONTEXT_FACTORY, NAMING_CONTEXT_FACTORY); > env.put(Context.PROVIDER_URL, "localhost"); > jndi = new InitialContext(env); > > // Initialize, then start JMS > LOG.info("initializing JMS...."); > jmsTopicServer = new JMSTopicServer(); > jmsQueueServer = new JMSQueueServer(); > > LOG.info("starting connections..."); > jmsQueueServer.start(); > jmsTopicServer.start(); > LOG.info("started connections"); > } catch (Exception e) { > LOG.error("TestJMSSetup exception", e); > throw e; > } > } > > /** > * Handle incoming messages (from our client). > * @param msg The message to handle > */ > public void handleMessage(final String msg) { > try { > jmsTopicServer.publishMessage(msg); > } catch (Exception e) { > LOG.error("handleMessage() Exception", e); > } > } > > /** > * This inner class handles all JMS Topic communication. After we > receive a > * message from our client, the topic server is used to publish this > * message to all receivers. > */ > private class JMSTopicServer { > private final TopicConnectionFactory tcf; > private final Topic jmsTopic; > > private volatile TopicConnection tConnection = null; > private volatile TopicSession tSession = null; > private volatile TopicPublisher publisher = null; > > public JMSTopicServer() throws Exception { > tcf = (TopicConnectionFactory)jndi.lookup(CONNECTION_FACTORY); > jmsTopic = (Topic)jndi.lookup(JMS_TOPIC_NAME); > } > > protected void start() throws JMSException { > LOG.info("creating Topic connection ....."); > tConnection = tcf.createTopicConnection(USER_NAME, PASSWORD); > tSession = tConnection.createTopicSession(false, > Session.AUTO_ACKNOWLEDGE); > publisher = tSession.createPublisher(jmsTopic); > publisher.setTimeToLive(NEVER_EXPIRE); > publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT); > > LOG.info("starting Topic connection ....."); > tConnection.start(); > > LOG.info("started Topic connection"); > } > > protected void stop() { > try { > tConnection.stop(); > tSession.close(); > tConnection.close(); > } catch (Exception e) { > LOG.error("stop() caught exception", e); > } > } > > public void publishMessage(final String message) throws JMSException { > ObjectMessage bytesMsg = tSession.createObjectMessage(); > bytesMsg.setObject(message); > publisher.publish(bytesMsg); > } > } > > /** > * This inner class handles all JMS Queue communication. We receive > requests > * intended for the our client on this Queue and forward them to our > client > * for processing. > */ > private class JMSQueueServer { > private final QueueConnectionFactory qcf; > private final Queue jmsQueue; > > private volatile QueueConnection qConnection = null; > private volatile QueueSession qSession = null; > private volatile QueueReceiver qReceiver = null; > > public JMSQueueServer() throws Exception { > qcf = (QueueConnectionFactory)jndi.lookup(CONNECTION_FACTORY); > jmsQueue = (Queue)jndi.lookup(JMS_QUEUE_NAME); > } > > public void start() throws JMSException { > LOG.info("creating Queue connection ....."); > // NEXT LINE THROWS THE EXCEPTION ***** > qConnection = qcf.createQueueConnection(USER_NAME,PASSWORD); > qSession = > qConnection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE); > qReceiver = qSession.createReceiver(jmsQueue); > qReceiver.setMessageListener(new JMSQueueListener()); > > LOG.info("starting Queue connection ....."); > qConnection.start(); > > LOG.info("started Queue connection"); > } > > public void stop() { > try { > qConnection.stop(); > qReceiver.close(); > qSession.close(); > qConnection.close(); > } catch (Exception e) { > LOG.error("Exception caught in stop()", e); > } > } > > public class JMSQueueListener implements MessageListener { > public void onMessage(final Message msg) { > try { > BytesMessage bytesMsg = (BytesMessage)msg; > byte[] queueRequest = new > byte[msg.getIntProperty(MESSAGE_LENGTH)]; > bytesMsg.readBytes(queueRequest); > > String message = new String(queueRequest); > LOG.info("Take action with the message we received: " + > message); > // CODE WOULD GO HERE > } catch (Exception e) { > LOG.error("onMessage() encountered exception: " + > e.getMessage(), e); > } > } > } > } > } > > I get the log messages: > > 2008-06-18 17:50:13,524 -0500 INFO [TestJMSSetup] - initializing JMS.... > 2008-06-18 17:50:13,524 -0500 INFO [TestJMSSetup] - starting > connections... > 2008-06-18 17:50:13,524 -0500 INFO [TestJMSSetup] - creating Queue > connection ..... > 2008-06-18 17:50:13,540 -0500 ERROR [TestJMSSetup] - TestJMSSetup > exception > javax.jms.JMSException: Could not create Transport. Reason: > java.io.IOException: Transport not scheme specified: [localhost] > at > org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:35) > at > org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:237) > at > org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:250) > at > org.apache.activemq.ActiveMQConnectionFactory.createQueueConnection(ActiveMQConnectionFactory.java:192) > at test.TestJMSSetup$JMSQueueServer.start(TestJMSSetup.java:148) > at test.TestJMSSetup.<init>(TestJMSSetup.java:58) > at test.StartupServlet.init(StartupServlet.java:138) > > -- View this message in context: http://www.nabble.com/%22Transport-not-scheme-specified%22-exception-trying-to-initialize-JMS-tp17994225p18009130.html Sent from the ActiveMQ - User mailing list archive at Nabble.com.