MODIFICA: Ha riformulato la domanda:ActiveMQ e broker incorporato
Desidero utilizzare ActiveMQ come servizio di messaggistica tra il mio server e le applicazioni client.
Sto tentando di impostare un broker incorporato (vale a dire non un processo separato) all'interno del server per gestire i messaggi prodotti per i miei clienti. Questa coda è persistente.
L'inizializzazione mediatore come segue:
BrokerService broker = new BrokerService();
KahaPersistenceAdapter adaptor = new KahaPersistenceAdapter();
adaptor.setDirectory(new File("activemq"));
broker.setPersistenceAdapter(adaptor);
broker.setUseJmx(true);
broker.addConnector("tcp://localhost:61616");
broker.start();
Dopo armeggiare, ho finito con la parte server dell'essere:
public static class HelloWorldProducer implements Runnable {
public void run() {
try {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost"); // apparently the vm part is all i need
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
String text = "Hello world! From: " + Thread.currentThread().getName() + " : " + this.hashCode();
TextMessage message = session.createTextMessage(text);
System.out.println("Sent message: "+ message.hashCode() + " : " + Thread.currentThread().getName());
producer.send(message);
session.close();
connection.close();
}
catch (Exception e) {
System.out.println("Caught: " + e);
e.printStackTrace();
}
}
}
Il cliente è molto simile e si presenta così:
Il metodo principale inizia semplicemente ognuno di questi in una discussione per iniziare a produrre/ricevere messaggi GES.
... ma io sono in esecuzione in quanto segue con l'inizio di ogni discussione:
2013-01-24 07:54:31,271 INFO [org.apache.activemq.broker.BrokerService] Using Persistence Adapter: AMQPersistenceAdapter(activemq-data/localhost)
2013-01-24 07:54:31,281 INFO [org.apache.activemq.store.amq.AMQPersistenceAdapter] AMQStore starting using directory: activemq-data/localhost
2013-01-24 07:54:31,302 INFO [org.apache.activemq.kaha.impl.KahaStore] Kaha Store using data directory activemq-data/localhost/kr-store/state
2013-01-24 07:54:31,339 INFO [org.apache.activemq.store.amq.AMQPersistenceAdapter] Active data files: []
2013-01-24 07:54:31,445 DEBUG [org.apache.activemq.broker.jmx.ManagementContext] Probably not using JRE 1.4: mx4j.tools.naming.NamingService
2013-01-24 07:54:31,450 DEBUG [org.apache.activemq.broker.jmx.ManagementContext] Failed to create local registry
java.rmi.server.ExportException: internal error: ObjID already in use
at sun.rmi.transport.ObjectTable.putTarget(ObjectTable.java:186)
at sun.rmi.transport.Transport.exportObject(Transport.java:92)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:247)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:411)
at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
<snip....>
Sembra che i messaggi vengono prodotti e consumati con successo (le altre questioni che ho precedentemente postato su è stato risolto), ma l'eccezione di cui sopra mi preoccupa.
EDIT: Durante l'arresto broker, ora sto salutato anche dal seguente:
2013-01-25 08:40:17,486 DEBUG [org.apache.activemq.transport.failover.FailoverTransport] Transport failed with the following exception:
java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:392)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:269)
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:210)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:202)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:185)
at java.lang.Thread.run(Thread.java:722)
Dovresti includere tutto il codice di creazione del broker in modo che possiamo vedere tutto ciò che hai configurato. Puoi disabilitare JMX se non ti serve tramite broker.setUseJmx (false); –
Per chiarire, il messaggio visualizzato è di livello DEBUG. Questo non è necessariamente un ERRORE. Potrebbe essere solo informativo. Stai riscontrando un errore nella produzione/consumo di messaggi? La domanda non è chiara su questo punto. – cmonkey
Ho riformulato completamente la domanda. Essenzialmente sto chiedendo 3 sotto-domande. (1) L'eccezione, (2) Messaggi persi e (3) Persistenza. Grazie per aver guardato la mia domanda. –