如何在 JPOS QServer 侦听器中 @autowired spring bean?
How to @autowired spring beans in JPOS QServer listener?
我们正在 运行ning spring 启动应用程序。在 Spring 启动后,我们尝试 运行 JPOS QServer。它启动了 Q2,我们可以从模拟器 clinet 接收 ISOmsgs,我们也可以响应。
为了启动 Q2,我们使用了 xml 配置,如下所示。
<server class="org.jpos.q2.iso.QServer" name="Server-A-Server" logger="Q2">
<attr name="port" type="java.lang.Integer">8118</attr>
<attr name="maxSessions" type="java.lang.Integer">100</attr>
<attr name="minSessions" type="java.lang.Integer">0</attr>
<!-- Format server name: "Project Name" + "-" + "Channel" -->
<channel name="Server-A-Channel" class="org.jpos.iso.channel.XMLChannel" logger="Q2"
packager="org.jpos.iso.packager.XMLPackager">
</channel>
<request-listener class="fi.neocard.jpos.ISOMessageListener">
<property name="timeout" value="10000"/>
</request-listener>
正如你从上面的 xml 看到的,它监听 ISOMessangerListener class,这自然与 spring 无关 class,而且我认为 spring 和 QServer在不同的 Servlet 上 运行ning。所以问题来了,我们这里没有任何 Spring 相关的 bean,我们不能 @Autowired 任何。但是我们所有的业务逻辑都已经写在spring里面了。
到目前为止我们尝试了什么
1) 保持应用程序上下文静态并在 ISOMessageListener 中需要时使用它(在接收到侦听器的消息后上下文为空失败)。
2) 做这样的事情。 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
并阅读了很多关于如何从 spring 之外获取上下文的文章。
到目前为止,我通过 jvisualvm
确认 Q2 和 Springboot 都 运行ning 作为一个应用程序。
希望至少能得到一些建议。
如果有人对我的工作方式感兴趣,我只是在 spring 已经启动时手动完成,而不是 运行 ISOServer 通过 Q2(xml 文件)然后获取已经存在的 ISORequestListener bean 并将其传递给服务器。
@Component
public class ISOserver implements ISORequestListener {
@Autowired
ISOserver isOserver;
@EventListener(ContextRefreshedEvent.class)
public void contextRefreshedEvent() throws Exception{
Logger logger = new Logger();
logger.addListener(new SimpleLogListener(System.out));
ServerChannel channel = new XMLChannel(new XMLPackager());
((LogSource) channel).setLogger(logger, "channel");
ISOServer isoServer = new ISOServer(8118, channel, null);
isoServer.setLogger(logger, "server");
isoServer.addISORequestListener(isOserver);
new Thread(isoServer).start();
}
@Override
public boolean process(ISOSource isoSource, ISOMsg receivedISOmsg) {
return false;
}
}
我们正在 运行ning spring 启动应用程序。在 Spring 启动后,我们尝试 运行 JPOS QServer。它启动了 Q2,我们可以从模拟器 clinet 接收 ISOmsgs,我们也可以响应。
为了启动 Q2,我们使用了 xml 配置,如下所示。
<server class="org.jpos.q2.iso.QServer" name="Server-A-Server" logger="Q2">
<attr name="port" type="java.lang.Integer">8118</attr>
<attr name="maxSessions" type="java.lang.Integer">100</attr>
<attr name="minSessions" type="java.lang.Integer">0</attr>
<!-- Format server name: "Project Name" + "-" + "Channel" -->
<channel name="Server-A-Channel" class="org.jpos.iso.channel.XMLChannel" logger="Q2"
packager="org.jpos.iso.packager.XMLPackager">
</channel>
<request-listener class="fi.neocard.jpos.ISOMessageListener">
<property name="timeout" value="10000"/>
</request-listener>
正如你从上面的 xml 看到的,它监听 ISOMessangerListener class,这自然与 spring 无关 class,而且我认为 spring 和 QServer在不同的 Servlet 上 运行ning。所以问题来了,我们这里没有任何 Spring 相关的 bean,我们不能 @Autowired 任何。但是我们所有的业务逻辑都已经写在spring里面了。
到目前为止我们尝试了什么
1) 保持应用程序上下文静态并在 ISOMessageListener 中需要时使用它(在接收到侦听器的消息后上下文为空失败)。
2) 做这样的事情。 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
并阅读了很多关于如何从 spring 之外获取上下文的文章。
到目前为止,我通过 jvisualvm
确认 Q2 和 Springboot 都 运行ning 作为一个应用程序。
希望至少能得到一些建议。
如果有人对我的工作方式感兴趣,我只是在 spring 已经启动时手动完成,而不是 运行 ISOServer 通过 Q2(xml 文件)然后获取已经存在的 ISORequestListener bean 并将其传递给服务器。
@Component
public class ISOserver implements ISORequestListener {
@Autowired
ISOserver isOserver;
@EventListener(ContextRefreshedEvent.class)
public void contextRefreshedEvent() throws Exception{
Logger logger = new Logger();
logger.addListener(new SimpleLogListener(System.out));
ServerChannel channel = new XMLChannel(new XMLPackager());
((LogSource) channel).setLogger(logger, "channel");
ISOServer isoServer = new ISOServer(8118, channel, null);
isoServer.setLogger(logger, "server");
isoServer.addISORequestListener(isOserver);
new Thread(isoServer).start();
}
@Override
public boolean process(ISOSource isoSource, ISOMsg receivedISOmsg) {
return false;
}
}