ActiveMQ的文档是真够烂的,非常不严谨。可这东西是个好东西。
按照文档说明的:
Apache ActiveMQ — XMPP
是怎么都不可能实现的。因为他根本没有说明还需要一个XMPP的服务器。怎么可以有用户让你登录呢。
然后我试了,安装了一个openfire,地址在:
下载页面
然后最关健的一步在于,设置服务器到服务器的,要输入 127.0.0.1:61222 (默认本地的情况下)

不过似乎还不能注册帐号,只能登录帐号。再研究看看是否可以通过BROKER注册帐号。
ActiveMQ的文档是真够烂的,非常不严谨。可这东西是个好东西。
按照文档说明的:
Apache ActiveMQ — XMPP
是怎么都不可能实现的。因为他根本没有说明还需要一个XMPP的服务器。怎么可以有用户让你登录呢。
然后我试了,安装了一个openfire,地址在:
下载页面
然后最关健的一步在于,设置服务器到服务器的,要输入 127.0.0.1:61222 (默认本地的情况下)

不过似乎还不能注册帐号,只能登录帐号。再研究看看是否可以通过BROKER注册帐号。
今天研究了一天的ActiveMQ, 可是一上午无论如何测试,都停留在只能发送文件的链接,而不是文件数据本身,ActiveMQ需要有第三方的数据占存机制来保存数据。
在下午,与一位CSDN上的activeMQ高手郑广鹏一起研究一下,找了一些资料,终于把这一块研究出来一半,需要还有问题,但问题集中在了RESTful ,jetty的问题上了,尝试传输了一个30MB大的视频文件,成功。
下面是我找到的资料的链接:
http://www.nabble.com/A-problem-with-blobmessage-on-activemq-5.0-td15523989s2354.html
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.BlobMessage;
import org.apache.activemq.command.ActiveMQBlobMessage;
import org.apache.activemq.command.ActiveMQQueue;
public class Sending {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
long a1 = System.currentTimeMillis();
/*
* First you must tell how the Blob repository can be found.
* Use ActiveMQ 5.1.0+ as broker because the fileserver webapp works there out of the box.
*/
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(
“tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/“);
ActiveMQConnection conn = null;
ActiveMQSession session = null;
try {
conn = (ActiveMQConnection)cf.createConnection();
session = (ActiveMQSession) conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = new ActiveMQQueue(”Queue”);
MessageProducer producer = session.createProducer(destination);
/*
* !!!!!!!!!!!!!!!!!!!!!!!!!
* very important. If it is set to true (default) the uploader is lost in translation ![]()
* !!!!!!!!!!!!!!!!!!!!!!!!!
*/
conn.setCopyMessageOnSend(false);
File file = File.createTempFile(”amq-data-file-”, “.dat”);
// lets write some data
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.append(”Hello World!”);
writer.close();
/*
* i have used an simple ascii file instead of the picture you want to use
*/
BlobMessage message = session.createBlobMessage(file);
/*
* should only work if you receive the message
*/
//System.out.println(message.getInputStream());
producer.send(message);
/*
* After all you can see a new file under $Brokerlocation$/webapps/fileserver/
*/
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
if (session != null) {
session.close();
}
if (conn != null) {
conn.close();
}
} catch (JMSException ex) {
}
}
a1 = System.currentTimeMillis() - a1;
System.out.println(a1);
}
}
<broker >
。。。
<plugins>
。。。
<simpleAuthenticationPlugin>
<users>
<authenticationUser username=”abcd” password=”1234″
groups=”users,admins,admin”/>
<authenticationUser username=”guest” password=”password” groups=”guests”/>
</users>
</simpleAuthenticationPlugin>
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<authorizationEntry queue=”kkk” read=”admins” write=”admins” admin=”admins” />
<authorizationEntry queue=”>” read=”admins” write=”admins” admin=”admins” />
<authorizationEntry queue=”USERS.>” read=”users” write=”users” admin=”users” />
<authorizationEntry queue=”GUEST.>” read=”guests” write=”guests,users” admin=”guests,users” />
<authorizationEntry topic=”>” read=”admins” write=”admins” admin=”admins” />
<authorizationEntry topic=”USERS.>” read=”users” write=”users” admin=”users” />
<authorizationEntry topic=”GUEST.>” read=”guests” write=”guests,users” admin=”guests,users” />
<authorizationEntry topic=”ActiveMQ.Advisory.>” read=”guests,users” write=”guests,users” admin=”guests,users”/>
</authorizationEntries>
<tempDestinationAuthorizationEntry>
<tempDestinationAuthorizationEntry read=”admin” write=”admin” admin=”admin”/>
</tempDestinationAuthorizationEntry>
</authorizationMap>
</map>
</authorizationPlugin>
。。。
</plugins>
。。。
</broker >
当按照官方的说明合理配置后,仍然出现SecurityException 如下显示时:
WARN TransportConnection - Failed to add Connection
java.lang.SecurityException: User name or password is invalid.
at org.apache.activemq.security.SimpleAuthenticationBroker.addConnection(SimpleAuthenticationBroker.java:52)
at org.apache.activemq.broker.BrokerFilter.addConnection(BrokerFilter.java:81)
at org.apache.activemq.broker.MutableBrokerFilter.addConnection(MutableBrokerFilter.java:8 ![]()
at org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:662)
at org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:86)
at org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:125)
at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:292)
at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:180)
at org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:6 ![]()
at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:143)
at org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:206)
at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:84)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:196)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:183)
at java.lang.Thread.run(Thread.java:619)
经过我屏闭了Camel,Jetty,CommandAgent等说是经常出现这种EXCEPTION之后,仍然出现,而且出现在TransportConnection, 于我便尝试在 <transportConnectors>附近寻找,
第一眼让我感觉到discoveryUri=”multicast://default” 可能存在问题,因为这有可能在广播式查找的同时,会找到自己,由于本身有安全机制,自然无法用通用的方式进行连接,于是去掉这个说明后,也就成了以下这样:
<!– The transport connectors ActiveMQ will listen to –>
<transportConnectors>
<transportConnector
name=”openwire” uri=”tcp://localhost:61616″/>
<transportConnector name=”ssl” uri=”ssl://localhost:61617″/>
<transportConnector name=”stomp” uri=”stomp://localhost:61613″/>
<transportConnector name=”xmpp” uri=”xmpp://localhost:61222″/>
</transportConnectors>
然后直接启动AMQ就正常运行了,然后如果从另一B点连接到这个A点时就需要在B点的配置文件里面加上
<networkConnectors>
….
<networkConnector
userName=”abcd”
password=”1234″
networkTTL=”5″
name=”thename”
uri=”static://(tcp://host:61616)”/>
……
</networkConnectors>
摸索了一早上,终于成功出来了。
| M | T | W | T | F | S | S |
|---|---|---|---|---|---|---|
| « May | ||||||
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 | |