我正在尝试构建一个基本的生产者消费者应用程序。我有三个消息处理队列,可以有多个生产者和使用者。我在这里面临的基本问题是,我什么时候应该打电话给
connection.start()
我正在使用的javax.jms.QueueConnection的方法。在线列出的所有示例(例如:- https://github.com/hornetq/hornetq/blob/master/examples/jms/jmx/src/main/java/org/hornetq/jms/example/JMXExample.java)表明在目标上生成消息后,并且在我们启动使用者之后,我们应该启动连接。即connection.start()
通常是最后要做的事情。我可以在创建连接时启动连接吗?例如,像这样的东西
Properties jndiProps = new Properties();
jndiProps.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
jndiProps.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
jndiProps.put("java.naming.provider.url", "localhost:1099");
context = new InitialContext(jndiProps);
QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("/ConnectionFactory");
connection = factory.createQueueConnection();
connection.start();
您是否正在使用异步消费者,即您有onMessage
方法来接收消息吗?
在创建使用者后调用connection.start
的原因是connection.start
调用告诉消息传递提供程序开始消息传递。应用程序必须准备好接收消息。如果使用消息侦听器(onMessage
方法),则建议先创建使用者,设置消息侦听器,然后调用connection.start
以便应用程序准备好接收消息。
否则,可以调用connection.start
然后调用consumer.receive
方法来同步接收消息。
请注意,如果您的应用程序正在生成消息并且没有使用者,则无需调用 connection.start
。