Java 尝试使用PooledConnectionFactory时出现NullPointerException 我一直在做什么
我一直在使用常规ActiveMQConnectionFactory创建到队列的连接并推送消息。ActiveMQ连接通过SSL连接,需要用户名和密码。只要我指定用户名和密码,这对我来说就非常有效 我想做什么 最近我改变了我的设计,并决定使用为我自己的线程池创建连接和会话。我希望能够在我的池中重用连接和会话,以便我可以调整应用程序上的负载,并根据需要扩展连接和会话 我失败了什么 除了池的初始创建之外,我的流的其余部分与以前完全相同。但是,现在当我尝试连接时,我得到一个NullPointerException和此回溯跟踪:Java 尝试使用PooledConnectionFactory时出现NullPointerException 我一直在做什么,java,nullpointerexception,activemq,Java,Nullpointerexception,Activemq,我一直在使用常规ActiveMQConnectionFactory创建到队列的连接并推送消息。ActiveMQ连接通过SSL连接,需要用户名和密码。只要我指定用户名和密码,这对我来说就非常有效 我想做什么 最近我改变了我的设计,并决定使用为我自己的线程池创建连接和会话。我希望能够在我的池中重用连接和会话,以便我可以调整应用程序上的负载,并根据需要扩展连接和会话 我失败了什么 除了池的初始创建之外,我的流的其余部分与以前完全相同。但是,现在当我尝试连接时,我得到一个NullPointerExcep
javax.jms.JMSException: java.lang.NullPointerException
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:54)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1420)
at org.apache.activemq.ActiveMQSession.syncSendPacket(ActiveMQSession.java:2018)
at org.apache.activemq.ActiveMQMessageProducer.<init>(ActiveMQMessageProducer.java:124)
at org.apache.activemq.ActiveMQSession.createProducer(ActiveMQSession.java:1048)
at org.apache.activemq.jms.pool.SessionHolder.getOrCreateProducer(SessionHolder.java:62)
at org.apache.activemq.jms.pool.PooledSession.getMessageProducer(PooledSession.java:393)
at org.apache.activemq.jms.pool.PooledSession.createProducer(PooledSession.java:368)
at com.xyleo.app.App.createProducer(App.java:95)
at com.xyleo.app.App.sendTestMessage(App.java:55)
at com.xyleo.app.App.main(App.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.NullPointerException
at com.intuit.platform.integration.messaging.server.security.QBaseSecurityBrokerFilter.addProducer(QBaseSecurityBrokerFilter.java:265)
at org.apache.activemq.broker.MutableBrokerFilter.addProducer(MutableBrokerFilter.java:112)
at org.apache.activemq.broker.MutableBrokerFilter.addProducer(MutableBrokerFilter.java:112)
at org.apache.activemq.broker.TransportConnection.processAddProducer(TransportConnection.java:565)
at org.apache.activemq.command.ProducerInfo.visit(ProducerInfo.java:108)
at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:294)
at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:148)
at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113)
at org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:270)
at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196)
at java.lang.Thread.run(Thread.java:744)
希望这是足够的细节。提前感谢。异常告诉您它位于第95行,在方法createProducer中的com.xyleo.app.app.createProducer(app.java:95)处,通过调试器运行它,或者在代码行添加打印语句,您可以发现当我不使用池连接工厂时,此代码工作正常。我使用这两种方法都可以在代码中获得有效对象。此空异常发生在库代码中的某个位置。传递有效对象时,库代码中不应出现Null异常。
public class App
{
private static Logger LOG;
private static Properties mqProps;
private static ConnectionFactory _connectionFactory;
private static Session _session;
private static TextMessage _textMessage;
private static Connection _connection;
private static MessageProducer _producer;
private static String appid;
private static String appsecret;
private static String queueName;
private static String brokerUrl;
public static void main( String[] args )
{
System.setProperty("application-name", "mq_pool_test");
LOG = LoggerFactory.getLogger(App.class);
LOG.info("======== STARTING MQ TEST ==========");
int status = 0;
try {
populateTestConfig();
sendTestMessage();
} catch (JMSException e) {
e.printStackTrace();
status = 1;
}
System.exit(status);
}
public static void sendTestMessage() throws JMSException {
// createRegularConnectionFactory(brokerUrl);
createPooledFactory(brokerUrl);
createConnectionAndSession(appid, appsecret);
createProducer(queueName);
prepareTextMessage();
sendMessage(queueName);
}
private static void createPooledFactory(String brokerUrl) {
System.out.println("Creating pooled factory with connection to " + brokerUrl);
ActiveMQConnectionFactory factory = getActiveMQConnectionFactory(brokerUrl);
PooledConnectionFactory pooledFactory = new PooledConnectionFactory();
pooledFactory.setConnectionFactory(factory);
pooledFactory.setMaxConnections(10);
pooledFactory.start();
_connectionFactory = pooledFactory;
}
private static void createRegularConnectionFactory(String brokerUrl) {
System.out.println("Creating factory with connection to " + brokerUrl);
ActiveMQConnectionFactory factory = getActiveMQConnectionFactory(brokerUrl);
_connectionFactory = factory;
}
private static ActiveMQConnectionFactory getActiveMQConnectionFactory(String brokerUrl) {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(brokerUrl);
factory.setUserName(appid);
factory.setPassword(appsecret);
return factory;
}
private static void createConnectionAndSession(String appid, String appsecret) throws JMSException {
System.out.println("Connection with AppID = " + appid +
" and appsecret = " + appsecret);
_connection = _connectionFactory.createConnection();
_connection.start();
_session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}
private static void createProducer(String queueName) throws JMSException {
Destination destination = _session.createQueue(queueName);
System.out.println("Creating producer for " + destination);
_producer = _session.createProducer(destination);
}
private static void prepareTextMessage() throws JMSException {
_textMessage = _session.createTextMessage("Test");
}
private static void sendMessage(String queueName) throws JMSException {
System.out.println("Sending message to " + queueName);
_producer.send(_textMessage);
}
private static void populateTestConfig() {
mqProps = getPropertiesFromFile("mq_test.properties");
appid = mqProps.getProperty("appid");
appsecret = mqProps.getProperty("appsecret");
queueName = mqProps.getProperty("queuename");
brokerUrl = mqProps.getProperty("brokerurl");
}
private static Properties getPropertiesFromFile(String propFile) {
Properties properties = new Properties();
InputStream input = null;
try {
input = App.class.getClassLoader().getResourceAsStream(propFile);
if (input == null) {
System.err.format("Sorry, unable to find {}", propFile);
}
properties.load(input);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return properties;
}
}