Domanda

Ho scritto un servizio Windows usando le librerie Apache.NMS e Apcahe.NMS.ActiveMQ (versione 1.0). Il servizio utilizza i messaggi da ActiveMQ da un server del fornitore.

Il servizio avvia una connessione e ascolta i messaggi (gestisco l'evento OnMessage)

La connessione è una connessione transata, quindi chiamo commit dopo ogni messaggio.

All'avvio del servizio, tutto funziona molto bene e lo fa per un po '. Tuttavia, dopo un certo periodo di tempo, non consumerà più messaggi. Anche se ripristino il servizio. Di solito è necessario riavviare il mio servizio E il server del fornitore (tomcat) per riavviare le cose. Il venditore insiste sul fatto che nulla sia sbagliato dalla loro parte.

Non vengono generate eccezioni su entrambi i lati (client o server): è solo "bloccato".

Dovrei considerare l'utilizzo di Spring.Messaging.Nms?

È stato utile?

Soluzione

Ho scoperto il problema. Dopo aver stabilito la connessione e il listener di messaggi, il servizio è andato in loop con Thread.Sleep (500). Dumb. Ho riformattato il servizio per avviare tutto in OnStart e smaltirlo in OnStop.

Da allora, tutto funziona alla perfezione.

Errore ID-10-T classico tra tastiera e sedia.

Altri suggerimenti

Il mio codice è leggermente diverso. Invece di eseguire il polling in un ciclo ho impostato un ascoltatore che risponde a un messaggio "OnMessage" evento. Il mio codice è simile al codice seguente. Il mio codice attuale contiene molte cose irrilevanti ma lo spirito è lo stesso - spero che questo aiuti.

factory = new Apache.NMS.ActiveMQ.ConnectionFactory("tcp://activemq:61616");

connection = factory.QueueConnection(factory, "MyQueue", AcknowledgementMode.AutoAcknowledge)

consumer = connection.Session.CreateConsumer(connection.Queue, "2 > 1"); //Get every msg

consumer.Listener += new MessageListener(OnMessage);


private void OnMessage(IMessage message)
{
  //Process message here.;
}

abbiamo riscontrato esattamente lo stesso problema utilizzando un servizio .Net che parla con ActiveMQ, ma il nostro si blocca dopo che sono stati recapitati solo circa 10-20 messaggi.

L'ho provato con e senza il framework di primavera ed è leggermente meglio senza (a meno che non stia immaginando cose).

Ti dispiacerebbe controllare questo codice e farmi sapere se ha qualche somiglianza con il tuo?

ConnectionFactory connectionFactory = new ConnectionFactory("tcp://activemq:61616");

Connection connection = (Connection)connectionFactory.CreateConnection();
connection.Start();

Session session = (Session)connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination queue = session.GetQueue("test.queue");

MessageConsumer consumer = (MessageConsumer)session.CreateConsumer(queue);

for (int i = 0; i < 1000; i++)
{
    IMessage msg = consumer.Receive();
    if (msg != null)
        Console.WriteLine((msg as ITextMessage).Text);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top