You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@plc4x.apache.org by "cptjackwu (via GitHub)" <gi...@apache.org> on 2023/11/07 02:38:44 UTC
[I] PLCJ-0.10.0 Concurrency problem : RequestTransactionManager workLog.remove()
cptjackwu opened a new issue, #1191:
URL: https://github.com/apache/plc4x/issues/1191
### What happened?
private void processWorklog() {
while (runningRequests.size() < getNumberOfConcurrentRequests() && !workLog.isEmpty()) {
RequestTransaction next = workLog.remove();
this.runningRequests.add(next);
Future<?> completionFuture = executor.submit(next.operation);
next.setCompletionFuture(completionFuture);
}
}
RequestTransactionManager workLog.remove()
When I write a connection to multiple points at the same time, each point is written once a second, there is a concurrency problem, this time the content in the worklog is empty, and the error is reported when remove
===============================================================
static Map<String, Boolean> map = new HashMap<>();
static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors() * 2);
public static void main(String[] args) throws Exception{
PlcClient plcClient = new S7Client("s7://**.**.*.***");
plcClient.connect();
Map m1 = new HashMap();
m1.put("stationCode","OP010");
m1.put("address","%DB1150:0.0:BOOL");
Map m2 = new HashMap();
m2.put("stationCode","OP020");
m2.put("address","%DB1100:0.0:BOOL");
Map m3 = new HashMap();
m3.put("stationCode","OP030");
m3.put("address","%DB1200:0.0:BOOL");
List<Map> mapList = Stream.of(m1,m2,m3).collect(Collectors.toList());
mapList.forEach(v->
executorService.scheduleAtFixedRate(()-> {
boolean value = map.get(v.get("stationCode")) == null ? true : map.get(v.get("stationCode"));
plcClient.writeBOOL(new NodeId((String) v.get("address"), value));
map.put((String) v.get("stationCode"), !value);
},0, 1000, TimeUnit.MILLISECONDS)
);
====================================================================================
The error content is as follows:
2023-11-03 00:20:25.432 WARN 7 --- [ nioEventLoopGroup-9-1] io.netty.channel.DefaultChannelPipeline : An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.codec.DecoderException: java.util.NoSuchElementException
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:98)
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.NoSuchElementException: null
at java.util.AbstractQueue.remove(AbstractQueue.java:117)
at org.apache.plc4x.java.spi.transaction.RequestTransactionManager.processWorklog(RequestTransactionManager.java:104)
at org.apache.plc4x.java.spi.transaction.RequestTransactionManager.endRequest(RequestTransactionManager.java:133)
at org.apache.plc4x.java.spi.transaction.RequestTransactionManager.access$200(RequestTransactionManager.java:46)
at org.apache.plc4x.java.spi.transaction.RequestTransactionManager$RequestTransaction.endRequest(RequestTransactionManager.java:160)
at org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic.lambda$readInternal$18(S7ProtocolLogic.java:272)
at org.apache.plc4x.java.spi.Plc4xNettyWrapper.decode(Plc4xNettyWrapper.java:187)
at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:88)
... 23 common frames omitted
So, How do I fix that concurrent problem
### Version
v0.10.0
### Programming Languages
- [X] plc4j
- [ ] plc4go
- [ ] plc4c
- [ ] plc4net
### Protocols
- [ ] AB-Ethernet
- [ ] ADS /AMS
- [ ] BACnet/IP
- [ ] CANopen
- [ ] DeltaV
- [ ] DF1
- [ ] EtherNet/IP
- [ ] Firmata
- [ ] KNXnet/IP
- [ ] Modbus
- [ ] OPC-UA
- [X] S7
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@plc4x.apache.org.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] PLCJ-0.10.0 Concurrency problem : RequestTransactionManager workLog.remove()
Posted by "cptjackwu (via GitHub)" <gi...@apache.org>.
cptjackwu commented on issue #1191:
URL: https://github.com/apache/plc4x/issues/1191#issuecomment-1802086524
I have changed workLog.remove(); to workLog.poll(), and then judged it and solved the problem。
private void processWorklog() {
while (runningRequests.size() < getNumberOfConcurrentRequests() && !workLog.isEmpty()) {
RequestTransaction next = workLog.poll();
if(next!-null){
this.runningRequests.add(next);
Future<?> completionFuture = executor.submit(next.operation);
next.setCompletionFuture(completionFuture);
}
}
}
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@plc4x.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] PLCJ-0.10.0 Concurrency problem : RequestTransactionManager workLog.remove()
Posted by "splatch (via GitHub)" <gi...@apache.org>.
splatch commented on issue #1191:
URL: https://github.com/apache/plc4x/issues/1191#issuecomment-1802760205
the worklog processing changes were integrated at some point of time. If you are running 0.10 (which is over year old) you might need to backport fixes from 0.11 release.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@plc4x.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] PLCJ-0.10.0 Concurrency problem : RequestTransactionManager workLog.remove()
Posted by "cptjackwu (via GitHub)" <gi...@apache.org>.
cptjackwu closed issue #1191: PLCJ-0.10.0 Concurrency problem : RequestTransactionManager workLog.remove()
URL: https://github.com/apache/plc4x/issues/1191
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@plc4x.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] PLCJ-0.10.0 Concurrency problem : RequestTransactionManager workLog.remove()
Posted by "chrisdutz (via GitHub)" <gi...@apache.org>.
chrisdutz commented on issue #1191:
URL: https://github.com/apache/plc4x/issues/1191#issuecomment-1798201335
Admittedly I habe absolutely no idea what you are doing ... it looks as if you're trying to write something to a number of S7 devices. Well we definitely don't support that type of operation in PLC4X ... if you've implemented something fancy inside S7Client, I can't tell you what's going wrong without the full code.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@plc4x.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org