Hallo,
ich kämpfe zur Zeit mit folgendem Problem: Ich möchte zur Laufzeit mehrere JMS DurableSubscriber dynamisch erzeugen, die sich mit einem (evtl. unterschiedlichen) MessageSelector beim JMS Provider für ein Topic unter zuhilfenahme genau einer TopicConnectionFactory anmelden. Die Software läuft im Glassfish 2.1. Nachfolgend die Methode, die die Subscription erzeugt:
Solange ich nur immer einen anmelde funktionierts - versuche ich aber mehrere gleichzeitig anzumelden bekomme ich folgende Exception:
Ich meine mittlerweile herausgefunden zu haben, dass es an der clientID liegt. Wenn ich eine clientID im Admincenter des Glassfish als Property der ConnectionFactory hinzufüge, funktioniert zumindest das Anmelden eines Subscribers - beim zweiten kommt wie gesagt obige Exception. Wenn ich gar keine ClientID definiere, klappt nichtmal das anmelden eines Subscribers (obige Exception). Ich denke mal, dass jeder Subscriber eine eigene, eindeutige ClientID haben muss, deswegen wollte ich die topicConnection.setClientID() Methode hernehmen um diese zur Laufzeit eindeutig zu setzen, allerdings bekomme ich da folgende Exception, die soviel bedeutet wie: Wenn deine Applikation im Glassfish Container läuft (und das muss sie bei mir) ist die Benutzung dieser Methode verboten:
Eine Lösung besteht darin für jede Subscription eine eigene TopicConnectionFactory im Glassfish mit ClientID anzulegen, allerdings würde ich das ganz gerne vermeiden - ich will nur eine TopicConnectionFactory verwenden um zur Laufzeit verschiedene Subscriber erstellen zu können, ohne für jeden per Hand eine TopicConnectionFactory anlegen zu müssen. Kennt wer für mein Problem eine funktionierende Lösung? Evtl. dynamische Erzeugung von Message Driven Beans mit Parametern wie MessageSelector zur Laufzeit - geht das überhaupt?
Beim Testen ist mir hin und wieder auch folgende Exception um die Ohren geflogen - von welchem Limit wird hier gesprochen und wo kann man das setzen?
Vielen Dank für eure Hilfe - bin echt am Verzweifeln!
ich kämpfe zur Zeit mit folgendem Problem: Ich möchte zur Laufzeit mehrere JMS DurableSubscriber dynamisch erzeugen, die sich mit einem (evtl. unterschiedlichen) MessageSelector beim JMS Provider für ein Topic unter zuhilfenahme genau einer TopicConnectionFactory anmelden. Die Software läuft im Glassfish 2.1. Nachfolgend die Methode, die die Subscription erzeugt:
Java:
public void createTopicSubscription(String subscriptionID, String messageSelector)
{
Context ctx = null;
TopicConnection topicConnection = null;
TopicSession topicSession = null;
TopicSubscriber = null;
try
{
ctx = new InitialContext();
TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("jms/MyTopicConnectionFactory");
//Create topic connection
topicConnection = factory.createTopicConnection();
//Create topic session
topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
//Lookup topic
Topic topic = (Topic) ctx.lookup("jms/MyTopic");
//Create topic subscriber with message selector
topicSubscriber = topicSession.createDurableSubscriber(topic, subscriptionID, messageSelector, true);
topicSubscriber.setMessageListener(this);
}
catch(Exception e)
{
e.printStackTrace();
}
}
Solange ich nur immer einen anmelde funktionierts - versuche ich aber mehrere gleichzeitig anzumelden bekomme ich folgende Exception:
Java:
javax.jms.JMSException: createConsumer on JMSService:jmsdirect failed for connectionId:9193858493415586560
and sessionId:9193858493418027009
due to unkown JMSService server error.
at com.sun.messaging.jms.ra.DirectSession._createAndAddConsumer(DirectSession.java:1645)
at com.sun.messaging.jms.ra.DirectSession.createDurableSubscriber(DirectSession.java:354)
...
Caused by: com.sun.messaging.jmq.jmsservice.JMSServiceException:
addConsumer: Add consumer failed. Connection ID: 9193858493415586560,
session ID: 9193858493418027009
at com.sun.messaging.jmq.jmsserver.service.imq.IMQDirectService.addConsumer(IMQDirectService.java:1320)
at com.sun.messaging.jms.ra.DirectSession._createAndAddConsumer(DirectSession.java:1595)
... 81 more
Caused by: java.lang.NullPointerException
at com.sun.messaging.jmq.jmsserver.core.Subscription.calcHashcode(Subscription.java:260)
at com.sun.messaging.jmq.jmsserver.core.Subscription.<init>(Subscription.java:287)
...
Ich meine mittlerweile herausgefunden zu haben, dass es an der clientID liegt. Wenn ich eine clientID im Admincenter des Glassfish als Property der ConnectionFactory hinzufüge, funktioniert zumindest das Anmelden eines Subscribers - beim zweiten kommt wie gesagt obige Exception. Wenn ich gar keine ClientID definiere, klappt nichtmal das anmelden eines Subscribers (obige Exception). Ich denke mal, dass jeder Subscriber eine eigene, eindeutige ClientID haben muss, deswegen wollte ich die topicConnection.setClientID() Methode hernehmen um diese zur Laufzeit eindeutig zu setzen, allerdings bekomme ich da folgende Exception, die soviel bedeutet wie: Wenn deine Applikation im Glassfish Container läuft (und das muss sie bei mir) ist die Benutzung dieser Methode verboten:
Java:
javax.jms.JMSException: MQJMSRA_DC2001: Unsupported:setClientID():inACC=false:
connectionId=9193858493415594497
at com.sun.messaging.jms.ra.DirectConnection._unsupported(DirectConnection.java:864)
at com.sun.messaging.jms.ra.DirectConnection.setClientID(DirectConnection.java:386)
...
Eine Lösung besteht darin für jede Subscription eine eigene TopicConnectionFactory im Glassfish mit ClientID anzulegen, allerdings würde ich das ganz gerne vermeiden - ich will nur eine TopicConnectionFactory verwenden um zur Laufzeit verschiedene Subscriber erstellen zu können, ohne für jeden per Hand eine TopicConnectionFactory anlegen zu müssen. Kennt wer für mein Problem eine funktionierende Lösung? Evtl. dynamische Erzeugung von Message Driven Beans mit Parametern wie MessageSelector zur Laufzeit - geht das überhaupt?
Beim Testen ist mir hin und wieder auch folgende Exception um die Ohren geflogen - von welchem Limit wird hier gesprochen und wo kann man das setzen?
Java:
javax.jms.JMSException: createConsumer on JMSService:jmsdirect failed for connectionId:9193858493415586560
and sessionId:9193858493543070721 due to destination limit for number of consumers exceeded.
at com.sun.messaging.jms.ra.DirectSession._createAndAddConsumer(DirectSession.java:1645)
at com.sun.messaging.jms.ra.DirectSession.createDurableSubscriber(DirectSession.java:354)
...
Vielen Dank für eure Hilfe - bin echt am Verzweifeln!
Zuletzt bearbeitet: