[JBoss JIRA] (ISPN-5850) Listener close might get ahead of last event
by Galder Zamarreño (JIRA)
[ https://issues.jboss.org/browse/ISPN-5850?page=com.atlassian.jira.plugin.... ]
Galder Zamarreño resolved ISPN-5850.
------------------------------------
Fix Version/s: (was: 8.1.0.Final)
Resolution: Rejected
Same issue as ISPN-5848
> Listener close might get ahead of last event
> --------------------------------------------
>
> Key: ISPN-5850
> URL: https://issues.jboss.org/browse/ISPN-5850
> Project: Infinispan
> Issue Type: Sub-task
> Reporter: Galder Zamarreño
> Assignee: Galder Zamarreño
>
> In this example:
> {code}
> FunctionalMap.ReadOnlyMap<String, String> readOnlyMap = CreateFunctionalMaps.ro();
> FunctionalMap.WriteOnlyMap<String, String> writeOnlyMap = CreateFunctionalMaps.wo();
> FunctionalMap.ReadWriteMap<String, String> readWriteMap = CreateFunctionalMaps.rw();
> // `written` is a ReadEntryView of the written entry
> try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
> System.out.printf("Written (via onWrite): %s%n", written.get()))) {
> Map<String, String> entries = new HashMap<>();
> entries.put("key1", "value1");
> entries.put("key2", "value2");
> writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
> .get(); // Wait for completable future
> }
> AutoCloseable writeCloseHandler = writeOnlyMap.listeners().add(new WriteListener<String, String>() {
> @Override
> public void onWrite(ReadEntryView<String, String> written) {
> System.out.printf("Written (via add): %s%n", written.get());
> }
> });
> CompletableFuture<Void> f0 = writeOnlyMap.eval("key1", view -> view.set("new-value1"));
> CompletableFuture<Void> f1 = f0.thenAccept(ignore ->
> writeOnlyMap.eval("key2", view -> view.set("new-value2")));
> CompletableFuture<Void> f2 = f1.thenAccept(ignore -> {
> try {
> writeCloseHandler.close();
> } catch (Exception e) {
> e.printStackTrace(); // TODO: Customise this generated block
> }
> });
> f2.get(); // Wait for completable future
> {code}
> The output is:
> {code}
> Written (via onWrite): value1
> Written (via onWrite): value2
> Written (via add): new-value1
> {code}
> Even though the listener is closed after the 2nd new value has been modified, it seems like the close might get ahead somehow.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 6 months
[JBoss JIRA] (ISPN-5848) WriteOnlyMap.evalAll and eval remove do not produce listener events
by Galder Zamarreño (JIRA)
[ https://issues.jboss.org/browse/ISPN-5848?page=com.atlassian.jira.plugin.... ]
Galder Zamarreño commented on ISPN-5848:
----------------------------------------
The issue might be slightly different. The following does not work:
{code}
FunctionalMap.WriteOnlyMap<String, String> writeOnlyMap = ...
// `written` is a ReadEntryView of the written entry
try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
System.out.printf("Written (via onWrite): %s%n", written.find()))) {
Map<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
.thenAccept(ignore -> writeOnlyMap.eval("key1", view -> view.remove()))
.get(); // Wait for completable future
}
{code}
^ It prints:
{code}
Written (via onWrite): Optional[value1]
Written (via onWrite): Optional[value2]
{code}
Whereas this works:
FunctionalMap.WriteOnlyMap<String, String> writeOnlyMap = ...
// `written` is a ReadEntryView of the written entry
try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
System.out.printf("Written (via onWrite): %s%n", written.find()))) {
Map<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
.thenCompose(ignore -> writeOnlyMap.eval("key1", view -> view.remove()))
.get(); // Wait for completable future
}
{code}
^ This prints:
{code}
Written (via onWrite): Optional[value1]
Written (via onWrite): Optional[value2]
Written (via onWrite): Optional.empty
{code}
> WriteOnlyMap.evalAll and eval remove do not produce listener events
> -------------------------------------------------------------------
>
> Key: ISPN-5848
> URL: https://issues.jboss.org/browse/ISPN-5848
> Project: Infinispan
> Issue Type: Sub-task
> Reporter: Galder Zamarreño
> Assignee: Galder Zamarreño
> Fix For: 8.1.0.Final
>
>
> Neither WriteOnlyMap.evalAll() nor WriteOnlyMap.eval() generate listener events when removing entries.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 6 months
[JBoss JIRA] (ISPN-5848) WriteOnlyMap.evalAll and eval remove do not produce listener events
by Galder Zamarreño (JIRA)
[ https://issues.jboss.org/browse/ISPN-5848?page=com.atlassian.jira.plugin.... ]
Galder Zamarreño edited comment on ISPN-5848 at 10/12/15 4:01 AM:
------------------------------------------------------------------
The issue might be slightly different. The following does not work:
{code}
FunctionalMap.WriteOnlyMap<String, String> writeOnlyMap = ...
// `written` is a ReadEntryView of the written entry
try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
System.out.printf("Written (via onWrite): %s%n", written.find()))) {
Map<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
.thenAccept(ignore -> writeOnlyMap.eval("key1", view -> view.remove()))
.get(); // Wait for completable future
}
{code}
^ It prints:
{code}
Written (via onWrite): Optional[value1]
Written (via onWrite): Optional[value2]
{code}
Whereas this works:
{code}
FunctionalMap.WriteOnlyMap<String, String> writeOnlyMap = ...
// `written` is a ReadEntryView of the written entry
try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
System.out.printf("Written (via onWrite): %s%n", written.find()))) {
Map<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
.thenCompose(ignore -> writeOnlyMap.eval("key1", view -> view.remove()))
.get(); // Wait for completable future
}
{code}
^ This prints:
{code}
Written (via onWrite): Optional[value1]
Written (via onWrite): Optional[value2]
Written (via onWrite): Optional.empty
{code}
was (Author: galder.zamarreno):
The issue might be slightly different. The following does not work:
{code}
FunctionalMap.WriteOnlyMap<String, String> writeOnlyMap = ...
// `written` is a ReadEntryView of the written entry
try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
System.out.printf("Written (via onWrite): %s%n", written.find()))) {
Map<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
.thenAccept(ignore -> writeOnlyMap.eval("key1", view -> view.remove()))
.get(); // Wait for completable future
}
{code}
^ It prints:
{code}
Written (via onWrite): Optional[value1]
Written (via onWrite): Optional[value2]
{code}
Whereas this works:
FunctionalMap.WriteOnlyMap<String, String> writeOnlyMap = ...
// `written` is a ReadEntryView of the written entry
try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
System.out.printf("Written (via onWrite): %s%n", written.find()))) {
Map<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
.thenCompose(ignore -> writeOnlyMap.eval("key1", view -> view.remove()))
.get(); // Wait for completable future
}
{code}
^ This prints:
{code}
Written (via onWrite): Optional[value1]
Written (via onWrite): Optional[value2]
Written (via onWrite): Optional.empty
{code}
> WriteOnlyMap.evalAll and eval remove do not produce listener events
> -------------------------------------------------------------------
>
> Key: ISPN-5848
> URL: https://issues.jboss.org/browse/ISPN-5848
> Project: Infinispan
> Issue Type: Sub-task
> Reporter: Galder Zamarreño
> Assignee: Galder Zamarreño
> Fix For: 8.1.0.Final
>
>
> Neither WriteOnlyMap.evalAll() nor WriteOnlyMap.eval() generate listener events when removing entries.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 6 months
[JBoss JIRA] (ISPN-5850) Listener close might get ahead of last event
by Galder Zamarreño (JIRA)
Galder Zamarreño created ISPN-5850:
--------------------------------------
Summary: Listener close might get ahead of last event
Key: ISPN-5850
URL: https://issues.jboss.org/browse/ISPN-5850
Project: Infinispan
Issue Type: Sub-task
Reporter: Galder Zamarreño
Assignee: Galder Zamarreño
Fix For: 8.1.0.Final
In this example:
{code}
FunctionalMap.ReadOnlyMap<String, String> readOnlyMap = CreateFunctionalMaps.ro();
FunctionalMap.WriteOnlyMap<String, String> writeOnlyMap = CreateFunctionalMaps.wo();
FunctionalMap.ReadWriteMap<String, String> readWriteMap = CreateFunctionalMaps.rw();
// `written` is a ReadEntryView of the written entry
try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
System.out.printf("Written (via onWrite): %s%n", written.get()))) {
Map<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
.get(); // Wait for completable future
}
AutoCloseable writeCloseHandler = writeOnlyMap.listeners().add(new WriteListener<String, String>() {
@Override
public void onWrite(ReadEntryView<String, String> written) {
System.out.printf("Written (via add): %s%n", written.get());
}
});
CompletableFuture<Void> f0 = writeOnlyMap.eval("key1", view -> view.set("new-value1"));
CompletableFuture<Void> f1 = f0.thenAccept(ignore ->
writeOnlyMap.eval("key2", view -> view.set("new-value2")));
CompletableFuture<Void> f2 = f1.thenAccept(ignore -> {
try {
writeCloseHandler.close();
} catch (Exception e) {
e.printStackTrace(); // TODO: Customise this generated block
}
});
f2.get(); // Wait for completable future
{code}
The output is:
{code}
Written (via onWrite): value1
Written (via onWrite): value2
Written (via add): new-value1
{code}
Even though the listener is closed after the 2nd new value has been modified, it seems like the close might get ahead somehow.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 6 months
[JBoss JIRA] (ISPN-5849) AutoCloseable return from adding listeners can be clunky to use
by Galder Zamarreño (JIRA)
Galder Zamarreño created ISPN-5849:
--------------------------------------
Summary: AutoCloseable return from adding listeners can be clunky to use
Key: ISPN-5849
URL: https://issues.jboss.org/browse/ISPN-5849
Project: Infinispan
Issue Type: Sub-task
Reporter: Galder Zamarreño
Assignee: Galder Zamarreño
Fix For: 8.1.0.Final
On one side, to use it as a try-with-resource, you need to declare it right in the {{try()}};
{code}
try(AutoCloseable handler = writeOnlyMap.listeners().onWrite(written ->
System.out.printf("Written (via onWrite): %s%n", written.get()))) {
Map<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
writeOnlyMap.evalMany(entries, (v, writeView) -> writeView.set(v))
.get(); // Wait for completable future
}
{code}
So it's usability is mostly designed for unit tests since listeners tend to be set and removed at a later stage. IOW, listeners are not generally a short-lived object.
The other aspect that is clunky to use is the fact that AutoCloseable's close() throws Exception, which again makes it ackward to use for example if lambdas.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 6 months