From 06cb403feb8434502c3d4ad6edae0af2e9119476 Mon Sep 17 00:00:00 2001 From: Maksim Date: Mon, 9 Dec 2019 16:51:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=88=9B=E5=BB=BAsocket=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E9=87=8D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/socketio/DesignerSocketIO.java | 167 +++++++++++------- 1 file changed, 104 insertions(+), 63 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index e2b13b1ad..63bc3d999 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -13,7 +13,6 @@ import com.fr.report.RemoteDesignConstants; import com.fr.serialization.SerializerHelper; import com.fr.stable.ArrayUtils; import com.fr.third.apache.log4j.spi.LoggingEvent; -import com.fr.third.guava.base.Optional; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.base.WorkspaceConstants; @@ -36,28 +35,19 @@ public class DesignerSocketIO { Disconnecting } - private static Optional socketIO = Optional.absent(); + private static Socket socket = null; private static Status status = Status.Disconnected; + //维护一个当前工作环境的uri列表 + private static String[] uri; + //维护一个关于uri列表的计数器 + private static int count; - private static final Emitter.Listener printLog = new Emitter.Listener() { - @Override - public void call(Object... objects) { - if (ArrayUtils.isNotEmpty(objects)) { - try { - LoggingEvent event = SerializerHelper.deserialize((byte[]) objects[0]); - DesignerLogger.log(event); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - } - }; public static void close() { - if (socketIO.isPresent()) { + if (socket != null) { status = Status.Disconnecting; - socketIO.get().close(); - socketIO = Optional.absent(); + socket.close(); + socket = null; } } @@ -66,57 +56,42 @@ public class DesignerSocketIO { if (current.isLocal()) { return; } + //每当更换工作环境,更新uri列表,同时更新计数器count try { - String[] uri = getSocketUri(current); - socketIO = Optional.of(IO.socket(new URI(uri[0]))); - socketIO.get().on(WorkspaceConstants.WS_LOGRECORD, printLog); - socketIO.get().on(WorkspaceConstants.CONFIG_MODIFY, new Emitter.Listener() { - @Override - public void call(Object... objects) { - assert objects != null && objects.length == 1; - String param = (String) objects[0]; - EventDispatcher.fire(RemoteConfigEvent.EDIT, param); - } - }); - socketIO.get().on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { - @Override - public void call(Object... objects) { - /* - * todo 远程心跳断开不一定 socketio 断开 和远程紧密相关的业务都绑定在心跳上,切换成心跳断开之后进行提醒, - * socketio 只用推日志和通知配置变更 - */ - if (status != Status.Disconnecting) { - try { - UIUtil.invokeAndWaitIfNeeded(new Runnable() { - @Override - public void run() { - JOptionPane.showMessageDialog( - DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Basic_Remote_Disconnected"), - UIManager.getString("OptionPane.messageDialogTitle"), - JOptionPane.ERROR_MESSAGE, - UIManager.getIcon("OptionPane.errorIcon")); - EnvChangeEntrance.getInstance().chooseEnv(); - } - }); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - status = Status.Disconnected; - } - }); - socketIO.get().connect(); - status = Status.Connected; + uri = getSocketUri(); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + count = 0; + //建立socket并注册监听 + createSocket(); + } + + private static void createSocket(){ + //根据uri和计数器建立连接,并注册监听 + try { + if(count Date: Mon, 9 Dec 2019 20:12:37 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../socketio/DesignerSocketIOTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 designer-realize/src/test/java/com/fr/design/mainframe/socketio/DesignerSocketIOTest.java diff --git a/designer-realize/src/test/java/com/fr/design/mainframe/socketio/DesignerSocketIOTest.java b/designer-realize/src/test/java/com/fr/design/mainframe/socketio/DesignerSocketIOTest.java new file mode 100644 index 000000000..b775f56e9 --- /dev/null +++ b/designer-realize/src/test/java/com/fr/design/mainframe/socketio/DesignerSocketIOTest.java @@ -0,0 +1,60 @@ +package com.fr.design.mainframe.socketio; + +import com.fr.invoke.Reflect; +import com.fr.workspace.WorkContext; +import com.fr.workspace.Workspace; +import io.socket.client.IO; +import io.socket.client.Socket; + +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + + +/** + * @author: Maksim + * @Date: Created in 2019/12/9 + * @Description: + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({WorkContext.class,DesignerSocketIO.class, IO.class}) +public class DesignerSocketIOTest { + + @Test + public void close() throws Exception { + this.update(); + DesignerSocketIO.close(); + DesignerSocketIO.Status status = Reflect.on(DesignerSocketIO.class).field("status").get(); + Socket socket = Reflect.on(DesignerSocketIO.class).field("socket").get(); + + Assert.assertEquals(DesignerSocketIO.Status.Disconnecting,status); + Assert.assertNull(socket); + } + + @Test + public void update() throws Exception { + Workspace current = EasyMock.mock(Workspace.class); + EasyMock.expect(current.isLocal()).andReturn(false); + + PowerMock.mockStatic(WorkContext.class); + EasyMock.expect(WorkContext.getCurrent()).andReturn(current); + + String[] uri = {"http://127.0.0.1:8888/workspace","http://127.0.0.1:9999/workspace"}; + PowerMock.mockStaticPartial(DesignerSocketIO.class,"getSocketUri"); + PowerMock.expectPrivate(DesignerSocketIO.class,"getSocketUri").andReturn(uri); + + EasyMock.replay(current); + PowerMock.replayAll(); + + DesignerSocketIO.update(); + DesignerSocketIO.Status status = Reflect.on(DesignerSocketIO.class).field("status").get(); + Socket socket = Reflect.on(DesignerSocketIO.class).field("socket").get(); + + Assert.assertEquals(DesignerSocketIO.Status.Connected,status); + Assert.assertNotNull(socket); + } +} \ No newline at end of file