Subscribe to EventQueues"

From Documentation
m
 
(6 intermediate revisions by one other user not shown)
Line 1: Line 1:
 
{{ZKDevelopersReferencePageHeader}}
 
{{ZKDevelopersReferencePageHeader}}
  
=A Simple Example=
+
=Subscribe by <code>@Subscribe</code>=
 
  {{ZK EE}}
 
  {{ZK EE}}
  
You can subscribe a method (as if in an EventListener) to an [[ZK_Developer's_Reference/Event_Handling/Event_Queues | EventQueue]] by annotate it with <javadoc>org.zkoss.zkmax.ui.select.annotation.Subscribe</javadoc>. For example,
+
A method (as if in an EventListener) in [https://www.zkoss.org/javadoc/latest/zk/org/zkoss/zk/ui/select/SelectorComposer.html SelectorComposer] can subscribe to an [[ZK_Developer's_Reference/Event_Handling/Event_Queues | EventQueue]] by [https://www.zkoss.org/javadoc/latest/zk/org/zkoss/zkmax/ui/select/annotation/Subscribe.html @Subscribe]. For example,
  
<source lang="java" high='3, 8'>
+
<syntaxhighlight lang="java" highlight='3'>
 
// in sender composer
 
// in sender composer
 
public void publish() {
 
public void publish() {
Line 12: Line 12:
 
eq.publish(new Event("onMyEvent", component, data));
 
eq.publish(new Event("onMyEvent", component, data));
 
}
 
}
 +
</syntaxhighlight>
  
 +
<syntaxhighlight lang='java' highlight='2'>
 
// in receiver composer
 
// in receiver composer
 
@Subscribe("queue1")
 
@Subscribe("queue1")
Line 21: Line 23:
 
}
 
}
  
</source>
+
</syntaxhighlight>
 
* Notice the queue name should match.
 
* Notice the queue name should match.
 
* ZK executes both methods in a servlet thread, so if they execute a time-consuming operation, they will block users.
 
* ZK executes both methods in a servlet thread, so if they execute a time-consuming operation, they will block users.
  
 
In the example above, when you publish an event in the EventQueue, the subscribed method will be called. This is a useful mechanism to communicate among composers. See also <javadoc>org.zkoss.zk.ui.event.EventQueue</javadoc>.
 
In the example above, when you publish an event in the EventQueue, the subscribed method will be called. This is a useful mechanism to communicate among composers. See also <javadoc>org.zkoss.zk.ui.event.EventQueue</javadoc>.
 
 
  
 
=EventQueue Scope=
 
=EventQueue Scope=
You can subscribe to EventQueue of different scope.
+
You can subscribe to EventQueue of different scopes.
  
<source lang="java">
+
<syntaxhighlight lang="java" highlight='1'>
 
@Subscribe(value = "queue2", scope = EventQueues.SESSION)
 
@Subscribe(value = "queue2", scope = EventQueues.SESSION)
 
public void method2(Event event) {
 
public void method2(Event event) {
Line 41: Line 41:
 
eq.publish(new Event("onMyEvent", component, data));
 
eq.publish(new Event("onMyEvent", component, data));
 
}
 
}
</source>
+
</syntaxhighlight>
  
 
Available scopes are: Desktop, Group, Session, Application. Note that Group scope requires ZK EE. See also <javadoc>org.zkoss.zk.ui.event.EventQueues</javadoc>.
 
Available scopes are: Desktop, Group, Session, Application. Note that Group scope requires ZK EE. See also <javadoc>org.zkoss.zk.ui.event.EventQueues</javadoc>.
Line 47: Line 47:
  
 
=Event Name=
 
=Event Name=
Since 7.0.3, you can also listen to a specified event name
+
{{versionSince| 7.0.3}} You can also listen to a specified event name.
<source lang="java">
+
<syntaxhighlight lang="java" highlight='1'>
 
@Subscribe(value = "queue2", eventName = "event1")
 
@Subscribe(value = "queue2", eventName = "event1")
 
public void method2(Event event) {
 
public void method2(Event event) {
Line 57: Line 57:
 
eq.publish(new Event("event1", component, data));
 
eq.publish(new Event("event1", component, data));
 
}
 
}
</source>
+
</syntaxhighlight>
  
  
  
 
=Subscriber Method Parameter=
 
=Subscriber Method Parameter=
The method which subscribes to the EventQueue takes either no parameter, or one parameter of a type Event.
+
The method which subscribes to the EventQueue takes either no parameter or one parameter of a type Event.
  
 
<source lang="java">
 
<source lang="java">
Line 71: Line 71:
 
</source>
 
</source>
  
Since 7.0.3, ZK automatically maps event data into the method parameters in order.
+
{{versionSince| 7.0.3}} ZK automatically maps event data into the method parameters in order.
  
<source lang="java">
+
<syntaxhighlight lang="java" highlight='2'>
 
@Subscribe("queue3")
 
@Subscribe("queue3")
 
public void method3(int i, String s) {  
 
public void method3(int i, String s) {  
Line 84: Line 84:
 
eq.publish(new Event("event1", component, new Object[]{100, "eventData"}));
 
eq.publish(new Event("event1", component, new Object[]{100, "eventData"}));
 
}
 
}
</source>
+
</syntaxhighlight>
  
 
If you put the event at the first one, it also works well.
 
If you put the event at the first one, it also works well.
Line 103: Line 103:
  
 
= Auto-Unsubscribed =
 
= Auto-Unsubscribed =
<tt>@Subscribe</tt> will unsubscribe the subscribed event-queue automatically when the applied component (or its ancestor) of a composer is detached.  
+
<code>@Subscribe</code> will unsubscribe the subscribed event-queue automatically when the applied component (or its ancestor) of a composer is detached.  
  
 
<!--https://tracker.zkoss.org/browse/ZK-1438-->
 
<!--https://tracker.zkoss.org/browse/ZK-1438-->
  
 
=Version History=
 
=Version History=
{{LastUpdated}}
+
 
{| border='1px' | width="100%"
+
{| class='wikitable' | width="100%"
 
! Version !! Date !! Content
 
! Version !! Date !! Content
 
|-
 
|-

Latest revision as of 07:17, 29 January 2024


Subscribe to EventQueues


Subscribe by @Subscribe

  • Available for ZK:
  • http://www.zkoss.org/product/zkhttp://www.zkoss.org/whyzk/zkeeVersion ee.png

A method (as if in an EventListener) in SelectorComposer can subscribe to an EventQueue by @Subscribe. For example,

// in sender composer
public void publish() {
	EventQueue<Event> eq = EventQueues.lookup("queue1", EventQueues.DESKTOP, true);
	eq.publish(new Event("onMyEvent", component, data));
}
// in receiver composer
@Subscribe("queue1")
public void receive(Event event) {
	// this method will be called when EventQueue "queue1" of Desktop scope is published
	Object data = event.getData();
	Component target = event.getTarget();
}
  • Notice the queue name should match.
  • ZK executes both methods in a servlet thread, so if they execute a time-consuming operation, they will block users.

In the example above, when you publish an event in the EventQueue, the subscribed method will be called. This is a useful mechanism to communicate among composers. See also EventQueue.

EventQueue Scope

You can subscribe to EventQueue of different scopes.

@Subscribe(value = "queue2", scope = EventQueues.SESSION)
public void method2(Event event) {
	// this method will be called when EventQueue "queue2" of Session scope is published
}
public void publish() {
	EventQueue<Event> eq = EventQueues.lookup("queue2", EventQueues.SESSION, true);
	eq.publish(new Event("onMyEvent", component, data));
}

Available scopes are: Desktop, Group, Session, Application. Note that Group scope requires ZK EE. See also EventQueues.


Event Name

Since 7.0.3 You can also listen to a specified event name.

@Subscribe(value = "queue2", eventName = "event1")
public void method2(Event event) {
	// this method will be called when EventQueue "queue2" of Session scope is published
}
public void publish() {
	EventQueue<Event> eq = EventQueues.lookup("queue2", EventQueues.DESKTOP, true);
	eq.publish(new Event("event1", component, data));
}


Subscriber Method Parameter

The method which subscribes to the EventQueue takes either no parameter or one parameter of a type Event.

@Subscribe("queue3")
public void method3() { // the event parameter can be omitted
	// ...
}

Since 7.0.3 ZK automatically maps event data into the method parameters in order.

@Subscribe("queue3")
public void method3(int i, String s) { 
	// i will be 100, s will be "eventData"
	// ...
}

public void publish() {
	EventQueue<Event> eq = EventQueues.lookup("queue3", EventQueues.DESKTOP, true);
	eq.publish(new Event("event1", component, new Object[]{100, "eventData"}));
}

If you put the event at the first one, it also works well.

@Subscribe("queue3")
public void method3(Event event, int i, String s) { 
	// ...
}

To recap, we now have four ways to use a parameter:

  • method()
  • method(Event event)
  • method(Event event, int d1, String d2, ....)
  • method(int d1, String d2, ...)

Auto-Unsubscribed

@Subscribe will unsubscribe the subscribed event-queue automatically when the applied component (or its ancestor) of a composer is detached.


Version History

Version Date Content
6.0.1 April 2012 @Subscribe was introduced.
7.0.3 June 2014 ZK-2076 Enhance Subscribe annotation to map java method by the event name and the parameter type in order



Last Update : 2024/01/29

Copyright © Potix Corporation. This article is licensed under GNU Free Documentation License.