1.2k Aufrufe
Gefragt in Anwendungen(Java,C++...) von fabian030 Einsteiger_in (19 Punkte)
Server:


public class EchoServer {

private static final String DESTINATION = "queue/myQueue1";
private static final String USER = "guest";
private static final String PASSWORD = "guest";
private QueueConnectionFactory factory;
private Queue queue;

public EchoServer() throws NamingException, JMSException {
Context ctx = new InitialContext();
factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
queue = (Queue) ctx.lookup(DESTINATION);
}

public static void main(String[] args) throws Exception {
EchoServer server = new EchoServer();
server.process();
}

public void process() throws JMSException {
int i = 0;
QueueConnection connection = factory.createQueueConnection(USER, PASSWORD);
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver receiver = session.createReceiver(queue);
connection.start();
System.out.println("EchoServer gestartet ...");
while (true) {
System.out.println(i++);
TextMessage request = (TextMessage) receiver.receive();
String text = request.getText();
Queue tempQueue = (Queue) request.getJMSReplyTo();
TextMessage response = session.createTextMessage();
response.setText(text);
QueueSender sender = session.createSender(tempQueue);
sender.send(response);
}
}
}


Client:


public class EchoClient {
private static final String DESTINATION = "queue/myQueue1";
private static final String USER = "guest";
private static final String PASSWORD = "guest";
private QueueConnectionFactory factory;
private Queue queue;

public EchoClient() throws NamingException, JMSException {
Context ctx = new InitialContext();
factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
queue = (Queue) ctx.lookup(DESTINATION);
}

public static void main(String[] args) throws Exception {
EchoClient client = new EchoClient();
client.process();
}


public void process() throws JMSException {
QueueConnection connection = factory.createQueueConnection(USER, PASSWORD);
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver receiver = session.createReceiver(queue);
TemporaryQueue tempQueue = null;
QueueSender sender = null;
connection = factory.createQueueConnection(USER, PASSWORD);
session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
while(true){
String text = Tastatur.liesString();
//temporäre Queue für die Antwort erzeugen
tempQueue = session.createTemporaryQueue();
sender = session.createSender(queue);
receiver = session.createReceiver(tempQueue);
connection.start();
TextMessage request = session.createTextMessage();
request.setText(text);
request.setJMSReplyTo(tempQueue);
sender.send(request);
//auf Antwort warten
TextMessage response = (TextMessage) receiver.receive();
System.out.println(response.getText());
}
}
}



ich möchte solange text beim client eingeben können, der auch wieder zurückkommt und ausgegeben wird am client, wie ich will ...

den ersten string kann ich noch rüberschicken und empfangen. aber ab dem zweiten string streikt er. da kommt dann immer der fehler:

WARNUNG: Received a message on a connection which is not yet started. Have you forgotten to call Connection.start()? Connection: ActiveMQConnection {id=ID:Leviathan-52669-1244063350005-0:0, ...

weißt einer, wie man das umbauen kann? :/
ich probier da schon ne weile rum, komm aber nicht dahinter.

1 Antwort

0 Punkte
Beantwortet von disco Einsteiger_in (17 Punkte)
moin

glaube, dass du in konflike kommst, weil du in den while schleifen, zwar eine menge aufmachst (conn, queue), aber nichts zu. entweder du machst die verbindungen ausserhalb der while auf und lässt die sessions offen, oder du musst sie nach dem versenden wieder zu machen, damit du sie bei nächsten durchlauf wieder öffnen kannst.
bei dauerhaften gebrauch ist das offen lassen performanter.

g,
disco
...