2017-09-24 60 views
1

我不能发布这个问题,除非我写了更多的描述,而不是源代码。这就是为什么我只写了几个文本。ActiveMQ扩展SimpleAuthenticationPlugin thoews NullPointerException

我有以下课程。我的目标是通过设置此插件来保护BrokerService。

public class MyAuthenticationPlugin extends SimpleAuthenticationPlugin { 
     private String username ="username"; 
     private String password ="password"; 

     public MyAuthenticationPlugin(){ 
      secureME(); 
     } 
     public void secureME(){ 
      Map<String, String> map = new HashMap<String, String>(); 
      map.put(username, password); 
      this.setUserPasswords(map); 
     } 
    } 

后来我尝试使用上面的类如下,其中我得到一个NullPointerException异常: -

public class Server{ 
     private static int ackMode; 
     private static String messageQueueName; 
     private static String messageBrokerUrl; 

     private Session session; 
     private boolean transacted = false; 
     private MessageProducer replyProducer; 
     private MessageProtocol messageProtocol; 
     private String username ="username"; 
     private String password ="password"; 

     static { 
      messageBrokerUrl = "tcp://localhost:61616"; 
      messageQueueName = "client.messages"; 
      ackMode = Session.AUTO_ACKNOWLEDGE; 
     } 

     public Server() { 
      try { 
       //This message broker is embedded 
       BrokerService broker = new BrokerService(); 
       broker.setPersistent(false); 
       broker.setUseJmx(false); 
       broker.addConnector(messageBrokerUrl); 
       // here I'm add my class as plguing 
       MyAuthenticationPlugin[] myAuthenticationPlugin = new 
       MyAuthenticationPlugin[1]; 
       myAuthenticationPlugin[0] = new MyAuthenticationPlugin(); 

       broker.setPlugins(myAuthenticationPlugin); 
       broker.start(); 
      } catch (Exception e) { 
       System.out.println("Exception: "+e.getMessage()); 
       //Handle the exception appropriately 
      } 
     } 

     private void setupMessageQueueConsumer() { 
      ActiveMQConnectionFactory connectionFactory = new 
       ActiveMQConnectionFactory(messageBrokerUrl); 

      connectionFactory.setUserName(username); 
      connectionFactory.setPassword(password); 

      Connection connection; 
      try { 
       connection = connectionFactory.createConnection(username, password); 


       connection.start(); // This line thows exception 
       this.session = connection.createSession(this.transacted, ackMode); 
       Destination adminQueue = this.session.createQueue(messageQueueName); 

       //Setup a message producer to respond to messages from clients, we will get the destination 
       //to send to from the JMSReplyTo header field from a Message 
       this.replyProducer = this.session.createProducer(null); 
       this.replyProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 

       //Set up a consumer to consume messages off of the admin queue 
       MessageConsumer consumer = this.session.createConsumer(adminQueue); 
       consumer.setMessageListener(this); 

       // new BufferedReader(new InputStreamReader(System.in)).readLine(); 

      } catch (JMSException e) { 
       System.out.println("Exception: "+e.getMessage()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     public static void main(String[] args) { 
      new Server(); 
      System.out.println("I'm done. END"); 
     } 
    } 

主要是我的目标是通过设置用户名,密码,访问组,以确保我的BrokerService安全权利等。请建议我如何在BrokerService中设置用户名,密码,访问权限以使其更安全。

更新与堆栈跟踪: -

result = {StackTraceElement[7]@1015} 
    0 = {[email protected]} "org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)" 
     declaringClass = "org.apache.activemq.util.JMSExceptionSupport" 
     methodName = "create" 
     fileName = "JMSExceptionSupport.java" 
     lineNumber = 49 
    1 = {[email protected]} "org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1377)" 
     declaringClass = "org.apache.activemq.ActiveMQConnection" 
     methodName = "syncSendPacket" 
     fileName = "ActiveMQConnection.java" 
     lineNumber = 1377 
    2 = {[email protected]} "org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1481)" 
     declaringClass = "org.apache.activemq.ActiveMQConnection" 
     methodName = "ensureConnectionInfoSent" 
     fileName = "ActiveMQConnection.java" 
     lineNumber = 1481 
    3 = {[email protected]} "org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:516)" 
     declaringClass = "org.apache.activemq.ActiveMQConnection" 
     methodName = "start" 
     fileName = "ActiveMQConnection.java" 
     lineNumber = 516 
    4 = {[email protected]} "com.ma.home.Server.setupMessageQueueConsumer(Server.java:57)" 
     declaringClass = "com.ma.home.Server" 
     methodName = "setupMessageQueueConsumer" 
     fileName = "Server.java" 
     lineNumber = 57 
    5 = {[email protected]} "com.ma.home.Server.<init>(Server.java:46)" 
     declaringClass = "com.ma.home.Server" 
     methodName = "<init>" 
     fileName = "Server.java" 
     lineNumber = 46 
    6 = {[email protected]} "com.ma.home.Server.main(Server.java:84)" 
     declaringClass = "com.ma.home.Server" 
     methodName = "main" 
     fileName = "Server.java" 
     lineNumber = 84 
+0

您是否有堆栈跟踪? – Logan

+0

请检查更新问题中的堆栈跟踪。还要重现异常,您可以执行给定的代码。谢谢! – masiboo

回答

0

我必须与所有三个正确的参数如用户名,密码,组添加AuthenticationUser。我以前没有在我的代码中提供组。所以遵循的代码将修复。此外,它工作正常。

 public class MyAuthenticationPlugin extends SimpleAuthenticationPlugin { 
      private String username ="username"; 
      private String password ="password"; 
      private String groups = "groups"; 

      Map<String, String> userPasswords = new HashMap<String, String>(); 
      List<AuthenticationUser> authenticationUserList = new ArrayList(); 

      public MyAuthenticationPlugin(){ 
       secureME(); 
      } 
      public void secureME(){ 
       userPasswords.put(username, password); 
       authenticationUserList.add(new AuthenticationUser(username,password, groups)); 
       this.setUserPasswords(userPasswords); 
       this.setUsers(authenticationUserList); 
      } 
    }