使用activeMQ进行android推送时需要如下问题
(1)activeMQ后台报错:Frame size of 257 MB larger than max allowed 100 MB
详细错误信息:
WARN | Transport Connection to: tcp://127.0.0.1:50916 failed: java.io.IOException: Frame size of 257 MB larger than max allowed 100 MB | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///127.0.0.1:50916@61616
解决方法:
修改配置文件apache-activemq-5.9.0-bin\apache-activemq-5.9.0\conf\activemq.xml
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=1048576000"/>
把maxFrameSize 调大一些.
(2)mqtt 客户端如何设置用户名和密码
/*** * 客户端和activeMQ服务器建立连接 * @param BROKER_URL * @param clientId : 用于标识客户端,相当于ios中的device token * @param TOPIC * @param isCleanSession :false--可以接受离线消息; * @return 是否启动成功 */ private boolean connect(String BROKER_URL,String clientId,String TOPIC,boolean isCleanSession){ try { ComponentUtil.appendResult(resultTextPane, "connect time:"+TimeHWUtil.getCurrentMiniuteSecond(), true); mqttClient = new MqttClient(BROKER_URL, clientId, new MemoryPersistence()); MqttConnectOptions options= new MqttConnectOptions(); options.setCleanSession(isCleanSession);//mqtt receive offline message ComponentUtil.appendResult(resultTextPane, "isCleanSession:"+isCleanSession, true); options.setKeepAliveInterval(30); String username=usernameTextField.getText(); String password=passwordTextField.getText(); if(ValueWidget.isNullOrEmpty(username)){ username=null; } if(ValueWidget.isNullOrEmpty(password)){ password=null; }else{ options.setPassword(password.toCharArray()); } options.setUserName(username); //推送回调类,在此类中处理消息,用于消息监听 mqttClient.setCallback(new MyCallBack(MqttClientSwing.this)); boolean isSuccess=false; try { mqttClient.connect(options);//CLIENT ID CAN NOT BE SAME isSuccess=true; } catch (Exception e) { if(isPrintException){ e.printStackTrace(); } } if(!isSuccess){ String message="连接失败,请检查client id是否重复了 或者activeMQ是否启动"; ComponentUtil.appendResult(resultTextPane, message, true); GUIUtil23.warningDialog(message); return false; }else{ //Subscribe to topics mqttClient.subscribe(new String[]{TOPIC,clientId}); System.out.println("topic:"+TOPIC+", "+(clientId)); ComponentUtil.appendResult(resultTextPane, "TOPIC:"+TOPIC+", "+(clientId), true); } } catch (MqttException e) { if(isPrintException){ e.printStackTrace();} GUIUtil23.errorDialog(e.getMessage()); return false; } return true; }
(3)发布者如何设置密码
/** * 初始化connection和session * * @throws Exception */ private void init(/* String mqIp,boolean transacted */) throws Exception { if (!DialogUtil.verifyTFEmpty(serverIpTextField, "服务器ip")) { return; } String transactedStr = transactedTextField.getText(); boolean transacted = false; if (ValueWidget.isNullOrEmpty(transactedStr)) { transacted = false; } else { transacted = Boolean.parseBoolean(transactedStr); } String message = "transacted:" + transacted; ComponentUtil.appendResult(resultTextArea, message, false); // System.out.println(message); String brokerUrl = String.format(BROKER_URL, serverIpTextField.getText()); String username=usernameTextField.getText(); String password=passwordTextField.getText(); if(ValueWidget.isNullOrEmpty(username)){ username=null; } if(ValueWidget.isNullOrEmpty(password)){ password=null; } // 创建链接工厂 TopicConnectionFactory factory = new ActiveMQConnectionFactory( username, password, brokerUrl); ComponentUtil.appendResult(resultTextArea, "activeMQ url:" + brokerUrl, true); // 通过工厂创建一个连接 connection = factory.createTopicConnection(); // 启动连接 connection.start(); ComponentUtil.appendResult(resultTextArea, "启动connection 成功", true); // 创建一个session会话 transacted session = connection.createTopicSession( transacted /* Boolean.FALSE */, Session.AUTO_ACKNOWLEDGE); }